Fizz Buzz ที่มีอักขระเฉพาะในคอลัมน์


21

แรงบันดาลใจจากตัวเลขในช่องทางของพวกเขาและ1, 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 คุณควรส่งออก "Buzz" แทนหมายเลขเดิม หากตัวเลขเป็นจำนวนทวีคูณของ 15 คุณควรส่งออก "FizzBuzz" แทนหมายเลขเดิม

อย่างไรก็ตามนอกเหนือจากข้อกำหนดข้างต้นคุณควรเยื้องแต่ละบรรทัดโดยใช้ช่องว่างเพื่อให้ทุกคอลัมน์มีอักขระที่ไม่ซ้ำกัน (ยกเว้นการเว้นวรรคและการขึ้นบรรทัดใหม่) เท่านั้น ช่องว่างที่เติมลงในแต่ละบรรทัดนั้นเป็นขนาดต่ำสุดที่จำเป็นเพื่อให้ทุกบรรทัดปรากฏก่อนหน้า (รวม) มีอักขระที่ไม่ซ้ำกันในแต่ละคอลัมน์

ยกตัวอย่างเช่น1,2,Fizz,4ไม่จำเป็นต้องเยื้องใด ๆ เพราะพวกเขามีตัวละครที่ไม่ซ้ำกันในแต่ละคอลัมน์ (คอลัมน์ที่ 1: 12F4, column2: i, คอลัมน์ 3: z, column4: z) แต่เมื่อมีการเพิ่มBuzzเราต้องเยื้องโดยสองช่องว่างเพราะมิฉะนั้นเราจะมีสองz's ในคอลัมน์ที่ 3 และ 4 เนื่องจากช่องว่างสองช่องนั้นเพียงพอที่จะบรรลุเป้าหมายคุณไม่ควรเยื้องเข้าไปด้วยช่องว่างสามช่อง 7และ8ไม่จำเป็นต้องเยื้องใด ๆ แต่เมื่อการแสดงผล11ที่เราต้องเยื้องโดยหนึ่งในพื้นที่เพราะคอลัมน์ที่ 1 1มีอยู่แล้ว 13จากนั้นจะต้องมีการเยื้องสามช่องว่างเพราะตอนที่ 1, 2 และ 3 1คอลัมน์ทุกคนมี การเยื้องสำหรับบรรทัดที่เหลือทำตามกฎเดียวกัน

เพื่อให้การท้าทายง่ายขึ้นขีด จำกัด บนถูกเปลี่ยนเป็น 50

รายละเอียด

  • คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่น ไม่ควรป้อนข้อมูลใด ๆ ที่ไม่ว่างเปล่า การป้อนข้อมูลที่ว่างเปล่าเป็นเรื่องปกติ

  • เนื่องจากนี่เป็นความท้าทายของ KC คุณต้องสร้างผลลัพธ์ตามที่ระบุไว้ในส่วนบทนำ ขึ้นบรรทัดใหม่ต่อท้ายเดียวก็โอเค ไม่มีการขึ้นบรรทัดใหม่หัวเรื่องหรือเว้นวรรคหัวเรื่องพิเศษ ไม่มีช่องว่างต่อท้ายพิเศษสำหรับแต่ละบรรทัด

  • โปรแกรมของคุณสามารถออกโดยมีข้อผิดพลาดหรือมีเอาต์พุต STDERR ที่ไม่ว่างเปล่าตราบใดที่ STDOUT เป็นไปตามข้อกำหนด

  • นี่คือภาษาโปรแกรมที่มีจำนวนไบต์ต่ำสุดชนะในภาษา

  • ใช้ช่องโหว่เริ่มต้น


2
ผลลัพธ์ที่ได้ออกมาไม่ตรงกับข้อมูลจำเพาะเช่นบรรทัด 12, 20, 35 และ 50
Bubbler

1
แต่ตัวละครตัวที่สองในสองบรรทัดแรกคือ carriage return
สะสม

ฉันมีการเว้นวรรคตอนนี้ฉันควรยกเว้นการขึ้นบรรทัดใหม่ด้วย
Weijun Zhou

คำตอบ:


9

Python 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

ลองออนไลน์!

ตารางการค้นหาห้าสิบไบต์ดูเหมือนว่าจะทำร้ายขนาดรหัสน้อยกว่าตรรกะที่จำเป็นในการติดตามตัวละครที่เกิดขึ้นในแต่ละคอลัมน์


1
ลอจิกจะดีกว่านี้ถ้าเราจำเป็นต้องพิมพ์สูงถึง 100 แทน ...
Bubbler

5

Python 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

ลองออนไลน์!

การแก้ไข:

  • whileสั้นกว่าfor..range()1 ไบต์
  • ขอบคุณ @ovs สำหรับการลบขนาด 3 ไบต์ ฉันลืมไปเสมอexec...
  • i%3/2เคล็ดลับที่ดัดแปลงมาจากคำตอบของ Lynn (-2 ไบต์)
  • @Lynn แนะนำa=map(set,[[]]*99)แต่ฉันพบวิธีอื่นในการใช้evalและreprมีไบต์เดียวกัน (-4 ไบต์)

ใช้รายการชุดเพื่อติดตามตัวอักษรที่ใช้สำหรับแต่ละคอลัมน์และตั้งค่าความไม่เท่าเทียมกันสำหรับการเป็นสมาชิก ส่วนที่เหลือเป็นไปตามสเป็คที่แน่นอนที่กำหนด


4

C (gcc) , 145 144 ไบต์ (143 สำหรับ 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));}

ลองออนไลน์!

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

ลองออนไลน์!

เครดิตสองเท่าไปที่ Lynn ที่นี่สำหรับวิธีตารางการค้นหาและอัลกอริทึม fizzbuzzอัลกอริทึม

อัลกอริทึม FizzBuzz เป็นที่น่าสนใจมากและมันขึ้นอยู่กับความบังเอิญที่น่าทึ่งว่าตัวเลขที่เป็นบวกและไม่ประกอบทั้งหมดมีค่าน้อยกว่า 15 (นอกเหนือจาก 3 และ 5) เมื่อยกกำลัง 4 เป็น 1 มากกว่าทวีคูณ 15 ใน ความเป็นจริง:

 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%15และ5**4%15อยู่ห่างกัน 4: ความยาวของสตริง "Fizz" เราสามารถใช้ประโยชน์จากสิ่งนี้ได้โดยใช้พวกมันทำดัชนีจากจุดสิ้นสุดของสตริงความยาวอย่างน้อย 9 ตัวอักษร ผลคูณของ 3 จะทำดัชนีจากจุดเริ่มต้นของสตริงและทวีคูณของ 5 จะจัดทำดัชนีจาก 5 ตัวอักษรจากจุดสิ้นสุด หมายเลขอื่น ๆ ทุกตัวจะพยายามทำดัชนีจากจุดเริ่มต้นของสตริงและล้มเหลวโดยส่งคืนnilทุกหมายเลขอื่นจะพยายามดัชนีจากก่อนที่จะเริ่มต้นของสตริงและล้มเหลวกลับจากนั้น 15 แน่นอนจะสร้างดัชนีจากอักขระที่ 0 ความจริงที่ว่า "FizzBuzz" มีความยาวเพียง 8 ตัวอักษรเป็นอุปสรรคเล็ก ๆ เราใช้อักขระ newline putsแผ่นมันซึ่งจะต่อมาได้รับการปฏิเสธโดย

อาจเป็นไปได้ว่าตารางการค้นหาสามารถออกนอกเส้นทางได้โดยใช้วิธีการที่มากกว่า แต่ความพยายามของฉันอยู่ในย่าน 190 ไบต์


2
น่าสนใจ ควรสังเกตว่าข้อเท็จจริงที่ว่าจำนวนทั้งหมด coprime ถึง 15 เมื่อยกกำลัง 4 เท่ากับ 1 modulo 15 สามารถได้มาจากทฤษฎีบทเล็ก ๆ ของแฟร์มาต์
Weijun Zhou

2

[JavaScript (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) , 132 ไบต์โดย 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])

ลองออนไลน์!


ดูเหมือนว่าคำตอบของคุณจะไม่เหมือนกับลิงก์ TIO
Jo King

@JoKing TIO ส่งเอาต์พุตอาร์เรย์และฉันไม่รู้ว่าอนุญาตหรือไม่
l4m2

2

Java (JDK 10) , 185 ไบต์

v->{for(int n=0,l;n<50;System.out.printf((l>0?"%"+l:"%")+"s%s%n","",(n%3<1?"Fizz":"")+(n%5<1?"Buzz":n%3<1?"":n)))l="####%'##)+$-&'/()1*57$'9;&=()?*)A#EG$%IK+M%&O)*Q,U#".charAt(n++)-35;}

ลองออนไลน์!

เครดิต

  • Geobitsสำหรับพวกเขารหัสสั้น
  • -1 ไบต์ต้องขอบคุณKevin Cruijssen (แม้ว่าฉันจะทำเมื่อเขาโพสต์ความคิดเห็น ;-))

1

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

แก้ไข: ฉันสิ้นสุดการฝังฟังก์ชั่นบางอย่างในรุ่น golfed เพื่อบันทึกไบต์เพิ่มเติม


@Laikoni ถูกต้อง คงที่
Cristian Lupascu

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.