Sütunlarda benzersiz karakterlerle Fizz Buzz


21

Kendi şeritlerinde Basamaktan esinlenilmiş ve 1, 2, Fizz, 4, Buzz

Giriş

Göreviniz tam olarak aşağıdaki çıktıları üretmektir:

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

Meydan okuma

Bu meydan okuma, Fizz Buzz meydan okumalarına dayanmaktadır ve burada bir özet: 1'den 100'e kadar her şeyi kendi satırına dahil etmek, ancak sayı 3'ün katıysa, bunun yerine "Fizz" yerine "Fizz" yazmalısınız. Orijinal sayı, sayı 5'in katıysa, orijinal sayı yerine "Buzz" çıktısını almalısınız. Sayı 15'in katıysa, orijinal sayı yerine "FizzBuzz" yazmalısınız.

Ancak, yukarıdaki gereksinime ek olarak, her sütunun yalnızca benzersiz karakterler (yalnızca boşluklar ve yeni satırlar hariç) içerdiğinden emin olmak için boşluklar kullanarak girintili olmalısınız. Her satıra hazırlanan boşluklar, tüm satırların (her şey dahil) her sütunda benzersiz karakterlere sahip olmadan önce görünmesini sağlamak için gereken minimum değerdir.

Örneğin, 1,2,Fizz,4onlar zaten her sütunda benzersiz karakterler (: Sütun 1 çünkü hiçbir girinti ihtiyacı yoktur 12F4, sütun2: i, sütun3: z:, column4 zama eklerken) Buzz, aksi takdirde biz iki olurdu çünkü biz iki boşluklarla girinti gerekir z's hem 3. hem de 4. sütunda. Hedefe ulaşmak için iki boşluk yeterli olduğundan, onu üç boşlukla girmemelisiniz. 7ve 8herhangi bir girintiye ihtiyaç duymaz, ancak çıktı verirken 11bir boşluk girip girmemiz gerekir, çünkü 1. sütun zaten birdir 1. 13o zaman üç boşlukla girintili olması gerekir, çünkü şimdi 1., 2. ve 3. sütunların hepsinde bir tane vardır 1. Kalan satırların girintisi aynı kuralı izler.

Mücadeleyi kolaylaştırmak için üst limit 50 olarak değiştirildi.

gözlük

  • Bir program veya işlev yazabilirsiniz. Hiçbiri boş olmayan bir girdi almamalıdır. Boş bir giriş yapmak iyi.

  • Bu bir KC mücadelesi olduğundan, çıktıyı Giriş bölümünde belirtilen şekilde üretmeniz gerekir. Tek bir izleyen yeni satır iyidir. Başlık yeni satırı yok veya fazladan başlık alanı yok. Her satır için fazladan boşluk yoktur.

  • Programınız yanlışlıkla çıkabilir veya STDOUT spesifikasyonuna uygun olduğu sürece boş STDERR çıkışına sahip olabilir.

  • Bu dil içi , en az bayt sayısına sahip program kendi dilinde kazanıyor.

  • Varsayılan boşluklar uygulanır.


2
Verilen çıktı tam olarak spesifikasyona uymuyor, örn. 12, 20, 35 ve 50 numaralı hatlar.
Bubbler

1
Ancak ilk iki satırdaki ikinci karakter satır başıdır.
Birikim

Boşlukları hariç tuttum, şimdi yeni hatları da dışlamalıyım.
Weijun Zhou

Yanıtlar:


9

Python 2 , 127 bayt

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

Çevrimiçi deneyin!

Elli baytlık bir arama tablosu, her sütunda hangi karakterlerin oluştuğunu izlemek için gereken mantıktan daha az kod boyutunu incitiyor gibi görünüyor.


1
Bunun yerine 100'e kadar baskı yapmak zorunda olsaydık, mantık daha iyi olurdu ...
Bubbler

5

Python 2 , 167 166 163 161 157 bayt

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

Çevrimiçi deneyin!

Düzenlemeler:

  • while daha kısa for..range()1 bayttan .
  • 3 bayt'lık tıraş için @ovs teşekkür ederiz. her zaman unuturumexec ...
  • uyarlanmış i%3/2Lynn'in cevabından hile (-2 bayt).
  • @ Lynn önerdi a=map(set,[[]]*99), ancak evalve kullanarak başka bir yol buldumrepr aynı baytları (-4 bayt) .

Her sütun için kullanılan karakterleri izlemek için set listesi kullanın ve üyelik için eşitsizliği ayarlayın. Gerisi verilen kesin özellikleri izler.


4

C (gcc) , 145 144 bayt (hex için 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));}

Çevrimiçi deneyin!

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 bayt

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

Çevrimiçi deneyin!

Çift kredi burada arama tablosu yaklaşımı ve fizzbuzz algoritması için Lynn'e gidiyor .

FizzBuzz algoritması çok ilginçtir ve dikkat çekici bir tesadüf esasına dayanır ki, 4'üncü güce yükseltildiğinde, 15'ten küçük (3 ve 5 hariç) tüm pozitif, kompozit olmayan sayıların 15'in katları 1'den daha fazla olmasıdır. gerçek:

 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

Değerler 3**4%15ve 5**4%15tam olarak 4 ayrı: "Fizz" dizesinin uzunluğu. En az 9 karakter uzunluğunda bir dizgenin sonundan indekslemek için bunları kullanarak bunu kullanabiliriz. 3'ün katları dizgenin başından itibaren indekslenir ve 5'in katları sondan itibaren 5 karakterden dizin oluşturur. Diğer her sayı dizgenin başlangıcından önce dizine girmeye çalışır ve başarısız olur.nil . Ardından 15, tabii ki, 0ncı karakterden indeksler. "FizzBuzz" ın yalnızca 8 karakter uzunluğunda olması küçük bir engeldir; daha sonra görmezden gelinecek şekilde doldurmak için yeni bir satır karakteri kullanıyoruz puts.

Arama tablosunun daha usule dayalı bir yaklaşımla dışarı atılabilmesi mümkündür, ancak benim girişim 190 bayt civarındaydı.


2
İlginç. Fermat'ın küçük teoreminden, tüm sayıların 1 modulo 15'e eşit 4. güce yükseltildiğinde 15'e yükseldiği gerçeğine dikkat edilmelidir.
Weijun Zhou

2

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

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

'

Çevrimiçi deneyin!

Uyarı programının kendisi kabul edilemez sürelerle çalışıyor

JavaScript (Node.js) , Arnauld tarafından 132 bayt

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

Çevrimiçi deneyin!


Cevabınız TIO bağlantısıyla aynı gözükmüyor
Jo King

@JoKing TIO dizisini çıktılar ve izin verilip verilmediğini bilmiyorum
l4m2


1

Haskell , 190 187 186 178 176 bayt

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

Çevrimiçi deneyin!

Biraz daha okunabilir (ve açıklamalı) sürüm:

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

Düzenleme: Daha fazla bayt kaydetmek için golf versiyonunda bazı fonksiyonların satırını çizdim.


@Likonik Sağ. Sabit.
Cristian Lupascu

1

Jstx , 122 bayt

◄50-☺6*ø($♥:ø↕♂Fizz♀☺(◙$♣:ø↕♂Buzz♀6☺(◙"ø↕$6◙♂<<<<>@<<BD=F?@HABJCNP=@RT?VABXCBZ<^`=>bdDf>?hBCjEn'[i])%60*♀&P◄59▼ö,► 7.☻a0.2

Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.