A, Buzz, C, D, E, Fizz, G


14

FizzBuzz ง่าย ๆ โดยใช้สตริง

ป.ร. ให้ไว้

  • 1 คำหรือวลี (สตริง)
  • 2 ตัวละครที่ไม่ซ้ำกัน

เอาท์พุต

คำหรือวลีที่มีการเกิดขึ้นของอักขระตัวแรกที่ถูกแทนที่ด้วย fizz และตัวละครที่สองแต่ละตัวถูกแทนที่ด้วย buzz

กฎระเบียบ

  • ตัวอักษรตัวแรกในทั้ง Fizz และ Buzz จะต้องเป็นตัวพิมพ์ใหญ่
  • สำหรับคำอื่น ๆ ที่เป็นฟองและเสียงพึมพำคุณจะต้องตรงกับตัวพิมพ์ใหญ่ของอักขระที่ถูกแทนที่ (หากไม่มีตัวพิมพ์เล็กและตัวพิมพ์เล็ก)
  • หากอักขระที่กำหนดไม่ได้อยู่ในวลีให้ส่งข้อความต้นฉบับ

กรณีทดสอบ

Given: Hello, h, l
Output: FIZZeBuzzBuzzo

Given: test, a, b
Output: test

Given: PCG rocks!,  , !
PCGFizzrocksBuzz

Given: This
Is
SPARTA!, 
, S
Output: ThiBuzzFizzIBuzzFizzBUZZPARTA!

Given: FizzBuzz, a, b
Output: FizzBUZZuzz

นี่คือโค้ดกอล์ฟดังนั้นโค้ดที่สั้นที่สุดเป็นไบต์ชนะ!

บันทึก

การจัดการเคส newline ในทางเทคนิค (นี่คือสปาร์ต้า!) เป็นส่วนหนึ่งของความท้าทาย อย่างไรก็ตามฉันจะไม่ทำให้คำตอบเป็นโมฆะเพราะไม่ได้รวมไว้เพราะมันท้าทายมากหรือเป็นไปไม่ได้ในบางภาษา


2
you must match the case of the replaced characterและInput is not case sensitiveดูเหมือนจะขัดแย้งกัน
เกร็กมาร์ติน

@ GregMartin อาขอบคุณฉันพยายามพูดว่า 2 ตัวอักษรที่เป็นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ (เช่น A หมายถึง a)
GracefulLemming

1
ThiBuzzFizzIBuzzFizzBUZZPARTAไม่มีเครื่องหมายอัศเจรีย์สุดท้าย
Arnauld

เราควรสนับสนุนอินพุตเช่นaa, a, f? สิ่งที่จะเป็นผลลัพธ์ที่คาดหวัง BUZZizzBUZZizz, FizzFizzหรือทั้งสองอย่างอนุญาตตามตัวเลือกของเรา?
Arnauld

@Amauld FizzFizzจากกรณีทดสอบที่ผ่านมาผมว่ามันควรเอาท์พุท
คดีของกองทุนโมนิกา

คำตอบ:


2

เยลลี่ 34 ไบต์

Œl=€⁹Œl¤ȧ€"“¡Ṭ4“Ụp»o"/ȯ"Œu⁹Œln$T¤¦

ลองออนไลน์!

อย่างไร?

Œl=€⁹Œl¤ȧ€"“¡Ṭ4“Ụp»o"/ȯ"Œu⁹Œln$T¤¦ - Main link: characters, string
Œl                                 - lowercase the characters
       ¤                           - nilad followed by link(s) as a nilad:
    ⁹                              -     right argument, the string
     Œl                            -     lowercase
  =€                               - equals (vectorises) for €ach (a list of 2 lists that identify the indexes of the string matching the characters regardless of case)
           “¡Ṭ4“Ụp»                - dictionary strings ["Fizz", "Buzz"]
          "                        - zip with
        ȧ€                         -     logical and (non-vectorising) for €ach (replace the 1s with the words)
                     /             - reduce with:
                    "              -     zip with:
                   o               -         logical or (vectorises) (make one list of zeros and the words)
                                   - implicit right argument, string
                       "           - zip with:
                      ȯ            -     logical or (non-vectorising) (replace the zeros with the original characters from the string)
                                 ¦ - apply...
                        Œu         -     uppercase
                                   - ...to the indexes (the words at indexes):
                                ¤  -     nilad followed by link(s) as a nilad:
                          ⁹        -         right argument, the string
                              $    -         last two links as a monad (i.e. the string on both sides):
                           Œl      -             lowercase
                             n     -             not equals (vectorises)
                               T   -         truthy indexes (the indexes of the capital letters in the string)

+1 ขอขอบคุณที่ใช้กรณีขึ้นบรรทัดใหม่ นี่เป็นครั้งแรกที่การส่งที่ถูกต้องทั้งหมด
GracefulLemming

6

Python 3 , 180 174 168 160 152 ไบต์

from sys import*
J=''.join
L=str.lower
s,a,b=J(stdin).split(', ')
print(J('FBFBiuIUzzZZzzZZ'[L(k)==L(b)::2][k!=L(k)::2]*(L(k)in L(a+b))or k for k in s))

นี่เป็นเพียงคำตอบของสตีเฟ่นรุ่นที่ตีกอล์ฟมากขึ้นใน Python 3 ชิปนี้มีจำนวน 42% ของจำนวนไบต์ Python 2 จะช่วยประหยัดหนึ่งไบต์ในการพิมพ์ แต่นั่นคือราคาของความคืบหน้า สิ่งนี้จะจัดการกับการขึ้นบรรทัดใหม่อย่างถูกต้อง

ขอบคุณ Blckknight สำหรับการบันทึกข้อมูล 8 ไบต์บนอินพุต


1
เป็นสิ่งที่fileinputโมดูลใช้?
caird coinheringaahing

@ValyrioAccount, fileinput.inputจะแทนที่วิธีป้อนข้อมูลในตัว ช่วยให้อินพุตกับบรรทัดใหม่
Ben Frankel

2
วิธีการเกี่ยวกับfrom sys import*และs,a,b=J(stdin).split(', ')บันทึกตัวละครไม่กี่?
Blckknght

4

Python 109 ไบต์

lambda s,w:"".join([c,"Fizz","Buzz","BUZZ","FIZZ"][-~w.lower().find(c.lower())*-~(-2*c.isupper())]for c in s)

ลองออนไลน์!


ใช้อักขระสองตัวเป็นสตริงเดียว

แก้ไข: เพิ่ม testcase ไปที่ลิงก์ TIO ขึ้นบรรทัดใหม่ก็ทำงานได้เช่นกัน


2

Python 2 , 271 , 261 ไบต์

import fileinput as f
a=''
for m in f.input():a+=m
a=a.split(', ')
l=L=list(a[0])
for i in range(0,len(a[0])):
 j,k=l[i].lower(),l[i].istitle()
 if j==a[1].lower():
  L[i]='FIZZ'if k else'Fizz'
 elif j==a[2].lower():
  L[i]='BUZZ'if k else'Buzz'
print''.join(L)

ลองออนไลน์!

ว้าวอันนี้เป็น doozie! ปรากฎว่าหลามไม่ยอมรับอินพุตหลายบรรทัดดังนั้นจึงfileinputต้องใช้งาน

แก้ไข: ควรผ่านทุกกรณีตอนนี้ :)


+1 ที่ชัดเจนสำหรับการจัดการเคสด้วยบรรทัดใหม่! มีไม่มากที่สามารถรวมสิ่งนั้นได้
GracefulLemming

คุณสามารถประหยัดได้ 3 ไบต์ด้วยการทำสิ่งต่าง ๆ เช่นimport fileinput as f...for m in f.input():
GracefulLemming

@Caleb ขอบคุณสำหรับคำแนะนำ! มันควรผ่านการทดสอบทั้งหมดตอนนี้
Stephen

2

MATLAB / Octave , 106 102 111 ไบต์

@(a,b,c)regexprep(a,num2cell([lower([b c]) upper([b c]) '1234']),{'2','4','1','3','FIZZ','Fizz','BUZZ','Buzz'})

อาจปรับให้เหมาะสมต่อไปได้

มันใช้การแทนที่ Regex ง่าย ๆ อย่างไรก็ตามจำเป็นต้องใช้ขั้นตอนกลางโดยแทนที่อักขระอินพุตด้วยตัวเลขก่อน นี่คือเพื่อที่ว่าถ้าหากมีการใส่ตัวอักษรตัวที่สองในอินพุทFizzนั้นFizzจะไม่ถูกแทนที่เมื่อทำการ regex ครั้งต่อไป

แน่นอนว่าไม่มีตัวเลขในอินพุต อย่างไรก็ตามจากคำถามที่กล่าวว่าการป้อนข้อมูลเป็นคำหรือวลีที่ฉันรู้สึกว่านี่เป็นสมมติฐานที่ยอมรับได้

รหัสจะจัดการบรรทัดใหม่ในอินพุตได้อย่างถูกต้อง

คุณสามารถลองออนไลน์ได้!


2

Bash 4.4 + GNU sed, 70 228 222 227 ไบต์

IFS=;alias e=echo;K=`sed $([[ $2 != '
' ]]&&e "s/${2,}/Fizz/g;s/${2^}/FIZZ/g"||:)$([[ $3 != '
' ]]&&e ";s/${3,}/Buzz/g;s/${3^}/BUZZ/g"||:)<<<"$1"`;[[ $2 = '
'||$3 = '
' ]]&&e ${K//$'\n'/`[[ $2 = '
' ]]&&e Fizz||e Buzz`}||e "$K"

เห็นได้ชัดว่าalias e=echoเกิดข้อผิดพลาดหากอ้างอิงใน Bash 4.3 หรือต่ำกว่ารุ่น TIO ใช้งานอยู่ ดังนั้นรหัส Bash 4.3 ที่ยาวและเทียบเท่าจะได้รับในชุดทดสอบ TIO ด้านล่างเพื่อการทดสอบ กรณีนี้ผ่านการทดสอบทั้งหมดดังนั้นจึงเป็นเรื่องดี

ลองออนไลน์!


@tharkarkwanderer ตอนนี้ก็ควร ขออภัยที่ต้องใช้เวลานานในการแก้ไข
R. Kap

2

JavaScript (ES6), 92 ไบต์

รับอินพุตเป็นสตริงและอาร์เรย์ของอักขระสองตัว รองรับการขึ้นบรรทัดใหม่

f=(s,[a,b],r='Fizz')=>a?f(s.replace(RegExp(a,'gi'),m=>m<'a'?r.toUpperCase():r),[b],'Buzz'):s

กรณีทดสอบ


1

Pyth - 25 ไบต์

sXzsrBQ1scL2rB"FizzBuzz"1

Test Suite


2
ตัวพิมพ์ใหญ่หนึ่งในตัวละครดูเหมือนว่าจะก่อให้เกิดปัญหา - "Hl", Helloไม่ใช้ประโยชน์จากผลลัพธ์ที่ถูกต้องและ"hL", Helloไม่แทนที่ตัวพิมพ์lใหญ่
Jonathan Allan

1

GNU sed , 135 + 1 (แฟล็ก r) = 136 ไบต์

โดยค่าเริ่มต้นสคริปต์ sed จะถูกดำเนินการหลายครั้งตามที่มีบรรทัดอินพุต ในการจัดการอินพุตแบบหลายบรรทัดฉันใช้ลูปเพื่อต่อท้ายบรรทัดที่เหลือทั้งหมดที่เป็นไปได้ไปยังบรรทัดแรกโดยไม่ต้องเริ่มรอบใหม่

:r
$!N
$!br
s:, (.), (.):;\u\1FIZZ;\l\1Fizz;\u\2BUZZ;\l\2Buzz:
s:^:,:
:
s:,(.)(.*;\1)(...)(.):\3,\4\2\3\4:
s:,(.):\1,:
/,;.F/!t
s:,.*::

ลองออนไลน์!

ตารางการแทนที่ที่ใช้ในบรรทัดที่ 4 จำเป็นต้องอยู่ในลำดับที่แน่นอนเช่น 'Fizz' และ 'Buzz' หลังจากฟอร์มตัวพิมพ์ใหญ่ นี่เป็นเพราะ sed regex ที่.*ใช้ระหว่างการค้นหาตารางเป็นโลภ หากอักขระปัจจุบันที่จำเป็นต้องเปลี่ยนไม่ใช่ตัวอักษร (ไม่มีกรณี) ดังนั้นสตริงตัวพิมพ์เล็กจำเป็นต้องใช้ (จับคู่สุดท้าย)

เนื่องจาก sed ไม่มีประเภทข้อมูลฉันจึงใช้ตัวคั่นอักขระเพื่อย้ำสตริง มันจะทำเครื่องหมายตำแหน่งปัจจุบันของฉันและในวงฉันเลื่อนจากซ้ายไปขวา โชคดีที่ฉันสามารถใช้,สิ่งนี้เพราะมันเป็นตัวคั่นข้อมูลอินพุต

คำอธิบาย:

:r                                                 # reading loop
$!N                                                # append next input line
$!br                                               # repeat till EOF
s:, (.), (.):;\u\1FIZZ;\l\1Fizz;\u\2BUZZ;\l\2Buzz: # create replacement table
s:^:,:                                             # append my string delimiter
:                                                  # main loop
s:,(.)(.*;\1)(...)(.):\3,\4\2\3\4:                 # apply char replacement, if any
s:,(.):\1,:                                        # shift delimiter to right
/,;.F/!t                                           # repeat till end of string
s:,.*::                                            # print only the final string

0

Haskell, 114 ไบต์

u=Data.Char.toUpper
p[f,b]x|f==u x="Fizz"|b==u x="Buzz"|2>1=[x]
q x y|u y<y=x|2>1=u<$>x
r x=concatMap$q=<<p(u<$>x)

rใช้อักขระ fizz และ buzz เป็นรายการองค์ประกอบ 2 เป็นอาร์กิวเมนต์แรกและสตริงอินพุตเป็นอาร์กิวเมนต์ที่สอง บรรทัดใหม่และ unicode ควรได้รับการจัดการอย่างเหมาะสมถึงแม้ว่าฟังก์ชั่นจะไม่ได้รวมอย่างน่าเสียดาย


u=Data.Char.toUpperทำงานใน ghci เท่าที่ฉันรู้เท่านั้น ในมาตรฐาน Haskell importที่คุณต้องการ แต่คุณควรจะสามารถที่จะบันทึกไบต์บางอย่างโดยใช้แทน=<< concatMap
Laikoni

0

Mathematica, 94 ไบต์

a=ToLowerCase;b=ToUpperCase;StringReplace@{a@#->"Fizz",b@#->"FIZZ",a@#2->"Buzz",b@#2->"BUZZ"}&

ฟังก์ชั่นไม่ระบุชื่อ รับสองสตริงเป็นอินพุตและส่งคืนฟังก์ชันซึ่งรับสตริงเป็นอินพุตและส่งคืนสตริงเป็นเอาต์พุตเป็นเอาต์พุต จะต้องถูกเรียกในรูปแบบprog["c1", "c2"]["s"]โดยที่"s"สตริงเป้าหมายและ"c1"และ"c2"เป็นอักขระสองตัว อาจจะเล่นกอล์ฟต่อไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.