A, 버즈, C, D, E, 피즈, G


14

문자열을 사용하는 간단한 FizzBuzz.

주어진

  • 1 단어 또는 문구 (문자열)
  • 2 개의 독특한 캐릭터

산출

첫 번째 문자가 나타날 때마다 단어 나 문구가 fizz로 바뀌고 두 번째 문자가 각각 버즈로 바뀝니다.

규칙

  • 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

이것은 코드 골프이므로 가장 짧은 코드 (바이트)가 이깁니다!

노트

줄 바꾸기 사례 (This Is SPARTA!)를 기술적으로 처리하는 것은 어려운 일 중 하나입니다. 그러나 일부 언어에서는 매우 어렵거나 불가능하기 때문에 포함하지 않은 대답은 무효화하지 않습니다.


2
you must match the case of the replaced character그리고 Input is not case sensitive서로 모순되는 것처럼 보인다.
Greg Martin

@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

파이썬 (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))

이것은 파이썬 3에서 Stephen 의 대답에 대한 골프 버전입니다. 이것은 바이트의 42 %를 잘라 냅니다. 파이썬 2는 인쇄물에 1 바이트를 절약 할 수 있지만 이는 진전 가격입니다. 이것은 개행을 올바르게 처리합니다.

입력시 8 바이트를 절약 한 Blckknight에게 감사드립니다.


1
fileinput사용되는 모듈 은 무엇입니까 ?
caird coinheringaahing

@ValyrioAccount, fileinput.input 은 내장 입력 방법을 대체합니다. 개행으로 입력을 가능하게합니다.
벤 프랭클

2
어떻 from sys import*s,a,b=J(stdin).split(', ')몇 가지 문자를 저장할?
Blckknght

4

파이썬, 109 바이트

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

온라인으로 사용해보십시오!


두 문자를 단일 문자열로 사용

편집 : TIO 링크에 테스트 케이스를 추가했습니다. 개행도 작동합니다.


2

파이썬 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 / 옥타브 , 106 (102) 111 바이트

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

이것은 아마도 더 최적화 될 수 있습니다.

간단한 정규식 교체를 사용합니다. 그러나 입력 문자를 먼저 숫자로 바꾸면 중간 단계가 필요합니다. 두 번째 입력이 편지에 포함 된 대체 할 경우에 그래서 즉 Fizz는 것을 Fizz다음 정규식을 수행 할 때 다음 대체되지 않습니다.

이것은 물론 입력에 숫자가 없다고 가정합니다. 그러나 질문에 따르면 입력은 단어 또는 문구라고 말하면 이것이 수용 가능한 가정이라고 생각합니다.

코드는 입력의 새 줄을 올바르게 처리합니다.

온라인으로 사용해 볼 수 있습니다!


2

배쉬 4.4 + GNU는 나오지도 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=echoBash 4.3 이하 버전에서 참조하면 분명히 버전 TIO가 사용하고 있습니다. 따라서 더 길고 동등한 Bash 4.3 코드는 테스트를 위해 아래 TIO 테스트 스위트에 제공됩니다. 이것은 모든 테스트 사례를 통과하므로 훌륭합니다.

온라인으로 사용해보십시오!


@thedarkwanderer 이제해야합니다. 수정하는 데 시간이 조금 걸렸습니다.
R. Kap

2

자바 스크립트 (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

테스트 스위트 .


2
문자 중 하나 인 "Hl", Hello대문자는 문제를 일으키는 것으로 보입니다 . 출력을 올바르게 대문자로 표시 "hL", Hello하지 않고 ls를 대체하지 않습니다 .
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 정규식 이 욕심 많기 때문 입니다. 대체해야 할 현재 문자가 문자가 아닌 경우 (소문자 없음), 소문자 문자열이 필요합니다 (마지막 일치).

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

하스켈, 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)

rfizz 및 buzz 문자를 첫 번째 인수로 2 요소 목록으로, 입력 문자열을 두 번째 인수로 사용합니다. 줄 바꿈과 유니 코드는 적절하게 처리되어야하지만 함수는 불행히도 총계가 아닙니다 (잘못된 입력이 5 바이트를 절약 할 수 있음).


u=Data.Char.toUpper내가 아는 한 ghci에서만 작동합니다. 표준 Haskell에서는 import. 그러나 =<<대신을 사용하여 일부 바이트를 저장할 수 있어야합니다 concatMap.
Laikoni

0

수학, 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.