เล่นเกม“ bzzt”


56

ผู้ชนะ: คำตอบ CJam ของ Aditsu ! ขนาดมหึมา 25 ไบต์! ดี!

คุณสามารถส่งคำตอบของคุณต่อไปได้ แต่คุณจะไม่สามารถชนะได้อีกต่อไป โพสต์ต้นฉบับเก็บไว้สำหรับลูกหลาน:


เกม "Bzzt" เป็นเกมที่คุณต้องนับจำนวน (ในกรณีนี้คือ 500) อย่างไรก็ตามหากจำนวนมี 3 ในนั้นหรือหารด้วย 3 คุณจะไม่พูดหมายเลขนั้น คุณพูดว่า "Bzzt" แทน

กฎ:

  • คุณไม่สามารถเขียนโค้ดตัวเลขได้ยาก
  • ตัวเลขต้องเป็นไปตามข้อกำหนดอย่างน้อย 1 ข้อต่อไปนี้
    • หารด้วย 3
    • ตัวเลขมี 3
  • ตัวคั่นบางประเภทบังคับ (12bzzt14 ไม่นับ)
  • คะแนนวัดเป็นไบต์
  • คุณจะต้องนับ 500 อย่างแน่นอนเริ่มต้นที่ 1 หรือ 0 (คุณเลือก)
  • ตัวเลขจะต้องถูกส่งออก แต่มันไม่สำคัญว่า (เช่น stdout, การเขียนไปยังไฟล์ข้อความ ฯลฯ )
  • 0 สามารถหารได้ด้วย 3 หรือหารด้วยไม่ได้ คุณสามารถเลือก.
  • คุณสามารถส่งออกหมายเลขหนึ่งครั้ง (เช่นเอาท์พุท 1 จากนั้น 2 จากนั้น bzzt จากนั้น 4 ฯลฯ ) หรือทั้งหมดในครั้งเดียว (เช่นเอาท์พุท 1 2 bzzt 4 5)
  • คุณต้องแทนที่ตัวอักษร 3 ด้วยคำว่า "bzzt" นี่ไม่ใช่ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ (bZzt, Bzzt, bzzt ไม่เป็นไร)

  • นี่เป็นความท้าทายของนักดังนั้นรหัสที่สั้นที่สุดชนะ
  • การประกวดนี้สิ้นสุด 30 มิถุนายน 2014 (7 วันจากการโพสต์)

1
สำหรับจุดประสงค์ของคำถามนี้ 0 หารด้วย 3 ได้ไหม
Junurous

2
เป็น "buzz" หรือ "bzzt" หรือไม่ คุณเขียน "buzz" สองครั้งแล้ว
aditsu

3
กรุณาชี้แจง ฉันจะต้องส่งออกbuzzหรือbzztถ้ามีข้อกำหนดทั้งสองอย่าง? ฉันต้องส่งออก12bzzt4หรือbzztสำหรับ1234?
nyuszika7h

4
ผมว่าสำหรับbzzt 1234มันเป็นเกมการดื่ม 'สามัญ' ที่นี่ (เรามักจะทำกับ 7)
Martijn

66
"0 สามารถหารด้วย 3 หรือหารไม่ได้คุณสามารถเลือกได้" ฉันไม่คิดว่าคุณจะเลือกได้ 0 mod 3 คือ 0 ซึ่งไม่ใช่เรื่องของความคิดเห็น
David Conrad

คำตอบ:


33

CJam - 25

501{3sI3%<Is-I"bzzt"?N}fI

ขอบคุณฮาวเวิร์ด :)

ลองที่http://cjam.aditsu.net/

คำอธิบาย:

501{…}fIโดยทั่วไปแล้วfor(int I=0; I<501; ++I) {…}
3sจะแปลง 3 เป็นสตริงเช่น "3"
I3%คือI% 3
<ได้รับสตริงย่อยด้านซ้าย - "3".substring(0, I % 3)- ซึ่งคือ "" สำหรับI% 3 == 0 และ "3" มิฉะนั้น
IsจะแปลงIเป็นสตริง
-ด้วย 2 สตริงทำให้ความแตกต่างเป็นชุด string iff I% 3 == 0 (สตริงแรกว่างเปล่า) หรือIมี 3 หลัก
…I"bzzt"?เหมือน… ? I : "bzzt"กัน สตริงก่อนหน้านี้ถือเป็นค่าบูลีนโดยที่ "" เป็นเท็จและสตริงอื่นใดที่เป็นจริง
Nจะเพิ่มขึ้นบรรทัดใหม่


คุณสามารถใช้เคล็ดลับเช่นเดียวกับในการแก้ปัญหา golfscript 501{3sI3%<Is-I"bzzt"?N}fIของฉันและบันทึกตรรกะและ:
Howard

29

ทับทิม, 43

501.times{|a|puts"#{a}"[?3]||a%3<1?:Bzzt:a}

ตรงไปตรงมาสวย

แก้ไข: บันทึกหนึ่งไบต์ขอบคุณฮาวเวิร์ด!


1
"#{a}"[?3]||a%3<1คุณสามารถบันทึกช่องว่างเดียวถ้าคุณเขียน
Howard

@ วิธี: แน่นอนขอบคุณมาก!
Ventero

1
ยิ่งยาวไปกว่าอ่านไม่ได้ แต่น่าเสียดายเหมือนกัน: "#{a}"[?3[0,a%3]].
Howard

สิ่งที่เกี่ยวกับการแทนที่putsด้วยpและการประหยัด 3 ตัวอักษร?
David Unric

1
@DavidUnric pพิมพ์ผลลัพธ์ของการโทรหาinspectอาร์กิวเมนต์ (เปรียบเทียบกับput ซึ่งเรียกto_s) ดังนั้นแทนที่จะพิมพ์Bzzt(ซึ่งก็คือ:Bzzt.to_s) มันจะพิมพ์:Bzztซึ่งไม่ตรงกับข้อกำหนดผลลัพธ์
Ventero

25

seq และ GNU sed - 42 33 31 30

ทำงานได้โดยตรงใน dash ส่วนเชลล์อื่น ๆ อาจต้องปิดใช้งานการขยายประวัติเช่นด้วย bash set +H:

seq 500|sed 0~3!{/3/!b}\;cbzzt

มันทำงานยังไง?
nbubis

การขยายประวัติถูกปิดใช้งานโดยค่าเริ่มต้นในเชลล์สคริปต์
nyuszika7h

@ nyuszika7h: จริง แต่ฉันคาดหวังว่าหลายคนจะลองคำตอบในเปลือกโต้ตอบ
ธ อร์

1
@nbubis: รุ่นที่อัปเดตทำงานโดยสร้างลำดับด้วย seq 0~3!เรียกใช้{/3/!b}และร่วมกันนิพจน์เหล่านี้ออกจากบรรทัดตามที่เป็นถ้ามันไม่สามารถหารด้วยและไม่มี 3 บิตสุดท้าย "แก้ไข" บรรทัดเป็น bzzt
Thor

18

รหัสเครื่อง x86 บน DOS (ไฟล์. com) - 71 ไบต์

00000000  31 c9 68 20 24 89 e5 89  c8 bb 03 00 31 d2 f7 f3  |1.h $.......1...|
00000010  85 d2 74 1a 89 c8 b3 0a  31 d2 f7 f3 80 fa 03 74  |..t.....1......t|
00000020  0d 80 c2 30 86 d6 52 44  85 c0 75 ea eb 08 89 ec  |...0..RD..u.....|
00000030  68 7a 74 68 62 7a 89 e2  b4 09 cd 21 89 ec 41 81  |hzthbz.....!..A.|
00000040  f9 f4 01 7e c2 59 c3                              |...~.Y.|

พิมพ์เอาต์พุตที่ต้องการไปยัง stdout พร้อมช่องว่างเป็นตัวคั่น สามารถทำงานได้โดยไม่มีปัญหาใน DosBox

ประกอบความเห็น:

    org 100h

start:
    ; 0 - 500 counter
    xor cx,cx
    ; we'll use the stack as scratch space to build the strings to print
    ; first of all, push ' $' on the stack (in reverse order); this will be
    ; the end of each string we'll print
    push 2420h
    ; save the stack pointer, to get back to this position after each print
    mov bp,sp
mainloop:
    ; first try to divide by three
    mov ax,cx
    mov bx,3
    xor dx,dx
    div bx
    test dx,dx
    ; no remainder => bzzt
    jz bzzt
    ; otherwise, go into the decimal-print loop
    mov ax,cx
divloop:
    ; bh is already at zero due to the mov bx,3 above
    mov bl,10
    xor dx,dx
    ; divide by 10
    div bx
    ; remainder is 3 => bzzt
    cmp dl,3
    je bzzt
    ; convert number to digit
    add dl,'0'
    ; trick: we move the digit to the upper byte of dx: this allows us to
    ; push the whole dx (you cannot do push dl) but to easily kill the
    ; undesidered byte by touching the stack pointer (it will be overwritten
    ; by the next stack operation/ignored by the print)
    xchg dl,dh
    push dx
    inc sp
    ; check is there anything left to print, rinse & repeat
    test ax,ax
    jnz divloop
    ; skip straight to print
    jmp print
bzzt:
    ; since we may be here from inside divloop, reset the stack pointer to
    ; where we left ' $'
    mov sp,bp
    ; push 'bzzt'
    push 747ah
    push 7a62h
print:
    ; print what is on the stack
    mov dx,sp
    mov ah,9h
    int 21h
    ; move us back to ' $'
    mov sp,bp

    ; increment cx and repeat while we are <=500
    inc cx
    cmp cx,500
    jle mainloop
end:
    ; fix back the stack pointer to the original value (=kill the first push)
    pop cx
    ; quit
    ret

5
เคารพ!!!!! น่าทึ่ง!
yossico

@yossico: ขอบคุณ! :) จริง ๆ แล้วมันไม่มีอะไรพิเศษจริง ๆ ฉันแน่ใจว่าคนที่เขียนชุดประกอบสำหรับ DOS สามารถกำจัดไบต์ได้มากกว่านี้
Matteo Italia


17

PHP, ไม่มีตัวคั่น - 62, 61,59,58,52,49 47

ไม่ได้บอกว่าควรมีช่องว่าง / ขึ้นบรรทัดใหม่ / ตัวคั่นระหว่างกันโดยไม่มี:

while(++$i<501)echo$i%3*!strpbrk($i,3)?$i:bzzt;

ด้วยตัวคั่น68,67,65,64,58 / 55,53 / 52 51/50

while(++$i<501)echo$i%3*!strpbrk($i,3)?$i:bzzt,' '; // 51
while(++$i<501)echo$i%3*!strpbrk($i,3)?$i:bzzt,~õ; // 50
  • เพิ่งพบ 'คนโกง' ตัวเล็ก ๆ ไม่ต้องการช่องว่างหลังจากechoนั้นช่วยฉันสักหน่อย
  • สร้างขึ้นบรรทัดใหม่
  • อีกหนึ่ง 'โกง' bzzt ไม่จำเป็นต้องใส่เครื่องหมายคำพูด (ทดสอบแล้ว) ไม่ใช่วิธีที่จะไป แต่ใช้งานได้

Javascript - 54,51 50

หลักการเดียวกัน แต่ฟังก์ชั่นจาวาสคริปต์:

for(i=0;i++<500;)alert(i%3<1|/3/.test(i)?'bzzt':i)

ขอขอบคุณ @ core สำหรับเครื่องหมายวงเล็บและสำหรับ () เคล็ดลับ สิ่งที่ทำให้ฉันทำผิดพลาดเบราว์เซอร์ของฉันสองสามครั้ง ^^
Martijn

ฮ่าฮ่า ฉันทดสอบด้วยconsole.log()ชัด ๆ แต่มันสั้นกว่า
Martijn

1
โซลูชัน Javascript ของคุณมีค่าถึง 501
ขีดล่าง

1
PHP 52: เป็นถ่าน 245 บิตคว่ำ <?for(;500>$i++;)echo$i%3*!strpbrk($i,3)?$i:bzzt,~õ;õ\n
โม่

1
คุณสามารถแทนที่!strpbrk($1,3)ด้วยtrim(3,$i)เพื่อบันทึก 4 ไบต์
aross

16

Javascript 50 49

-1 ไบต์ต้องขอบคุณ core1024

for(i=0;i++<500;)alert(i%3*!/3/.test(i)?i:'bzzt')

ฉันรู้ว่าสามารถทำได้! แต่ไม่พบวิธี
edc65

1
คุณสามารถจินตนาการใบหน้าของฉันได้เมื่อโซลูชัน JavaScript ชนะ LiveScript ของฉัน
nyuszika7h

ในโซลูชันที่สองของคุณคุณสามารถลบหนึ่ง & sign และมันจะยังคงทำงานอยู่
user902383

@ user902383 ไม่ใช่ผลลัพธ์ที่ถูกต้องหากไม่มีตัว&&ดำเนินการบูลีน ตัวอย่างเช่น: 497 % 3 = 2=> 2 & true = 0=>bzzt
nderscore

for(i=0;++i<501;)alert(!/3/.test(i)*i%3?i:'bzzt')- 49: P
core1024

11

GolfScript, 30 29 ตัวอักษร

501,{:^`3`^3%<?)'bzzt'^if n}/

ไม่ได้ดำเนินการตรงไปตรงมาดังนั้นใน GolfScript, สามารถทดสอบได้ที่นี่


10

Perl, 36

print$_%3&&!/3/?$_:Bzzt,$/for 1..500

แก้ไข: ฉันไม่ได้เป็นพระภิกษุสงฆ์ Perl ดังนั้น core1024 ดูเหมือนว่าจะมีการจัดการเพื่อกอล์ฟไบต์อื่นออกนี้ในคำตอบของเขา


1
ใช้sayเพื่อบันทึก 4 ไบต์:say$_%3&&!/3/?$_:bzzt for 1..5e2
Zaid

@ Zaid ทำไม 5e2 และไม่ใช่ 500?
ไม่ใช่ว่า Charles

@Charles: พวกเขาเทียบเท่า
Zaid

1
@ Zaid ดังนั้นทำไมไม่ชัดเจน?
ไม่ใช่ชาร์ลส์ที่

4
@Charles: ในบริบทของการแข่งขันกอล์ฟที่ท้าทายเราควรจะใส่ใจด้วยหรือ
Zaid

10

C # (71)

สามารถดำเนินการโดยตรงใน LinqPad

for(var i=0;++i<501;)(i%3<1|(i+"").Contains("3")?"buzz":i+"").Dump();

1
คุณสามารถบันทึกถ่านโดยใช้บิต - หรือ ( |) แทนตรรกะ - หรือ
Johnbot

@Johnbot ขอบคุณสำหรับคำแนะนำของคุณ
EvilFonti

คุณสามารถลบวงเล็บรอบ ๆ เงื่อนไขได้เช่นกัน
Johnbot

@Johnbot: นั่นไม่ใช่บิตหรือ - มันเป็นตรรกะ (หรือไม่ลัดวงจร) เนื่องจากตัวถูกดำเนินการเป็นบูลีน
Ryan M

การถ่ายโอนข้อมูลเป็นเพียง LinqPad แต่ถูกต้องไหม การทำเช่นนี้ใน C # เป็นแอปพลิเคชันจะต้องมีวิธีการส่วนขยายที่จะเพิ่ม (และเป็น 'bzzt' ไม่ใช่ 'buzz' =))
พอล

9

Python (52)

ขอบคุณ GRC!

for i in range(501):print[i,'Bzzt'][i%3<1or'3'in`i`]

เวอร์ชั่นเก่า:

print['Bzzt'if'3'in`i`or i%3<1 else`i`for i in range(501)]

1
สั้นกว่าเล็กน้อย:for i in range(501):print[i,'Bzzt'][i%3<1or'3'in`i`]
grc

4
ถ่านหนึ่งตัวสั้นลง:['3'[:i%3]in`i`]
xnor

7

Haskell: 88 82 80 79

main=mapM_ f[1..500]
f n|n`mod`3<1||'3'`elem`show n=putStrLn"bzzt"
f n=print n

ถ้าฉันกำลังเขียนคำตอบฉันจะคลอง IO และส่งกลับค่าสตริง
ภูมิใจ haskeller

1
คุณควรเปลี่ยน==0ด้วย<1
ภูมิใจ Haskeller

นอกจากนี้ลองสร้างคำนำหน้า elem ฉันคิดว่าคุณควรจะสามารถเขียนelem'3'$show nซึ่งเป็นถ่านที่สั้นกว่า หรือไม่. ฉันไม่ได้ตรวจสอบ
ภูมิใจ haskeller

@proudhaskeller: ข้อมูลจำเพาะระบุว่า "หมายเลขต้องเป็นเอาต์พุต" ดังนั้น IO จึงต้องเกี่ยวข้อง และการใช้elemในสัญลักษณ์นำหน้าจะไม่บันทึกอักขระใด ๆ เนื่องจากจะต้องมีช่องว่างหน้าเครื่องหมายวรรคตอน Not in scope: elem'3'มิฉะนั้นคุณจะได้รับ ตาดีด้วย<1แต่!
Taylor Fausak

6

จาวาสคริปต์66 63 60

for(a=i=[];i<500;)a[i++]=i%3&&!/3/.test(i)?i:'bzzt';alert(a)

ขอบคุณedc65สำหรับคำแนะนำในการใช้อาร์เรย์ ผลลัพธ์จะถูกคั่นด้วยเครื่องหมายจุลภาค


รุ่นเก่า

รุ่น 1a - 66

พิมพ์จาก 1 ถึง 500 ในกล่องการแจ้งเตือนตามกฎ เอาต์พุตถูกคั่นด้วยช่องว่าง

a="";for(i=1;i<501;i++)a+=i%3&&!/3/.test(i)?i+" ":"bzzt ";alert(a)

รุ่น 1b - 65

หากเราพิจารณาว่า 0 ไม่สามารถหารด้วย 3 ได้เราสามารถทำให้การแก้ปัญหาสั้นลงเหลือ 65 ตัวอักษร:

a=0;for(i=1;i<501;i++)a+=i%3&&!/3/.test(i)?" "+i:" bzzt";alert(a)

รุ่น 2 - 63

for(a=i="";i<501;)a+=++i%3&&!/3/.test(i)?i+" ":"bzzt ";alert(a)

ขอบคุณgrcสำหรับคำแนะนำในการลดความยาว


1
ฉันคิดว่าคุณสามารถเริ่มต้นด้วยfor(a=i="";i<500;)a+=++i ...
grc

ฉันคั่นด้วยจุลภาคเอาต์พุตก็โอเคอาร์เรย์จะสั้นกว่า: สำหรับ (o = i = []; i <500;) o [i ++] = i% 3 &&! / 3 / .test (i)? i: 'bzzt' ; alert (o)
edc65

6

PowerShell, 42

1..500|%{($_,'bzzt')[$_-match3-or!($_%3)]}

งานส่วนใหญ่ของ Ventero ด้วยความช่วยเหลือเล็กน้อยเกี่ยวกับไวยากรณ์โดยฉัน ;-)


6

R, 49 ตัวอักษร

a=1:500;b='bzzt';a[!a%%3]=b;a[grep(3,a)]=b;cat(a)

อธิบาย:

a=1:500 #Creates a vector with all integers from 1 to 500
b='bzzt'
a[!a%%3]=b #Replace all multiples of 3 by 'bzzt', thus coercing all other integers to character strings
a[grep(3,a)]=b #Replaces the character strings containing 3 by 'bzzt'
cat(a) #Print to stdout

การใช้งาน:

> a=1:500;b='bzzt';a[!a%%3]=b;a[grep(3,a)]=b;cat(a)
1 2 bzzt 4 5 bzzt 7 8 bzzt 10 11 bzzt bzzt 14 bzzt 16 17 bzzt 19 20 bzzt 22 bzzt bzzt 25 26 bzzt 28 29 bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt 40 41 bzzt bzzt 44 bzzt 46 47 bzzt 49 50 bzzt 52 bzzt bzzt 55 56 bzzt 58 59 bzzt 61 62 bzzt 64 65 bzzt 67 68 bzzt 70 71 bzzt bzzt 74 bzzt 76 77 bzzt 79 80 bzzt 82 bzzt bzzt 85 86 bzzt 88 89 bzzt 91 92 bzzt 94 95 bzzt 97 98 bzzt 100 101 bzzt bzzt 104 bzzt 106 107 bzzt 109 110 bzzt 112 bzzt bzzt 115 116 bzzt 118 119 bzzt 121 122 bzzt 124 125 bzzt 127 128 bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt 140 bzzt 142 bzzt bzzt 145 146 bzzt 148 149 bzzt 151 152 bzzt 154 155 bzzt 157 158 bzzt 160 161 bzzt bzzt 164 bzzt 166 167 bzzt 169 170 bzzt 172 bzzt bzzt 175 176 bzzt 178 179 bzzt 181 182 bzzt 184 185 bzzt 187 188 bzzt 190 191 bzzt bzzt 194 bzzt 196 197 bzzt 199 200 bzzt 202 bzzt bzzt 205 206 bzzt 208 209 bzzt 211 212 bzzt 214 215 bzzt 217 218 bzzt 220 221 bzzt bzzt 224 bzzt 226 227 bzzt 229 bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt 241 242 bzzt 244 245 bzzt 247 248 bzzt 250 251 bzzt bzzt 254 bzzt 256 257 bzzt 259 260 bzzt 262 bzzt bzzt 265 266 bzzt 268 269 bzzt 271 272 bzzt 274 275 bzzt 277 278 bzzt 280 281 bzzt bzzt 284 bzzt 286 287 bzzt 289 290 bzzt 292 bzzt bzzt 295 296 bzzt 298 299 bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt 400 401 bzzt bzzt 404 bzzt 406 407 bzzt 409 410 bzzt 412 bzzt bzzt 415 416 bzzt 418 419 bzzt 421 422 bzzt 424 425 bzzt 427 428 bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt 440 bzzt 442 bzzt bzzt 445 446 bzzt 448 449 bzzt 451 452 bzzt 454 455 bzzt 457 458 bzzt 460 461 bzzt bzzt 464 bzzt 466 467 bzzt 469 470 bzzt 472 bzzt bzzt 475 476 bzzt 478 479 bzzt 481 482 bzzt 484 485 bzzt 487 488 bzzt 490 491 bzzt bzzt 494 bzzt 496 497 bzzt 499 500

6

งูเห่า - 70

class P
    def main
        for i in 501,print if('3'in'[i]'or i%3<1,'Bzzt',i)

รุ่นที่ - 222

เพราะฉันรักภาษานี้อย่างแท้จริง ... ด้วยเหตุผลบางอย่าง ...

SETLOCAL ENABLEDELAYEDEXPANSION
for /l %%n in (1,1,500) do (
    set a=%%n&set /ai=!a!%%3
    if "!a:~0,1!"=="3" set a=Bzzt
    if "!a:~1,2!"=="3" set a=Bzzt
    if "!a:~2,3!"=="3" set a=Bzzt
    if !i!==0 set a=Bzzt
    echo !a!>>x)

คุณควรจะสามารถวางเครื่องหมายคำพูดรอบตัวถูกดำเนินการในครั้งแรกifเพราะคุณรู้ว่ามีอย่างน้อยหนึ่งหลัก การต่อบล็อกที่สมบูรณ์ภายในforกับ&อาจทำงานเพื่อบันทึกวงเล็บ
Joey

นอกจากนี้คุณสามารถใช้==แทนEQUและอาจวางช่องว่างสองสามที่นี่และที่นั่น
Joey

@ Joey ขอบคุณสำหรับคำแนะนำ!
Junurous

6

TI-BASIC - 31 (32) (34) (35) (36) (43)

:While X<500
:X+1→X
:If not(fPart(X/3
:"bzzt
:Disp Ans
:End

Total: 25 + 6 lines = 31

โปรดทราบว่าคำสั่งส่วนใหญ่ใน TI-BASIC จะแสดงเป็นเอนทิตีไบต์เดียว

รหัสต้องใช้ X เพื่อเริ่มต้นเป็น 0 ล่วงหน้า (มิฉะนั้นจะเพิ่มเป็น 3 ไบต์)

ฉันพยายามโกนหลายไบต์หลายครั้งดังนั้นฉันไม่ได้ระบุรายละเอียดทุกอย่างที่ฉันทำที่นี่เพื่อไม่ให้เกะกะโพสต์ พวกเขาส่วนใหญ่มุ่งไปที่การทำให้สั้นลงวนซึ่งฉันได้ทำในรุ่นนี้โดยขณะที่วนรอบและโดยการย่อเงื่อนไข If ด้วยความช่วยเหลือของAnsตัวแปร


แก้ไขให้ถูกต้องหากฉันทำผิด แต่ดูเหมือนจะไม่ใช่bzztตัวเลขที่ประกอบด้วย 3 เช่น 13
Thor

@Thor คุณถูกต้อง แต่ฉันอยู่ในกฎเนื่องจากพวกเขาระบุว่าฉันอาจพิมพ์bzztเฉพาะตัวเลขที่หารด้วย 3 การเพิ่มวิธีอื่นอาจเป็นไปได้ แต่จะต้องมีคำแนะนำเพิ่มเติม
Doktoro Reichard

1
กฎบอกว่า: ถ้าตัวเลขมี 3 อยู่ในนั้นหรือหารด้วย 3 คุณจะไม่พูดหมายเลขนั้น แต่คุณพูดว่า "Bzzt"ดังนั้นฉันจะบอกว่าควรเปลี่ยนทั้งสองอย่าง
Thor

@Thor สิ่งที่รบกวนฉันในตอนนี้มากที่สุดคือเครื่องหมายจุลภาคขนาดเล็กที่อยู่ตรงกลางของประโยค วิธีที่ฉันตีความมันทั้งสองวิธีในการทำมีความถูกต้องเท่าเทียมกันซึ่งอธิบายกฎข้อที่ 2: จำนวนจะต้องตรงตามข้อกำหนด 1 ข้อเท่านั้น ... (ต้องมี 3 หรือหารด้วย 3)
Doktoro Reichard

1
คุณทำบายพาสไบต์ที่นี่เนื่องจากตัวอักษรตัวพิมพ์เล็กเป็นโทเค็นสองไบต์ ฉันเห็นด้วยกับการตีความกฎของ ธ ​​อร์เนื่องจากเป็นคำตอบที่ทุกคำตอบข้างต้นใช้
lirtosiast

5

C, 93

เพียงเพื่อนรกของมัน ...

main(i){char s[9]="bzzt";while(i<498+sprintf(s+5,"%d",i))puts(s+5*(i++%3&&!strchr(s+5,51)));}

นี่เป็นข้อผิดพลาดเล็ก ๆ น้อย ๆ - มันข้ามผลลัพธ์สำหรับi = 0
Anatolyg

4
@anatolyg "คุณต้องนับ 500 อย่างแน่นอนเริ่มต้นที่ 1 หรือ 0 (คุณเลือก)" - ฉันเลือกที่จะเริ่มต้นจาก 1
คลื่นไส้ ossifrage

พลาดไปหน่อย ขออภัย!
Anatolyg

ข้ามมากขึ้นถ้าคุณผ่านการโต้เถียงฮ่า ๆ แต่มันเป็นกอล์ฟที่ดีฉันจะให้คุณ! ไปที่การใช้ค่าตอบแทนของ sprintf ในขณะที่คุณไปยังตัวเลขสามหลักเพื่อควบคุม while, lol แย่จัง .... ฮ่าฮ่า!
DreamWarrior

5

Julia 64 ไบต์

map(x->x%3==0||contains(string(x),"3")?"Bzzt":string(x),[1:500])

2
[println(a%3==0||3 in digits(a)?"bzzt":a) for a=1:500]คือ 54 ไบต์ การคืนค่าอาร์เรย์จะไม่พิมพ์ทั้งอาร์เรย์ดังนั้นฉันไม่แน่ใจว่านับว่าเป็น "เอาท์พุท" หรือไม่ หากการคืนค่าอาร์เรย์นั้น[a%3==0||3 in digits(a)?"bzzt":a for a=1:500]อาจนับและให้คะแนน 45
gggg

5

cmd.exe - 91

for /l %x in (1,1,500)do @set/a %x%3|find "0">nul&&echo bzzt||echo %x|find/v"3"||echo bzzt

... เพราะเหตุใดให้ใช้ไฟล์แบตช์เมื่อมีหนึ่งซับในที่ตรงไปตรงมาอย่างสมบูรณ์ ... :-)


5

Groovy - 51

500.times{println"$it".find('3')||it%3<1?'bzzt':it}

แก้ไข: การใช้timesเวอร์ชันการพิมพ์ในขณะนี้สั้นเท่ากับ "การแสดง" ขอบคุณ @ will-p


1
+1 คุณสามารถแลกเปลี่ยน(1..500).eachเพื่อ500.times
Will Lp

4

C, 80

การใช้ช่องว่างเป็นตัวคั่นแทนการแบ่งบรรทัด

n;main(){for(;n++<500;)printf(n%10^3&&n/10%10^3&&n/100^3&&n%3?"%d ":"bzzt ",n);}

1 bzzt 3 4 bzzt 6 7 bzzt 9 10 bzzt bzzt 13 bzzt... มีบางอย่างผิดปกติที่นี่
ossifrage คลื่นไส้

ดูเหมือนว่าฉันโลภเกินไปและเข้าสู่พฤติกรรมที่ไม่ได้กำหนด (แก้ไขและอ่านระหว่างจุดลำดับ) แก้ไขแล้ว
Anatolyg

ทำงานตอนนี้ :-)
squeamish ossifrage

4

Mathematica, 54 ตัวอักษร

รู้สึกตรงไปตรงมาเกินไป โซลูชั่นที่สั้นกว่าต้องเป็นไปได้

If[DigitCount[#][[3]] > 0 || #~Mod~3 < 1, Bzzt, #] & /@ Range@500

คุณไม่จำเป็นต้อง apostrophes :) ความ
ดร. เบลิซาเรี

@belisarius แน่นอน ขอบคุณ
Michael Stern

4

T-SQL 2008 - 80

จะไม่ชนะหรืออะไร แต่สนุกไปกับมันไม่น้อย: Tweaked ขอบคุณ @domager:

declare @ int=0t:if(@)like'%3%'or @%3=0print'bzzt'print @;set @+=1if @<501goto t

ข้อเท็จจริงที่รู้จักกันน้อยคือ @ เป็นชื่อที่ถูกต้องสำหรับตัวแปร มันให้ความรู้สึกแปลก ๆ เพราะรหัสที่ใช้เป็นชุดนั้นเป็นตัวแปร SQL มากกว่า แต่สั้นกว่านั้นสั้นกว่า! รุ่นนี้ทำงานบนฐานข้อมูลใด ๆ แก้ไข: ฉันสามารถลบ semis สองอันได้เนื่องจากพวกเขาไม่ต้องการ ฉันค่อนข้างมั่นใจว่ามันดีที่สุดเท่าที่จะทำได้

แก้ไข 2: ไม่พูดไม่เคย ที่นี่ตอนนี้ก็ยิ่งแย่ลงเมื่อใช้ goto แต่มันทำให้เราสามารถหลีกเลี่ยงการบล็อกได้ เราสามารถแทนที่ในขณะที่เริ่มต้น, จบลงด้วยความสั้นถ้า, t:, goto ประหยัด 6 ตัวอักษร นอกจากนี้เรายังจัดเรียงคำสั่งใหม่โดยเขียนลูปเป็น pseudo do-while เทียบเท่ากับ semantically แก้ไข 3: ใช่อย่างใดถ้าตอนนี้จะสั้นลง เดิม:

select top 501iif(number like'%3%'or number%3=0,'bzzt',str(number))from spt_values where'p'=type

ต้องรันบนฐานข้อมูลหลัก ฉันรัก T-SQL แม้จะมีเสียงดังและน่าเกลียดก็ตาม อาจมีวิธีที่จะทำให้สิ่งนี้ง่ายขึ้น แต่น่าเสียดายที่การiifติดตั้งในตัวต้องใช้ทั้งสองฝ่ายเห็นด้วยกับประเภท กฎการมาก่อนของเซิร์ฟเวอร์ SQL ให้ความสำคัญกว่า int มากกว่าสตริง จำนวนนั้นยาวเกินไป แต่การใช้นามแฝงมีอักขระมากกว่าค่า อาจมีวิธีที่ดีกว่าในการเปลี่ยนตัวเลขเป็นสตริง แก้ไข: str ทำงานด้วย 2 ตัวอักษรน้อยกว่า ltrim


ตอนแรกฉันคิดว่ารหัสของคุณยาว 2012.96 ไบต์
nyuszika7h

อีกต่อไปเล็กน้อยใน @ 101 แต่ไม่ต้องพึ่งพาโต๊ะdeclare @i int=1;while(@i<501)begin;if(@i)like'%3%'or @i%3=0 print'bzzt'else print @i;set @i=@i+1 end
domager

@domager @ขวาทั้งหมดรวมทั้งเราสามารถบันทึกค่อนข้างไม่กี่ตัวอักษรโดยการเปลี่ยนตัวแปร แล้วใช้ IIF () จะยังคงสั้นกว่าถ้า ( ... ) พิมพ์อื่นพิมพ์เพื่อให้เราได้รับไม่น้อยโดยใช้iifการแสดงออก นอกจากนี้เราสามารถใช้ตัวย่อ@+=1เพื่อบันทึกตัวอักษรได้
Michael B

ผมไม่ทราบว่า T-SQL +=สนับสนุน ฉันไม่มีประโยชน์ในการทดสอบ แต่ฉันค่อนข้างแน่ใจว่ามันรองรับ''+@การแปลงสตริงโดยใช้ภาษาที่ไม่เปลี่ยนแปลง
Peter Taylor

+=ถูกเพิ่มในปี 2008 มันรองรับ '' + @ แต่ไม่ได้ทำตามที่คุณต้องการ ที่ผมกล่าวว่ากฎความสำคัญโยนไป int แรกจึงปลดเปลื้อง''ไป int ผลในการเป็นศูนย์ดังนั้น''+@จะยังคงพิมพ์เป็น@ ใช้งานได้และมันก็ไม่ได้แพงไปกว่าสิ่งอื่นใด (2 ตัวอักษรพิเศษสำหรับ parens) ฉันเลือก t-sql 2012 ที่นี่เพราะผู้ดำเนินการใครจะรู้ว่าบางที sql release ของปี 2016 จะกำจัดเสียงรบกวนบ้างและเริ่มแข่งขัน (ไม่น่าเป็นไปได้) intstrIIF
Michael B

4

VBA: 54

for x=0to 500:?iif(x/3=x\3=instr(1,x,3),x,"Bzzt"):next

เปิดโปรแกรม Office ที่คุณชื่นชอบกด alt + F11 เพื่อเปิด VBA IDE และวางรหัสลงในบานหน้าต่างทันทีแล้วกด Enter

ใน VBA: ตัวแยกบรรทัดคืออะไร เป็นการจดชวเลขสำหรับการพิมพ์ iif หมายถึงแบบอินไลน์หาก (คิดว่า x? "Y": "N"), x / 3 ทำการหารทศนิยมและ x \ 3 ทำการหารจำนวนเต็ม, instr ส่งคืนตำแหน่งของถ่านในสตริงหรือ 0 มิฉะนั้น true = -1 และ false = 0

โค้ดจะเพิ่ม x และเอาท์พุต x หาก x / 3 = x \ 3 = คำสั่ง (1, x, 3) เป็นจริงและ "Bzzt" เป็นอย่างอื่น x / 3 = x \ 3 เปรียบเทียบ (float) (x / 3) กับ (int) (x / 3) และส่งกลับบูลีน (0 เป็นเท็จและ -1 เป็นจริง) คำแนะนำ (1, x, 3) ส่งคืนค่า 0 ถ้า "3" ไม่ได้อยู่ในจำนวนและจำนวนเต็มบวกเป็นอย่างอื่น ครั้งเดียวที่นิพจน์คืนค่าเป็นจริงคือเมื่อ (x / 3 = x \ 3) เป็นเท็จ (0) และคำสั่ง (1, x, 3) คือ 0 หรือกล่าวอีกนัยหนึ่งเมื่อ x ไม่สามารถหารด้วย 3 และไม่ได้ มีตัวเลข "3" ซึ่งเป็นสิ่งที่เรากำลังมองหา


4

k4 (37) (35)

{$(x;`bzzt)(|/51=$x)|~"."in$x%3}'!501

k4ไม่มีคำสั่ง modulo ในตัวและการใช้qอันใดอันหนึ่งจะใช้อักขระพิเศษ รุ่นนี้ (ab) ใช้รูปแบบเอาต์พุตในตัวเพื่อตรวจสอบว่าสตริงของผลลัพธ์ของการหารxด้วย 3 มีจุดทศนิยมในนั้นหรือไม่

แก้ไข:

{$(x;`bzzt)(|/51=$x)|x=3*_x%3}'!501

เคลฟเวอร์การจับคู่จุดทศนิยมอาจจะฉันสามารถโกนไบต์ที่สองโดยการตรวจสอบว่ายังคงเป็น3*floor x%3x


เพิ่มขึ้นสำหรับการจับคู่ทศนิยมอย่างชาญฉลาด!
Mark

โปรดอย่าอัพเดทคำตอบของคุณทั้งหมด ที่จะผลักดันความท้าทายที่ใช้งานทั้งหมดออกจากหน้าแรก มันจะดีถ้าคุณทำเพียงหนึ่งหรือสองครั้ง (แม้ว่าฉันจะไม่ได้คิดว่าการเปลี่ยนแปลงระหว่างh1และh2มีความสำคัญพอที่จะรับประกันการแก้ไขตั้งแต่แรก)
Martin Ender

3

ทุบตี, 53 52 48 46

seq 500|factor|sed '/3.*:\| 3 */cBzzt
s/:.*//'

ต้องการ GNU sed (ใช้cส่วนขยาย)


3

Java, 142 131 ขอขอบคุณ WozzeC

public class a{public static void main(String[]a){for(int i=1;i<501;i++)System.out.println(i%3>0&(""+i).indexOf(51)<0?i:"bzzt");}}

1
Java ของฉันค่อนข้างสนิม แต่มันจะสั้นกว่าด้วยและถูกดำเนินการหรือไม่? i% 3> 0 && ("" + i) .indexOf (51) <0? i: "bzzt" อาจเป็นไปได้ที่จะข้าม {} สำหรับ forloop
WozzeC

นี่คือ 122 ไบต์, 9 น้อย:class A{public static void main(String[]a){for(int i=0;++i<501;System.out.println(i%3>0&(""+i).indexOf(51)<0?i:"bzzt"));}}
Luigi Cortese

3

R (40) (36)

นี่คือplannapusโดยทั่วไปตอบสั้นลงเล็กน้อย แต่ฉันยังไม่สามารถแสดงความคิดเห็นได้

อัปเดต: -4 ตัวอักษร (ดูความคิดเห็นของ plannapus)

a=1:500;a[grepl(3,a)|!a%%3]='bzzt';a

เอาท์พุท:

  [1] "1"    "2"    "bzzt" "4"    "5"    "bzzt" "7"    "8"    "bzzt" "10"   "11"   "bzzt" "bzzt" "14"   "bzzt" "16"   "17"   "bzzt" "19"   "20"   "bzzt" "22"   "bzzt" "bzzt" "25"   "26"   "bzzt" "28"   "29"   "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "40"   "41"   "bzzt" "bzzt" "44"   "bzzt" "46"   "47"   "bzzt" "49"   "50"   "bzzt" "52"   "bzzt" "bzzt" "55"   "56"   "bzzt" "58"   "59"   "bzzt" "61"   "62"   "bzzt" "64"   "65"   "bzzt" "67"   "68"   "bzzt" "70"   "71"   "bzzt" "bzzt" "74"   "bzzt" "76"   "77"   "bzzt" "79"   "80"   "bzzt" "82"   "bzzt" "bzzt" "85"   "86"   "bzzt" "88"   "89"   "bzzt" "91"   "92"   "bzzt" "94"   "95"   "bzzt" "97"   "98"   "bzzt" "100"  "101"  "bzzt" "bzzt" "104"  "bzzt" "106"  "107"  "bzzt" "109"  "110"  "bzzt" "112"  "bzzt" "bzzt" "115"  "116"  "bzzt" "118"  "119"  "bzzt" "121"  "122"  "bzzt" "124"  "125"  "bzzt" "127"  "128"  "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "140"  "bzzt" "142"  "bzzt" "bzzt" "145"  "146"  "bzzt" "148"  "149"  "bzzt" "151"  "152"  "bzzt" "154"  "155"  "bzzt" "157"  "158"  "bzzt" "160"  "161"  "bzzt" "bzzt" "164"  "bzzt" "166"  "167"  "bzzt" "169"  "170"  "bzzt" "172"  "bzzt" "bzzt" "175"  "176"  "bzzt" "178"  "179"  "bzzt" "181"  "182"  "bzzt" "184"  "185"  "bzzt" "187"  "188"  "bzzt" "190"  "191"  "bzzt" "bzzt" "194"  "bzzt" "196"  "197"  "bzzt" "199"  "200"  "bzzt" "202"  "bzzt" "bzzt" "205"  "206"  "bzzt" "208"  "209"  "bzzt" "211"  "212"  "bzzt" "214"  "215"  "bzzt" "217"  "218"  "bzzt" "220"  "221"  "bzzt" "bzzt" "224"  "bzzt" "226"  "227"  "bzzt" "229"  "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "241"  "242"  "bzzt" "244"  "245"  "bzzt" "247"  "248"  "bzzt" "250"  "251"  "bzzt" "bzzt" "254"  "bzzt" "256"  "257"  "bzzt" "259"  "260"  "bzzt" "262"  "bzzt" "bzzt" "265"  "266"  "bzzt" "268"  "269"  "bzzt" "271"  "272"  "bzzt" "274"  "275"  "bzzt" "277"  "278"  "bzzt" "280"  "281"  "bzzt" "bzzt" "284"  "bzzt" "286"  "287"  "bzzt" "289"  "290"  "bzzt" "292"  "bzzt" "bzzt" "295"  "296"  "bzzt" "298"  "299"  "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "400"  "401"  "bzzt" "bzzt" "404"  "bzzt" "406"  "407"  "bzzt" "409"  "410"  "bzzt" "412"  "bzzt" "bzzt" "415"  "416"  "bzzt" "418"  "419"  "bzzt" "421"  "422"  "bzzt" "424"  "425"  "bzzt" "427"  "428"  "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "440"  "bzzt" "442"  "bzzt" "bzzt" "445"  "446"  "bzzt" "448"  "449"  "bzzt" "451"  "452"  "bzzt" "454"  "455"  "bzzt" "457"  "458"  "bzzt" "460"  "461"  "bzzt" "bzzt" "464"  "bzzt" "466"  "467"  "bzzt" "469"  "470"  "bzzt" "472"  "bzzt" "bzzt" "475"  "476"  "bzzt" "478"  "479"  "bzzt" "481"  "482"  "bzzt" "484"  "485"  "bzzt" "487"  "488"  "bzzt" "490"  "491"  "bzzt" "bzzt" "494"  "bzzt" "496"  "497"  "bzzt" "499"  "500"

ตั้งแต่หลายฟังก์ชั่นการดำเนินงานสตริง (เช่นstrsplit) ข้อผิดพลาดจากเส้นข้างเมื่อเลี้ยงกับตัวละครที่ไม่ใช่ผมถือว่าgreplได้เป็นอย่างดี รับได้สวย! +1
plannapus

2
โดยวิธีการที่ตั้งแต่คุณลดลงไปหนึ่งการแสดงออกของคุณไม่จำเป็นต้องกำหนดbก่อนที่จะว่า:a=1:500;a[grepl(3,a)|!a%%3]='bzzt';a
plannapus

3

Fortran - 118 114 111

ผู้สมัครที่ไม่น่าจะสิ้นหวัง แต่พัฒนามาเพื่อให้พอดีกับบัตรเจาะ การใช้โครงสร้างที่คลุมเครือทั้งหมดจากอดีตรหัสสั้น ๆ อาจยังเขียนได้:

do3 i=1,500
j=i
if(mod(i,3))2,1,2
1 print*,'bzzt'
cycle
2 goto(1)mod(j,10)-2
j=j/10
if(j>0)goto2
3 print*,i
end

"การคำนวณ goto" goto(L1,L2,...,Ln) xแยกเป็นหนึ่งในป้ายกำกับ L ถ้าหาก 1 <= x <= n

แก้ไข:จัดการเพื่อลบ 4 ไบต์โดยจัดเรียงลูปที่ตรวจสอบตัวเลข 3 ใหม่เป็นโบนัสรหัสในขณะนี้ยังมีเลขคณิต if-statement if(x) a,b,cซึ่งจะแยกเป็นหนึ่งในสามป้ายกำกับ: a if x <0, b ถ้า x == 0 หรือ c ถ้า x> 0

น่าเสียดายที่รุ่นสองรุ่นแรกไม่ได้สร้างผลลัพธ์ที่ถูกต้อง ตอนนี้ดิจิตัล -3 นั้นทำงานได้อย่างถูกต้องและโค้ดในขณะนี้ยังรวมถึงคำสั่ง if-ตรรกะที่ทันสมัย หายไปอีกสามไบต์เพราะใครต้องการenddoคำสั่ง? การส่งออกอาจได้รับการยืนยันที่นี่

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