Fizz Buzz với các ký tự độc đáo trong các cột


21

Lấy cảm hứng từ Chữ số trong làn đường của họ1, 2, Fizz, 4, Buzz

Giới thiệu

Nhiệm vụ của bạn là tạo chính xác đầu ra sau:

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

Thử thách

Thử thách này dựa trên thử thách Fizz Buzz và đây là tóm tắt: xuất các số từ 1 đến 100, mỗi số trên một dòng riêng, nhưng nếu số đó là bội số của 3, bạn nên xuất "Fizz" thay vì số gốc, nếu số đó là bội số của 5, bạn nên xuất "Buzz" thay vì số ban đầu. Nếu số này là bội số của 15, bạn nên xuất "FizzBuzz" thay vì số ban đầu.

Tuy nhiên, ngoài yêu cầu ở trên, bạn cũng nên thụt lề từng dòng bằng cách sử dụng khoảng trắng để làm cho mỗi cột chỉ chứa các ký tự duy nhất (không bao gồm khoảng trắng và dòng mới). Các khoảng trắng được đặt trước cho mỗi dòng là mức tối thiểu cần thiết để làm cho tất cả các dòng xuất hiện trước khi nó (bao gồm) có các ký tự duy nhất trong mỗi cột.

Ví dụ, 1,2,Fizz,4không cần bất kỳ thụt lề nào vì chúng đã có các ký tự duy nhất trong mỗi cột (cột 1 : 12F4, cột2 : i, cột3 : z, cột4 z:), nhưng khi thêm Buzzchúng ta cần thụt lề bởi hai khoảng trắng vì nếu không chúng ta sẽ có hai zký tự trong cả cột thứ 3 và thứ 4 Vì hai không gian là đủ để đạt được mục tiêu, bạn không nên thụt lề bởi ba không gian. 78không cần bất kỳ vết lõm nào nhưng khi xuất ra 11chúng ta cần thụt lề bởi một khoảng trắng vì cột thứ 1 đã có a 1. 13sau đó cần được thụt lề bởi ba khoảng trắng bởi vì bây giờ cột 1, 2 và 3 đều có a 1. Lõm vào các dòng còn lại theo cùng một quy tắc.

Để làm cho thử thách đơn giản hơn, Giới hạn trên đã được thay đổi thành 50.

Thông số kỹ thuật

  • Bạn có thể viết một chương trình hoặc một chức năng. Không ai trong số họ nên nhận bất kỳ đầu vào không trống. Lấy một đầu vào trống là tốt.

  • Vì đây là một thách thức KC, bạn cần tạo đầu ra như được chỉ định trong phần Giới thiệu. Một dòng mới duy nhất là tốt. Không có tiêu đề mới hoặc không gian tiêu đề thêm. Không có dấu cách thêm cho mỗi dòng.

  • Chương trình của bạn có thể thoát với lỗi hoặc có đầu ra STDERR không trống miễn là STDOUT tuân thủ thông số kỹ thuật.

  • Đây là bằng ngôn ngữ nội bộ , chương trình có số byte chiến thắng thấp nhất trong ngôn ngữ của nó.

  • Lỗ hổng mặc định áp dụng.


2
Đầu ra đã cho không khớp chính xác với thông số kỹ thuật, ví dụ các dòng 12, 20, 35 và 50.
Bubbler

1
Nhưng nhân vật thứ hai trong hai dòng đầu tiên là xe ngựa trở về.
Tích lũy

Tôi đã loại trừ không gian, bây giờ tôi cũng nên loại trừ dòng mới.
Weijun Zhou

Câu trả lời:


9

Python 2 , 127 byte

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

Hãy thử trực tuyến!

Một bảng tra cứu năm mươi byte dường như làm tổn thương kích thước mã nhỏ hơn logic cần thiết để theo dõi các ký tự đã xảy ra trong mỗi cột.


1
Logic sẽ tốt hơn nếu chúng ta được yêu cầu in tới 100 thay vào đó ...
Bubbler

5

Python 2 , 167 166 163 161 157 byte

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

Hãy thử trực tuyến!

Chỉnh sửa:

  • whilengắn hơn for..range()1 byte.
  • Cảm ơn @ovs đã cạo sạch 3 byte. Tôi luôn quên exec...
  • i%3/2Thủ thuật được điều chỉnh từ câu trả lời của Lynn (-2 byte).
  • @Lynn đề xuất a=map(set,[[]]*99), nhưng tôi đã tìm thấy một cách khác bằng cách sử dụng evalreprvới cùng byte (-4 byte).

Sử dụng danh sách các bộ để theo dõi các ký tự được sử dụng cho mỗi cột và đặt bất bình đẳng cho tư cách thành viên. Phần còn lại tuân theo thông số kỹ thuật chính xác.


4

C (gcc) , 145 144 byte (143 cho hex)

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));}

Hãy thử trực tuyến!

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

Ruby , 129 byte

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)}

Hãy thử trực tuyến!

Tín dụng kép dành cho Lynn ở đây, cho cách tiếp cận bảng tra cứuthuật toán fizzbuzz .

Thuật toán FizzBuzz rất thú vị và nó dựa trên sự trùng hợp đáng chú ý rằng tất cả các số dương, không tổng hợp nhỏ hơn 15 (khác với 3 và 5), khi được nâng lên mức 4, nhiều hơn 1 bội số của 15. thực tế:

 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

Các giá trị 3**4%155**4%15cách nhau chính xác 4: độ dài của chuỗi "Fizz". Chúng ta có thể khai thác điều này bằng cách sử dụng chúng để lập chỉ mục từ cuối chuỗi, dài ít nhất 9 ký tự. Bội số của 3 sẽ lập chỉ mục từ đầu chuỗi và bội số của 5 sẽ lập chỉ mục từ 5 ký tự từ cuối. Mọi số khác sẽ cố gắng lập chỉ mục từ trước khi bắt đầu chuỗi và không thành công nil. Sau đó, 15, tất nhiên, lập chỉ mục từ ký tự 0. Việc "FizzBuzz" chỉ dài 8 ký tự là một trở ngại nhỏ; chúng tôi sử dụng một ký tự dòng mới để đệm nó, mà sau này sẽ bị bỏ qua puts.

Có thể bảng tra cứu có thể bị loại bỏ bởi cách tiếp cận mang tính thủ tục hơn, nhưng nỗ lực của tôi là ở khoảng 190 byte.


2
Hấp dẫn. Cần lưu ý rằng thực tế tất cả các số cộng với 15 khi tăng lên công suất thứ 4 bằng 1 modulo 15 có thể được lấy từ định lý nhỏ của Fermat.
Weijun Zhou

2

[JavaScript (Node.js) REPL], 144 byte

(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`

`

Hãy thử trực tuyến!

Chương trình cảnh báo tự chạy thời gian không thể chấp nhận

JavaScript (Node.js) , 132 byte bởi Arnauld

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])

Hãy thử trực tuyến!


Câu trả lời của bạn dường như không giống với liên kết TIO
Jo King

@JoKing TIO xuất ra mảng và tôi không biết liệu nó có được phép hay không
l4m2


1

Haskell , 190 187 186 178 176 byte

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

Hãy thử trực tuyến!

Phiên bản dễ đọc hơn (và chú thích):

-- 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]

Chỉnh sửa: Tôi đã kết thúc nội tuyến một số chức năng trong phiên bản golf để tiết kiệm nhiều byte hơn.


@Laikoni Đúng rồi. Đã sửa.
Cristian Lupascu

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.