"BizzFuzz"프로그램 구축


17

전통적인 FizzBuzz에서는 1에서 100까지의 숫자를 인쇄하라는 메시지가 표시되지만 3의 배수는 모두 "Fizz"로, 5의 배수는 "Buzz"로, 3과 5의 배수 (예 : 15)는 " FizzBuzz ".

그러나 사악한 면접관으로서, 나는 자신의 꼬인 버전의 FizzBuzz를 발명했습니다.이 버전은 BizzFuzz의 이름을 지정하고 코딩 인터뷰에서 귀하에게 제공하기로 결정했습니다.

게임의 규칙은 다음과 같습니다.

  • 아래 조건 중 하나에 해당하는 경우를 제외하고 1에서 100까지 각 숫자를 인쇄하십시오.

    • 숫자를 4로 나눌 수 있으면 "Fizz"를 인쇄하십시오.
    • 숫자를 5로 나눌 수 있으면 "버즈"를 인쇄하십시오.

    • 숫자를 4로 나눌 수 있지만 바로 뒤에 숫자 를 5로 나눌 수 있으면 "Fizz"대신 "FizzBuzz"를 인쇄하고 다음 숫자를 정기적으로 인쇄하십시오.

    • 숫자를 5로 나눌 수 있지만 바로 다음 숫자 를 4로 나눌 수 있으면 "Buzz"대신 "BuzzFizz"를 인쇄하고 다음 숫자를 정기적으로 인쇄하십시오.

    • 숫자가 4와 5로 나눌 수있는 숫자 바로 앞에 있으면 "Bizz"를 인쇄하십시오.

    • 숫자가 4와 5로 나눌 수있는 숫자 바로 뒤에 있으면 "Fuzz"를 인쇄하십시오.

    • 숫자를 4와 5로 나눌 수 있으면 "BizzFuzz"를 인쇄하십시오.

모든 언어에서 이러한 모든 규칙을 구현하는 가장 짧은 코드가 우선합니다.

답변:


4

GolfScript ( 83 80 자)

(의견에 대한 NB Howard의 제안은 78 자로 줄이지 만 일부 줄에는 후행 공백이 있음).

이것은 문자를 사용 \0하므로 xxd 형식입니다.

0000000: 3130 302c 7b29 2e32 3025 2742 6946 750a  100,{).20%'BiFu.
0000010: 0046 750a 0000 0046 6942 750a 0000 0000  .Fu....FiBu.....
0000020: 4669 0a00 0042 750a 0000 4669 0a00 0000  Fi...Bu...Fi....
0000030: 4275 4669 0a00 0000 0042 690a 2731 2c2f  BuFi.....Bi.'1,/
0000040: 3d32 2f27 7a7a 272a 5c6e 2b6f 727d 2f0a  =2/'zz'*\n+or}/.

및 base64 :

MTAwLHspLjIwJSdCaUZ1CgBGdQoAAABGaUJ1CgAAAABGaQoAAEJ1CgAARmkKAAAAQnVGaQoAAAAA
QmkKJzEsLz0yLyd6eicqXG4rb3J9Lwo=

사용 ^ 대한의 독립-A로 \0, 그건

100, {). 20 % 'BiFu
 ^ Fu
 ^ ^ ^ FiBu
 ^ ^ ^ ^ Fi
 ^ ^ Bu
 ^ ^ Fi
 ^ ^ ^ BuFi
 ^ ^ ^ ^ Bi
'1, / = 2 /'zz '* \ n + or} /

여전히 흥미로운 문제는 아닙니다.


설명이 요청되었습니다.

값이 들어 0하는 99포괄적으로 :

100,{
...
}/

(우리가 원하는 값을 증가 1100) 또한 증가 된 값이 무엇인지 찾을 수 있습니다 mod 20:

).20%

캐릭터 주위에 마법의 줄을 나누십시오 \0.

MAGIC_STRING 1,/

해당 배열 의 ( x mod 20) 번째 요소를 가져 와서 2 문자 청크로 나눈 다음와 같이 다시 붙입니다 zz. 참고 : 문자열은 비어 있거나 (이 경우 청크가 없으므로 빈 문자열로 끝납니다) [BF][iu]접두사 시퀀스와 줄 바꿈이 차례로 나타납니다.

=2/'zz'*

스택에 보관 한 증가 된 숫자의 다른 사본을 가져와 줄 바꿈을 추가하십시오. 이제 우리가 유지하는 문자열은 개행으로 끝납니다.

\n+

폴백 작업을 적용하십시오. (이것은 ||JavaScript 또는 COALESCESQL 과 유사합니다 ).

or

@minitech, 오타는 모든 것을 다시 들여 쓰는 것이 목에 통증이 있기 때문에 복사 붙여 넣기를 사용하지 않음으로써 소개되었습니다. 결정된.
피터 테일러

2
다시 들여 모든 CTRL + K를 =
존 드보락에게

이것을 설명 할 수 있습니까?
Johannes Kuhn

"매우 흥미로운 문제는 아닙니다." 예, 게시했을 때의 직감이있었습니다. 여전히 변형입니다.
Joe Z.

또한 프로그래밍 도전보다는 친구와의 팔러 게임으로 더 흥미로워집니다. 차례 대로 숫자 를 하려고 노력하십시오 . 시퀀스를 미리 기억하지 않으면 기본적으로 FizzBuzz Hardcore Edition입니다.
Joe Z.

13

파이썬, 114

a='Fizz'
b='Buzz'
c='Bizz'
d='Fuzz'
e=c+d
f=a+b
g=b+a
i=1
exec"print eval('ediifiiiaibiaiigiiic'[i%20]);i+=1;"*100

독창적 인 솔루션 ( 131 ) :

f='Fizz'
for i in range(1,101):x=i%20;print('Bizz'*(x%19<1)+'Fuzz'*(x<2)or(i%4<1)*f+'Buzz'*(i%5<1or x==4)+f*(x==15)or i,i)[x%11==5]

3
정말 아름다운 평가의 남용

3

파이썬 2, 131

F,B,Z,I='Fizz','Buzz','Fuzz','Bizz'
for i in range(1,101):print{5:Z,19:I,i%4:B,i%5*4:F,3:B+F,16:F+B,0:I+Z,1:i,4:i}.get(i%4+i%5*4,i)

1
a) 인쇄 할 식의 논리 단락, b) r더 적은 문자로 계산 하는 의미의 역전 , c) 모든 줄을 한 줄에 배치 하여이를 154로 낮출 수 있습니다 .r,F,B,Z,I=1,'Fizz','Buzz','Fuzz','Bizz'\nfor i in range(1,101):a,b=i%4,i%5*4;print~-r and i or{5:Z,19:I,a:B,b:F,3:B+F,16:F+B,0:I+Z}.get(a+b,i);r=3!=a+b!=16
Reinstate Monica

@ 울프 람 : 감사합니다! 나는 약간의 변화를 가진 사람들을 적용하여 143을 만들었습니다.
Ry-

좋아, 이것은 나를 이길 인상적인 일이다. 나는 print 1!=a+b!=4그것이 악마 인 것을 좋아 합니다!

1
@LegoStormtroopr : 아냐 exec/ eval콤보는 악마입니다)
Ry-

그래,이기는 것이 어려울거야. 인쇄 섹션을 다음과 같이 변경하여 짜낼 수 있었으며 몇 가지를 만들 수있었습니다.print{5:Z,19:I,a:B,b:F,3:B+F,16:F+B,0:I+Z,1:i,4:i}.get(a+b,i)

1

모든 규칙을 문자 그대로 구현하는 파이썬의 ungolfed 참조 구현 (420 자) :

n = 1
while(n <= 100):
    if(n % 20 == 0):
        print "BizzFuzz"
    elif((n - 1) % 20 == 0):
        print "Fuzz"
    elif((n + 1) % 20 == 0):
        print "Bizz"
    elif(n % 5 == 0 and (n + 1) % 4 == 0):
        print "BuzzFizz"
        print n + 1
        n += 1
    elif(n % 4 == 0 and (n + 1) % 5 == 0):
        print "FizzBuzz"
        print n + 1
        n += 1
    elif(n % 4 == 0):
        print "Fizz"
    elif(n % 5 == 0):
        print "Buzz"
    else:
        print n
    n += 1

3
야. 내 파이썬에 괄호가 있습니다.
Ry-

기본적으로 사용중인 IDE가 삽입 된 것 같습니다. 나는 Windows 컴퓨터에 있었고 Windows에서 텍스트 편집기를 사용하여 코드를 작성하려고 시도하는 것은 잔인합니다.
Joe Z.

1

파이썬, 150

이것은 minitechs (이전) 답변의 파생물이지만, 내 자신을 만들기 위해 충분히 압착했습니다.

F,B,Z,I='Fizz','Buzz','Fuzz','Bizz'
for i in range(1,101):a,b=i%4,i%5*4;print i if a+b in [1,4] else {5:Z,19:I,a:B,b:F,3:B+F,16:F+B,0:I+Z}.get(a+b,i)

degolfed 버전은 훨씬 더 읽을 수없는,하지만 r그 minitech는 경우에만 다음 반복에있는 경우 합계를 트리거 사용하던 a,b중이었다 1,0또는 0,4에 해당하는, i%4 or i%5 == 0그것은 단지 그 상황에서 나타날 것 그래서. 그것이 가능했다 그래서 할당 및 계산을 제거 r하고의 현재 값에서 파생 i사용 a하고 b:

F,B,Z,I='Fizz','Buzz','Fuzz','Bizz'
for i in range(1,101):
 a,b=i%4,i%5*4;
 print i if a+b in [1,4] else {5:Z,19:I,a:B,b:F,3:B+F,16:F+B,0:I+Z}.get(a+b,i)

@WolframH의 제안도 포함되어 있습니다.


어, 그것은 다르지 않습니다. 어쨌든 주변 [1,4]및 사용 (1,4)또는 {1,4}옆 의 공간을 제거하십시오 {.
Ry-

다르지 않다, 단지 가치가 있다고 생각할 정도로 충분히 바뀌었다.

좋아, 그러나 당신은 공백을 위해 골프를해야합니다.
Ry-

@minitech 걱정하지 마십시오. []간격 의 팁을 응원합니다. 왜 당신이 {}원래의 대답에 사용했는지 궁금 합니다.

1

R : 170 자

a=b=1:100
o=!a%%4
i=!a%%5
w=o&i
a[o]="Fizz"
a[i]="Buzz"
a[c(i,F)&c(F,o)]="FizzBuzz"
a[c(F,i)&c(o,F)]="BuzzFizz"
a[w[-1]]="Bizz"
a[c(F,w)]="Fuzz"
a[w]="BizzFuzz"
cat(a[b])

0

TCL, 185 자

while {[incr i]<101} {puts [expr {$i%4?$i%5?($i-1)%4|($i-1)%5?($i+1)%4|($i+1)%5?$i:"Fuzz":"Bizz":($i-1)%4?($i+1)%4?"Buzz":"BuzzFizz":$i:($i-1)%5?($i+1)%5?$i%5?"Fizz":"FizzBuzz":$i:$i}]}

때로는 while루프로 대체 될 수 time바이트 저장 구조
sergiol
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.