열에 고유 한 문자가있는 Fizz Buzz


21

레인에서 Digits1, 2, Fizz, 4, Buzz 에서 영감을 얻었습니다.

소개

당신의 임무는 정확히 다음과 같은 결과를 생성하는 것입니다.

1
2
Fizz
4
  Buzz
    Fizz
7
8
      Fizz
        Buzz
 11
          Fizz
   13
    14
            FizzBuzz
     16
      17
              Fizz
       19
                  Buzz
                    Fizz
 22
    23
                      Fizz
                        Buzz
   26
                          Fizz
     28
      29
                            FizzBuzz
       31
      32
                              Fizz
34
                                  Buzz
                                    Fizz
 37
  38
                                      Fizz
                                        Buzz
        41
                                          Fizz
  43
   44
                                            FizzBuzz
      46
       47
                                              Fizz
         49
                                                  Buzz

도전

이 챌린지는 Fizz Buzz 챌린지에 기반을두고 있으며 다음과 같이 요약합니다. 1부터 100까지의 숫자를 각 줄에 하나씩 출력하지만 숫자가 3의 배수이면 대신 "Fizz"를 출력해야합니다. 원래 숫자, 숫자가 5의 배수 인 경우 원래 숫자 대신 "버즈"를 출력해야합니다. 숫자가 15의 배수 인 경우 원래 숫자 대신 "FizzBuzz"를 출력해야합니다.

그러나 위의 요구 사항 외에도 공백을 사용하여 각 줄을 들여 쓰기하여 모든 열에 고유 한 문자 (공백 및 줄 바꿈 제외) 만 포함되도록해야합니다. 각 행 앞에 추가 된 공백은 모든 행이 각 열에 고유 한 문자를 갖기 전에 나타나도록하는 데 필요한 최소값입니다.

예를 들어, 1,2,Fizz,4이미 각 열에 고유 한 문자 (: 1 열이 있기 때문에 어떤 들여 쓰기를 필요로하지 않는다 12F4, 2 열 : i, 3 열 : z: column4을 z하지만 추가 할 때) Buzz그렇지 않으면 우리는이 것 때문에 우리는 두 개의 공백으로 들여 쓰기에 필요한 z'들 3 번째와 4 번째 열에 두 공간이 목표를 달성하기에 충분하므로 세 공간만큼 들여 쓰기해서는 안됩니다. 78들여 쓰기를 필요로하지만, 출력 할 때하지 않는 11첫 번째 열이 이미 있기 때문에 우리는 하나의 공백으로 들여 쓰기를해야합니다 1. 13이제 첫 번째, 두 번째 및 세 번째 열에 모두가 있기 때문에 세 개의 공백으로 들여 쓰기해야합니다 1. 나머지 줄에 대한 들여 쓰기는 동일한 규칙을 따릅니다.

챌린지를보다 간단하게하기 위해 상한이 50으로 변경되었습니다.

명세서

  • 프로그램이나 함수를 작성할 수 있습니다. 둘 다 비어 있지 않은 입력을 가져서는 안됩니다. 빈 입력은 괜찮습니다.

  • 이는 KC 과제이므로 소개 섹션에 지정된대로 출력을 생성해야합니다. 하나의 후행 줄 바꿈이 좋습니다. 제목 줄 바꿈 또는 추가 제목 공간이 없습니다. 각 줄마다 추가 공백이 없습니다.

  • STDOUT이 스펙을 준수하는 한 프로그램이 오류로 종료되거나 비어 있지 않은 STDERR 출력을 가질 수 있습니다.

  • 이것은 언어 내 에서 가장 적은 바이트 수를 가진 프로그램이 언어 내 -golf입니다.

  • 기본 허점이 적용됩니다.


2
주어진 출력이 사양과 정확히 일치하지 않습니다 (예 : 12, 20, 35 및 50 행).
Bubbler

1
그러나 처음 두 줄의 두 번째 문자는 캐리지 리턴입니다.
누적

공백을 제외 시켰으므로 이제 줄 바꿈도 제외해야합니다.
Weijun Zhou

답변:


9

파이썬 2 , 127 바이트

i=0;exec"print ord('<<<<>@<<BD=F?@HABJCNP=@RT?VABXCBZ<^`=>bdDf>?hBCjEn'[i])%60*' '+(i%3/2*'Fizz'+i%5/4*'Buzz'or`-~i`);i+=1;"*50

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

50 바이트 룩업 테이블은 각 열에서 발생한 문자를 추적하는 데 필요한 논리보다 코드 크기가 작습니다.


1
우리가 대신 100까지 인쇄해야한다면 논리는 더 나았을 것입니다.
Bubbler

5

파이썬 (2) , 167 (166) 163 161 157 바이트

a=eval(`[{0}]*99`);i=0
exec"f=i%3/2*'Fizz'+i%5/4*'Buzz'or`i+1`;i+=1;g=0\nwhile any(b>{c}for b,c in zip(a[g:],f)):g+=1\nmap(set.add,a[g:],f);print' '*g+f;"*50

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

편집 :

  • whilefor..range()1 바이트 보다 짧습니다 .
  • 3 바이트를 깎아 준 @ovs에게 감사드립니다. 나는 항상 잊어 버린다 exec...
  • i%3/2Lynn의 답변 (-2 바이트)에서 적용된 트릭.
  • @Lynn이 제안 a=map(set,[[]]*99)했지만 동일한 바이트 (-4 바이트)를 사용 eval하고 다른 방법을 찾았습니다 repr.

세트 목록을 사용하여 각 열에 사용 된 문자를 추적하고 멤버쉽에 대해 불평등을 설정하십시오. 나머지는 주어진 정확한 사양을 따릅니다.


4

C (gcc) , 145144 바이트 (16 진의 경우 143)

i;main(){for(;i++<50;printf("%*s%s%.d\n","000402800:81>34@56B7BH14JH3N56P76R0RX12ZX8^23`67b9b"[i]-48,i%3?"":"Fizz",i%5?"":"Buzz",i%3*i%5?i:0));}

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

0000h: 69 3B 6D 61 69 6E 28 29 7B 66 6F 72 28 3B 69 2B ; i;main(){for(;i+
0010h: 2B 3C 35 30 3B 70 72 69 6E 74 66 28 22 25 2A 73 ; +<50;printf("%*s
0020h: 25 73 25 2E 64 5C 6E 22 2C 22 FE FE FE 02 FE 00 ; %s%.d\n","......
0030h: 06 FE FE 08 06 FF 0C 01 02 0E 03 04 10 05 10 16 ; ................
0040h: FF 02 18 16 01 1C 03 04 1E 05 04 20 FE 20 26 FF ; ........... . &.
0050h: 63 28 26 06 2C 00 01 2E 04 05 30 07 30 22 5B 69 ; c(&.,.....0.0"[i
0060h: 5D 2B 32 2C 69 25 33 3F 22 22 3A 22 46 69 7A 7A ; ]+2,i%3?"":"Fizz
0070h: 22 2C 69 25 35 3F 22 22 3A 22 42 75 7A 7A 22 2C ; ",i%5?"":"Buzz",
0080h: 69 25 33 2A 69 25 35 3F 69 3A 30 29 29 3B 7D    ; i%3*i%5?i:0));}

3

루비 , 129 바이트

puts (1..50).map{|n|" "*(".<<<<>@<<BD=F?@HABJCNP=@RT?VABXCBZ<^`=>bdDf>?hBCjEn"[n].ord%60)+("FizzBuzz
"[i=n**4%-15,i+13]||n.to_s)}

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

룩업 테이블 접근fizzbuzz 알고리즘에 대해 이중 크레딧은 Lynn 에게 전달됩니다 .

FizzBuzz 알고리즘은 매우 흥미롭고, 4 차 거듭 제곱으로 올릴 때 15보다 작은 (3과 5 이외의) 모든 양의 비 합성 숫자는 15의 배수보다 1 이상이라는 놀라운 우연의 일치에 달려 있습니다. 것:

 n     n**4  n**4%15  n**4%-15
 1        1     1       -14
 2       16     1       -14
 3       81     6        -9
 4      256     1       -14
 5      625    10        -5
 6     1296     6        -9
 7     2401     1       -14
 8     4096     1       -14
 9     6561     6        -9
10    10000    10        -5
11    14641     1       -14
12    20736     6        -9
13    28561     1       -14
14    38416     1       -14
15    50625     0         0

3**4%155**4%154 떨어져 정확히 : 문자열 "소다"의 길이. 문자열 끝에서 최소 9 자 이상으로 색인을 생성하여이를 활용할 수 있습니다. 3의 배수는 문자열의 시작 부분에서 색인을 생성하고 5의 배수는 끝에서 5 문자에서 색인을 생성합니다. 다른 모든 숫자는 문자열이 시작되기 전에 색인을 생성하고 실패하여를 반환 nil합니다. 물론 15는 0 번째 문자부터 색인합니다. "FizzBuzz"의 길이가 8 자라는 사실은 작은 장애물입니다. 우리는 줄 바꿈 문자를 사용하여 채 웁니다.이 문자는 나중에 무시됩니다 puts.

보다 절차적인 접근 방식으로 조회 테이블을 아웃 골프 할 수는 있지만 190 바이트 근처에서 시도했습니다.


2
흥미 롭군 1 모듈로 15와 같은 4 제곱으로 올렸을 때 모든 숫자가 15로 코 프라임한다는 사실은 Fermat의 작은 정리에서 파생 될 수 있습니다.
Weijun Zhou

2

[자바 스크립트 (Node.js) REPL], 144 바이트

(f=(i,s=[['Fizz'][i%3]]+[['Buzz'][i%5]]||i+[],b=i>1?f(i-1):[])=>[...s].some((p,j)=>b.some(w=>w[j]==p&0!=p))?f(i,' '+s):b.push(s)&&b)(50).join`

`

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

경고 프로그램 자체는 허용 할 수없는 시간을 실행합니다

JavaScript (Node.js) , Arnauld의 132 바이트

f=(a=n=[],s=`${b=++n%5?'':'Buzz',n%3?b||n:'Fizz'+b}
`)=>n>50?'':a.some(x=>[...x].some((c,i)=>c!=0&c==s[i]))?f(a,' '+s):s+f([s,...a])

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


귀하의 답변은 TIO 링크와 같지 않습니다
Jo King

@JoKing TIO는 배열을 출력하고 그것이 허용되는지 모르겠다
l4m2


1

하스켈 , 190 (187) 186 (178) 176 바이트

unlines$foldl(\a x->a++[[z|z<-iterate(' ':)x,all(\m->null[p|(p,q)<-m`zip`z,p==q&&p>' '])a]!!0])[]$h<$>[1..50]
a%b=a`mod`b<1
h n|n%15="FizzBuzz"|n%3="Fizz"|n%5="Buzz"|1<2=show n

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

약간 더 읽기 쉽고 주석이 달린 버전 :

-- check if a is evenly divisible by b
a%b=a`mod`b<1
-- produce correct FizzBuzz output for a number
h n|n%15="FizzBuzz"|n%3="Fizz"|n%5="Buzz"|1<2=show n
-- test if all chars distinct between two strings
x#y=null[a|(a,b)<-x`zip`y,a==b&&a>' ']
-- given a new string and all previous strings
-- shift the new string to the right until all
-- chars are distinct
x!y=[z|z<-iterate(' ':)y,all(z#)x]!!0
g=h<$>[1..50]
f'=foldl step[]g
  where step acc x = acc++[acc!x]

편집 : 나는 더 많은 바이트를 절약하기 위해 골프 버전의 일부 기능을 표시했습니다.


@Laikoni 맞습니다. 결정된.
Cristian Lupascu

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.