Chơi trò chơi bzzt trên mạng


56

Người chiến thắng: Câu trả lời CJam của Aditsu ! Một con số khổng lồ 25 byte! Đẹp!

Bạn có thể tiếp tục gửi câu trả lời của mình, tuy nhiên bạn không còn có thể giành chiến thắng. Bài gốc giữ cho hậu thế:


Trò chơi "Bzzt" là một trò chơi mà bạn phải tính đến một số (trong trường hợp này là 500). Tuy nhiên, nếu số có 3 trong đó hoặc chia hết cho 3, bạn không nói số đó. Thay vào đó, bạn nói "Bzzt".

Quy tắc:

  • Bạn không thể mã hóa các con số.
  • Số chỉ phải đáp ứng ít nhất 1 trong các yêu cầu sau
    • Chia hết cho 3
    • Số chứa 3
  • Một số loại dấu phân cách là bắt buộc (12bzzt14 không được tính)
  • Điểm được đo bằng byte.
  • Bạn phải đếm chính xác đến 500, bắt đầu từ 1 hoặc 0 (bạn đã chọn).
  • Các số phải là đầu ra, nhưng không quan trọng bằng cách nào (ví dụ: thiết bị xuất chuẩn, ghi vào tệp văn bản, v.v.).
  • 0 có thể chia hết cho 3 hoặc không chia hết. Bạn có thể chọn.
  • Bạn có thể xuất các số một lần (ví dụ: đầu ra 1, sau đó 2, sau đó bzzt, sau đó 4, v.v.) hoặc tất cả cùng một lúc (ví dụ: đầu ra 1 2 bzzt 4 5).
  • Bạn phải thay thế chữ 3 bằng từ "bzzt". Đây không phải là trường hợp nhạy cảm (bZzt, Bzzt, bzzt đều ổn).

  • Đây là một thử thách , vì vậy mã ngắn nhất sẽ thắng.
  • Cuộc thi này kết thúc vào ngày 30 tháng 6 năm 2014 (7 ngày kể từ ngày đăng).

1
Đối với mục đích của câu hỏi này, 0 có chia hết cho 3 không?
Οurous

2
Đó là "buzz" hay "bzzt"? Bạn đã viết "buzz" hai lần cho đến nay.
aditsu

3
Vui lòng làm rõ. Tôi có phải xuất buzzhoặc bzztnếu cả hai yêu cầu áp dụng? Tôi phải đầu ra 12bzzt4hay bzztcho 1234?
nyuszika7h

4
Tôi muốn nói bzztcho 1234. Đây là một trò chơi uống rượu 'phổ biến' ở đây (chỉ chúng tôi thường làm điều đó với 7)
Martijn

66
"0 có thể chia hết cho 3 hoặc không chia hết. Bạn có thể chọn." Tôi thực sự không nghĩ rằng bạn có thể chọn. 0 mod 3 là 0, đó không thực sự là vấn đề quan điểm.
David Conrad

Câu trả lời:


33

CJam - 25

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

Cảm ơn Howard :)

Dùng thử tại http://cjam.aditsu.net/

Giải trình:

501{…}fIvề cơ bản là for(int I=0; I<501; ++I) {…}
3schuyển đổi 3 thành chuỗi, tức là "3"
I3%I% 3
<lấy chuỗi con bên trái - "3".substring(0, I % 3)- đó là "" cho I% 3 == 0 và "3" nếu không thì
Ischuyển đổi Ithành chuỗi
-có 2 chuỗi khác biệt, dẫn đến trống chuỗi iff I% 3 == 0 (chuỗi đầu tiên trống) hoặc Icó 3 chữ số trong đó
…I"bzzt"?là như thế nào … ? I : "bzzt"; chuỗi trước được coi là giá trị boolean, trong đó "" là false và bất kỳ chuỗi nào khác là true đều
Nthêm một dòng mới


Bạn có thể sử dụng thủ thuật tương tự như trong giải pháp chơi gôn của tôi và lưu logic và : 501{3sI3%<Is-I"bzzt"?N}fI.
Howard

29

Ruby, 43

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

Khá đơn giản.

Chỉnh sửa: Đã lưu một byte, cảm ơn Howard!


1
Bạn có thể lưu một khoảng trắng nếu bạn viết "#{a}"[?3]||a%3<1.
Howard

@Howard: Thật vậy, cảm ơn rất nhiều!
Ventero

1
Thậm chí nhiều hơn không thể đọc được nhưng không may cùng chiều dài : "#{a}"[?3[0,a%3]].
Howard

Điều gì về việc thay thế putsbằng pvà tiết kiệm 3 ký tự?
David Unric

1
@DavidUnric pin kết quả của việc gọi inspectđối số của nó (so với các lệnh gọi, mà gọi to_s). Vì vậy, thay vì in Bzzt(đó là :Bzzt.to_s), nó sẽ in :Bzzt, không phù hợp với thông số kỹ thuật đầu ra.
Ventero

25

seq và GNU sed - 42 33 31 30

Hoạt động trực tiếp trong dấu gạch ngang, một số shell khác có thể cần phải tắt mở rộng lịch sử, ví dụ như với bash set +H:

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

Làm thế nào nó hoạt động?
nbubis

Mở rộng lịch sử bị tắt theo mặc định trong các kịch bản shell.
nyuszika7h

@ nyuszika7h: đúng, nhưng tôi hy vọng nhiều người sẽ thử câu trả lời trong một vỏ tương tác.
Thor

1
@nbubis: phiên bản cập nhật hoạt động bằng cách tạo chuỗi với seq. 0~3!chạy {/3/!b}và cùng các biểu thức này rời khỏi dòng như thể nó không chia hết cho không chứa 3. Bit cuối cùng "sửa" dòng thành bzzt.
Thor

18

Mã máy x86 trên DOS (tệp .com) - 71 byte

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

In đầu ra cần thiết cho thiết bị xuất chuẩn với không gian dưới dạng dấu phân cách; có thể chạy mà không gặp vấn đề gì trong DosBox.

Nhận xét lắp ráp:

    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
SỰ TÔN TRỌNG!!!!! Kinh ngạc!
yossico

@yossico: cảm ơn bạn! :) thực sự, nó không có gì đặc biệt, tôi chắc chắn rằng những người thực sự đã viết assembly cho DOS chắc chắn có thể loại bỏ thêm một số byte.
Matteo Italia


17

PHP, không có dấu phân cách - 62, 61,59,58,52,49 47

Nó không nói rằng nên có một khoảng trắng / dòng mới / dấu phân cách giữa chúng, không có:

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

Với dải phân cách, 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
  • Chỉ cần tìm một 'cheat' nhỏ, không cần một khoảng trống sau echo, đã tiết kiệm cho tôi một chút.
  • Các tạo một dòng mới
  • Một 'cheat' nhỏ khác, bzzt không cần dấu ngoặc kép (đã thử nó). Không phải là cách để đi, nhưng nó hoạt động.

Javascript - 54,51 50

Cùng một nguyên tắc, nhưng các hàm javascript:

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

Cảm ơn @ core cho dấu ngoặc và cho () mẹo. Việc này đã khiến tôi bị sập trình duyệt một vài lần ^^
Martijn

Haha. Tôi đã thử nghiệm nó console.log()rõ ràng, nhưng điều này là ngắn hơn.
Martijn

1
Giải pháp Javascript của bạn được tính đến 501.
nderscore

1
PHP cho 52: <?for(;500>$i++;)echo$i%3*!strpbrk($i,3)?$i:bzzt,~õ;Đây õlà char 245, một chút đảo ngược \n.
primo

1
Bạn có thể thay thế !strpbrk($1,3)bằng trim(3,$i)để lưu 4 byte
khoảng thời gian từ

16

Javascript 50 49

-1 byte nhờ core1024

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

Tôi biết rằng có thể được thực hiện! Nhưng không tìm thấy làm thế nào
edc65

1
Bạn có thể tưởng tượng khuôn mặt của tôi khi một giải pháp JavaScript đánh bại LiveScript của tôi.
nyuszika7h

trong giải pháp thứ hai của bạn, bạn có thể xóa một & ký và nó vẫn hoạt động
user902383

@ user902383 Đây không phải là kết quả hợp lệ nếu không có toán &&tử boolean . Ví dụ: 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 ký tự

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

Không đơn giản để thực hiện trong GolfScript, có thể được kiểm tra ở đây .


10

Perl, 36

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

Chỉnh sửa: Tôi không phải là một nhà sư Perl, vì vậy core1024 dường như đã xoay sở để đánh bại một byte khác trong câu trả lời này .


1
Sử dụng saytiết kiệm 4 byte:say$_%3&&!/3/?$_:bzzt for 1..5e2
Zaid

@Zaid tại sao 5e2 chứ không phải 500?
Không phải Charles

@Charles: chúng tương đương
Zaid

1
@Zaid vậy tại sao không rõ ràng hơn?
Không phải Charles

4
@Charles: Trong bối cảnh của một thử thách chơi gôn, người ta có nên quan tâm không?
Zaid

10

C # (71)

Có thể được thực hiện trực tiếp trong LinqPad.

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

1
Bạn có thể lưu một char bằng cách sử dụng bitwise-hoặc ( |) thay vì logic-hoặc.
Johnbot

@Johnbot Cảm ơn lời đề nghị của bạn.
EvilFonti

Bạn cũng có thể loại bỏ dấu ngoặc đơn xung quanh điều kiện.
Johnbot

@ John John: Đó không phải là bitwise-hay. Đó là logic (không ngắn mạch) - hoặc, vì các toán hạng là boolean.
Ryan M

Dump chỉ là LinqPad, đúng không? Làm điều này trong C # như một ứng dụng sẽ yêu cầu thêm phương thức mở rộng. (Và đó là 'bzzt' chứ không phải 'buzz' =))
Paul

9

Con trăn (52)

Cảm ơn grc!

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

Phiên bản cũ:

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`]
Ngắn

4
Một char ngắn hơn:['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

Nếu tôi đang viết câu trả lời, tôi sẽ bỏ IO và trả về giá trị chuỗi.
tự hào

1
Bạn cũng nên chuyển đổi ==0với<1
tự hào

Ngoài ra, hãy thử làm tiền tố elem. Tôi nghĩ bạn sẽ có thể viết elem'3'$show n, đó là một char ngắn hơn. Hay không. Tôi đã không kiểm tra.
tự hào

@proudhaskeller: Thông số kỹ thuật nói rằng "các số phải là đầu ra", do đó IO phải được tham gia. Và sử dụng elemký hiệu tiền tố không lưu bất kỳ ký tự nào vì phải có khoảng trắng trước dấu nháy đơn; nếu không bạn sẽ nhận được Not in scope: elem'3'. Mắt tốt với <1, mặc dù!
Taylor Fausak

6

JavaScript 66 63 60

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

Nhờ edc65 cho gợi ý sử dụng mảng. Đầu ra bây giờ sẽ được phân tách bằng dấu phẩy.


phiên bản cũ

Phiên bản 1a - 66

In từ 1 đến 500 trong hộp cảnh báo theo quy tắc. Đầu ra được phân tách bằng dấu cách.

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

Phiên bản 1b - 65

Nếu chúng ta coi 0 là không chia hết cho 3, chúng ta có thể rút ngắn giải pháp xuống còn 65 ký tự:

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

Phiên bản 2 - 63

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

Nhờ grc cho gợi ý để giảm chiều dài.


1
Tôi nghĩ bạn có thể bắt đầu vớifor(a=i="";i<500;)a+=++i ...
grc

Đầu ra được phân tách bằng dấu phẩy là OK, một mảng sẽ ngắn hơn: for (o = i = []; i <500;) o [i ++] = i% 3 &&! / 3 / .test (i)? I: 'bzzt' ; cảnh báo (o)
edc65

6

PowerShell, 42

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

Chủ yếu là công việc của Venter, với một chút trợ giúp về cú pháp của tôi ;-)


6

R, 49 ký tự

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

Giải thích:

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

Sử dụng:

> 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

Rắn hổ mang - 70

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

Mẻ - 222

Bởi vì tôi thực sự yêu ngôn ngữ này ... vì một số lý do ...

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)

Bạn sẽ có thể bỏ dấu ngoặc kép xung quanh toán hạng trong lần đầu tiên ifvì bạn biết rằng có ít nhất một chữ số. Đồng thời ghép khối hoàn chỉnh trong forvới &có thể hoạt động để lưu dấu ngoặc đơn.
Joey

Hơn nữa, bạn có thể sử dụng ==thay vì EQUvà có thể thả một vài khoảng trống ở đây và ở đó.
Joey

@Joey Cảm ơn những lời đề nghị!
urur

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

Lưu ý rằng hầu hết các lệnh trên TI-BASIC được biểu diễn dưới dạng các thực thể byte đơn.

Mã yêu cầu X phải được khởi tạo về 0 trước (nếu không, đó là thêm 3 byte).

Tôi đã thực hiện một số nỗ lực để cạo một vài byte, vì vậy tôi không nêu chi tiết mọi thứ tôi đã làm ở đây, để không làm lộn xộn bài đăng. Chúng chủ yếu được hướng vào việc rút ngắn vòng lặp, điều mà tôi đã thực hiện trong phiên bản này bằng vòng lặp While và bằng cách rút ngắn điều kiện If với sự trợ giúp của Ansbiến.


Sửa lỗi cho tôi nếu tôi sai, nhưng điều này dường như không phải là bzztcon số chứa 3, ví dụ 13.
Thor

@Thor Bạn đúng, nhưng tôi theo quy tắc, vì họ nói rằng tôi chỉ có thể in bzztcác số chia hết cho 3. Thêm cách khác có thể có thể, nhưng sẽ cần thêm hướng dẫn.
Doktoro Reichard

1
Các quy tắc nói: nếu số có 3 trong đó hoặc chia hết cho 3, bạn không nói số đó. Thay vào đó, bạn nói "Bzzt" , vì vậy tôi sẽ nói cả hai nên được thay thế.
Thor

@Thor Điều làm tôi bực mình nhất bây giờ là dấu phẩy nhỏ xíu ở giữa câu. Cách tôi giải thích, cả hai cách làm đều có giá trị như nhau, điều này cũng giải thích quy tắc thứ 2: Số chỉ phải đáp ứng 1 trong các yêu cầu ... (có 3 hoặc chia hết cho 3)
Doktoro Reichard

1
Bạn đã nhầm lẫn các byte ở đây vì các chữ cái viết thường là các mã thông báo hai byte. Tôi đồng ý với cách giải thích của Thor về các quy tắc vì nó là câu trả lời mà mọi câu trả lời trên đây sử dụng.
lirtosiast

5

C, 93

Chỉ vì cái quái quỷ của nó ...

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

Điều này có một trục trặc nhỏ - nó bỏ qua đầu ra choi = 0
anatolyg

4
@anatolyg "Bạn phải đếm chính xác đến 500, bắt đầu từ 1 hoặc 0 (bạn đã chọn)." - Tôi đã chọn bắt đầu từ 1.
squossish ossifrage

Bỏ lỡ chút đó. Lấy làm tiếc!
anatolyg

Bỏ qua nhiều hơn nữa nếu bạn vượt qua nó đối số, lol. Nhưng, nó được chơi tốt, tôi sẽ cung cấp cho bạn điều đó! Phải sử dụng giá trị trả về của sprintf khi bạn hướng tới các số có ba chữ số để kiểm soát thời gian, lol. Thật tệ .... haha!
DreamWar Warrior

5

Julia 64 byte

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]là 54 byte. Ngoài ra, việc trả về một mảng không in toàn bộ mảng, vì vậy tôi không chắc liệu nó có được tính là "đầu ra" hay không. Nếu trả về một mảng thì [a%3==0||3 in digits(a)?"bzzt":a for a=1:500]có thể đếm và ghi 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

... bởi vì tại sao lại sử dụng một tệp bó khi tồn tại một lớp lót hoàn toàn đơn giản ... :-)


5

Groovy - 51

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

chỉnh sửa: sử dụng timesphiên bản in bây giờ ngắn như "hiển thị". cảm ơn @ will-p


1
+1. Bạn có thể đổi (1..500).eachchỗ cho500.times
Will Lp

4

C, 80

Sử dụng khoảng trắng làm dấu phân cách thay vì ngắt dòng.

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... Có gì đó không đúng ở đây.
squossish ossifrage

Có vẻ như tôi đã quá tham lam, và vấp vào Hành vi không xác định (biến đổi và đọc giữa các điểm chuỗi). Bây giờ đã sửa.
anatolyg

Làm việc ngay bây giờ :-)
squossish ossifrage

4

Toán học, 54 nhân vật

Điều này cảm thấy quá đơn giản. Các giải pháp ngắn hơn phải có thể.

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

Bạn không cần dấu nháy đơn :)
Tiến sĩ belisarius

@ Belisarius thực sự. Cảm ơn.
Michael Stern

4

T-SQL 2008 - 80

Sẽ không giành chiến thắng hay bất cứ điều gì ngoài niềm vui không kém: Tinh chỉnh nhờ @domager:

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

Một thực tế ít được biết đến, @ là một tên hợp lệ cho một biến. Cảm thấy kỳ lạ vì mã dựa trên tập hợp là biến thể SQL nhiều hơn, nhưng ngắn hơn thì ngắn hơn! Phiên bản này hoạt động trên bất kỳ cơ sở dữ liệu. Chỉnh sửa: Tôi đã có thể loại bỏ hai trong số các bán kết vì chúng không cần thiết. Tôi khá chắc chắn rằng điều này là tối ưu như nó được.

Edit2: Không bao giờ nói không bao giờ. Bây giờ nó thậm chí còn thô hơn khi sử dụng goto, nhưng nó cho phép chúng ta tránh được khối. Chúng ta có thể Thay thế trong khi, bắt đầu, kết thúc bằng ngắn hơn nếu, t :, goto lưu 6 ký tự. Chúng tôi cũng sắp xếp lại câu lệnh bằng cách viết lại vòng lặp dưới dạng giả trong khi, tương đương về mặt ngữ nghĩa. Edit3: Yeah, bằng cách nào đó nếu bây giờ ngắn hơn. Nguyên:

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

Phải được chạy trên cơ sở dữ liệu chủ. Tôi yêu T-SQL mặc dù những cách ồn ào và xấu xí của nó. Có thể có một cách để làm cho điều này đơn giản hơn, nhưng thật không may, tích iifhợp yêu cầu cả hai bên đồng ý về các loại. Các quy tắc ưu tiên máy chủ Sql cho ưu tiên int cao hơn chuỗi. Số cũng thực sự dài, nhưng răng cưa có nhiều ký tự hơn giá trị. Có thể có một cách tốt hơn để chuyển số thành chuỗi. Chỉnh sửa: str hoạt động quá. 2 ký tự ít hơn ltrim


Lúc đầu tôi nghĩ mã của bạn dài 2012,96 byte.
nyuszika7h

lâu hơn một chút trong @ 101, nhưng không dựa vào bảngdeclare @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
quản trị

@domager, hoàn toàn đúng, cộng với chúng ta có thể lưu khá nhiều ký tự bằng cách chuyển biến sang @. Sau đó, sử dụng iif () vẫn ngắn hơn một bản in if (...) khác để chúng tôi đạt được khá nhiều bằng cách sử dụng iifbiểu thức. Ngoài ra, chúng ta có thể sử dụng ngắn hơn @+=1để lưu char
Michael B

Tôi không biết T-SQL được hỗ trợ +=. Tôi không có tiện để kiểm tra, nhưng tôi khá chắc chắn rằng nó hỗ trợ ''+@chuyển đổi chuỗi bằng cách sử dụng ngôn ngữ bất biến.
Peter Taylor

+=đã được thêm vào năm 2008. Nó không hỗ trợ '' + @, nhưng nó không làm những gì bạn muốn. Như tôi đã nói, các quy tắc ưu tiên đúc để int đầu tiên để nó phôi ''để int, dẫn đến không để ''+@được @vẫn gõ như một int. strhoạt động và nó không đắt hơn nhiều so với bất cứ điều gì khác (2 ký tự thêm cho các parens). Tôi đã chọn t-sql 2012 tại đây vì IIFnhà điều hành, người biết có thể sql phát hành năm 2016 sẽ thoát khỏi một số tiếng ồn và bắt đầu cạnh tranh (không thể).
Michael B

4

VBA: 54

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

Mở chương trình Office yêu thích của bạn, nhấn alt + F11 để mở VBA IDE và dán mã vào khung ngay lập tức và nhấn enter.

Trong VBA ,: là dấu phân cách dòng ,? là viết tắt cho in, iif có nghĩa là nội tuyến nếu (nghĩ x? "Y": "N"), x / 3 thực hiện phép chia dấu phẩy động và x \ 3 thực hiện phép chia số nguyên, Bars trả về vị trí của char trong chuỗi hoặc 0 mặt khác, true = -1 và false = 0.

Mã về cơ bản tăng x và xuất ra x nếu x / 3 = x \ 3 = Bars (1, x, 3) là đúng và "Bzzt" nếu không. x / 3 = x \ 3 so sánh (float) (x / 3) với (int) (x / 3) và trả về một boolean (0 là sai và -1 là đúng). Bars (1, x, 3) trả về 0 nếu "3" không có trong số và một số nguyên dương khác. Lần duy nhất biểu thức trả về true là khi (x / 3 = x \ 3) sai (0) và Bars (1, x, 3) là 0 hoặc nói cách khác, khi x không chia hết cho 3 và không chứa chữ số "3", đó chính xác là những gì chúng ta đang tìm kiếm.


4

k4 (37) (35)

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

k4thiếu một lệnh modulo tích hợp và sử dụng lệnh qnày sẽ có thêm một ký tự; phiên bản này (ab) sử dụng định dạng đầu ra tích hợp để kiểm tra xem chuỗi kết quả chia xcho 3 có dấu thập phân trong đó không.

BIÊN TẬP:

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

Thông minh như khớp với dấu thập phân có thể, tôi có thể cạo hai byte bằng cách kiểm tra xem có 3*floor x%3còn không x.


Upvote cho phù hợp khéo léo các dấu thập phân!
Đánh dấu

Vui lòng không cập nhật tất cả các câu trả lời của bạn. Điều đó sẽ đẩy tất cả những thách thức tích cực ra khỏi trang nhất. Sẽ thật tuyệt nếu bạn chỉ làm một hoặc hai lần. (Mặc dù tôi thậm chí không nghĩ thay đổi giữa h1h2đủ quan trọng để đảm bảo chỉnh sửa ở nơi đầu tiên.)
Martin Ender

3

Bash, 53 52 48 46

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

Yêu cầu GNU sed (sử dụng cphần mở rộng).


3

Java, 142 131 cảm ơn đề xuất của 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 của tôi là một chút gỉ. Nhưng nó sẽ không ngắn hơn với một và toán hạng? i% 3> 0 && ("" + i) .indexOf (51) <0? i: "bzzt". Cũng có thể bỏ qua {} cho forloop.
WozzeC

đây là 122 byte, ít hơn 9 byte: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)

Về cơ bản, đây là câu trả lời plannapus ngắn hơn một chút, nhưng tôi chưa thể bình luận

Cập nhật: -4 ký tự (xem bình luận của plannapus)

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

Đầu ra:

  [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"

Vì nhiều hàm hoạt động chuỗi (chẳng hạn như strsplit) ném lỗi khi được cung cấp với các ký tự không phải ký tự, tôi giả sử greplcũng đã làm như vậy. Bắt tốt đẹp! +1
plannapus

2
Nhân tiện, vì bạn đã giảm nó thành một biểu thức mà bạn không cần xác định btrước đó:a=1:500;a[grepl(3,a)|!a%%3]='bzzt';a
plannapus

3

Pháo đài - 118 114 111

Một ứng cử viên vô vọng không thể, mặc dù ban đầu được phát triển để phù hợp với thẻ đục lỗ. Sử dụng tất cả các cấu trúc tối nghĩa từ quá khứ, một số mã ngắn vẫn có thể được viết:

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

Các goto(L1,L2,...,Ln) xnhánh "goto được tính toán" đến một trong các nhãn L khi và chỉ khi 1 <= x <= n.

Chỉnh sửa: Được quản lý để tắt 4 byte bằng cách sắp xếp lại vòng lặp kiểm tra chữ số 3. Như một phần thưởng, mã hiện cũng chứa câu lệnh if số học if(x) a,b,c, luôn luôn phân nhánh đến một trong ba nhãn: a if x <0, b nếu x == 0 hoặc c nếu x> 0.

Thật không may, hai phiên bản đầu tiên không tạo ra đầu ra chính xác. Vòng lặp chữ số-3 bây giờ hoạt động chính xác và mã bây giờ cũng bao gồm một câu lệnh if logic hiện đại. Thêm ba byte nữa, vì ai cần một enddocâu lệnh? Đầu ra có thể được xác minh ở đây .

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.