「bzzt」ゲームをプレイする


56

勝者:AditsuのCJam回答!なんと25バイト!いいね!

引き続き回答を送信できますが、勝つことはできません。後世のために保管された元の投稿:


「Bzzt」ゲームは、数を数える必要があるゲームです(この場合は500)。ただし、数値に3が含まれている場合、または3で割り切れる場合は、その数値を言うことはありません。代わりに、「Bzzt」と言います。

ルール:

  • 数字をハードコーディングすることはできません。
  • 数は、以下の要件のうち少なくとも1つを満たす必要があります。
    • 3で割り切れる
    • 数字には3が含まれています
  • 一部のタイプの区切り文字は必須です(12bzzt14はカウントしません)
  • スコアはバイト単位で測定されます。
  • 1または0(選択)から開始して、正確に500までカウントする必要があります。
  • 数値は出力する必要がありますが、その方法は関係ありません(たとえば、stdout、テキストファイルへの書き込みなど)。
  • 0は3で割り切れるか、割り切れません。選んでいいですよ。
  • 数値を一度に1つずつ(たとえば、出力1、次に2、次にbzzt、次に4など)または一度にすべて出力できます(たとえば、出力1 2 bzzt 4 5)。
  • 文字3を単語「bzzt」に置き換える必要があります。これは大文字と小文字を区別しません(bZzt、Bzzt、bzztはすべて大丈夫です)。

  • これは挑戦なので、最短のコードが勝ちます。
  • このコンテストは2014年6月30日(投稿から7日)で終了します。

1
この質問のために、0は3で割り切れますか?
Οurous

2
「バズ」または「bzzt」ですか?これまでに「バズ」を2回書いています。
aditsu

3
どうか明らかにしてください。出力する必要がありますか、buzzまたはbzzt両方の要件が適用されますか?出力する12bzzt4必要bzztがあり1234ますか?
nyuszika7h 14年

4
と言いたいbzztです1234。ここでは「一般的な」飲酒ゲームです(頻繁に7でしか行いません)
Martijn 14年

66
「0は3で割り切れるか、割り切れないことがあります。選択できます。」私はあなたが選ぶことができるとは本当に思わない。0 mod 3は0です。それは実際には意見の問題ではありません。
デビッドコンラッド14年

回答:


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列とIFF列I%3 == 0(最初の文字列が空であった)、またはI、それが3桁を有する
…I"bzzt"?などです… ? I : "bzzt"。前の文字列はブール値として扱われます。 ""はfalseで、他の文字列はtrueで
N、改行を追加します


私のgolfscriptソリューションと同じトリックを使用して、論理的なand:を保存できます501{3sI3%<Is-I"bzzt"?N}fI
ハワード14年

29

ルビー、43

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

とても簡単です。

編集:ハワードに感謝、1バイト保存しました!


1
を書くと、単一の空白を保存できます"#{a}"[?3]||a%3<1
ハワード14年

@ハワード:確かに、どうもありがとう!
ヴェンテロ14年

1
さらに読みにくいが、残念ながら同じ長さ:"#{a}"[?3[0,a%3]]
ハワード14年

3文字に置き換えputsp保存するのはどうですか?
デビッドウンリック14年

1
@DavidUnric pは、inspect引数で呼び出した結果を出力します(putsと比較してを呼び出しますto_s)。したがって、印刷Bzzt(ではない:Bzzt.to_s)の代わりに印刷されますが:Bzzt、出力仕様と一致しません。
ヴェンテロ

25

seqおよびGNU sed- 42 33 31 30

ダッシュで直接動作します。他のシェルでは、たとえばbashを使用して、履歴展開を無効にする必要がある場合がありますset +H

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

どのように機能しますか?
nbubis

シェルスクリプトでは、デフォルトで履歴展開が無効になっています。
nyuszika7h

@ nyuszika7h:本当ですが、多くの人がインタラクティブなシェルで答えを試してくれると思います。
トール14年

1
@nbubis:更新されたバージョンは、seqでシーケンスを生成することにより機能します。0~3!実行{/3/!b}それはで割り切れない場合であるとして、一緒にこれらの表現は、ラインを残す 3.最後のビットがbzztするラインを「修正」が含まれていません。
トール14年

18

DOS(.comファイル)のx86マシンコード-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.|

スペースを区切り文字として使用して、必要な出力を標準出力に出力します。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
尊敬!!!!!すごい!
ヨシコ14年

@yossico:ありがとう!:)実際、それは本当に特別なことではありません。実際にDOS用のアセンブリを書いた人はきっともう少しバイトを削ることができると確信しています。
マッテオイタリア14年


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にスペースを必要としないで、少し助けてくれました。
  • 改行を作成します
  • もう1つの小さな「チート」、bzztは引用符を必要としません(テスト済み)。行く方法ではありませんが、うまくいきます。

Javascript- 54,51 50

同じ原理ですが、JavaScript関数は次のとおりです。

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

括弧とfor()のヒントをありがとう。が
原因で

ハハ。私はconsole.log()明らかにそれをテストしましたが、これは短いです。
マーティン14年

1
Javascriptソリューションは501にカウントされます。
nderscore 14年

1
52のためのPHP:<?for(;500>$i++;)echo$i%3*!strpbrk($i,3)?$i:bzzt,~õ;ザはõチャー245で、ビット反転\n
primo 14年

1
に置き換え!strpbrk($1,3)trim(3,$i)4バイトを節約できます
16

16

Javascript 50 49

core1024のおかげで-1バイト

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

それができると知っていた!しかし、どのように見つけることができませんでした
edc65

1
JavaScriptソリューションがLiveScriptに勝ったときの私の顔を想像できます。
nyuszika7h

youtは第二の溶液中であなたは1を削除&署名し、それはまだ動作しますができ
user902383

@ user902383ブール&&演算子なしの有効な結果ではありません。例:497 % 3 = 2=> 2 & true = 0=>bzzt
nderscore 14年

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
say4バイトを保存するために使用:say$_%3&&!/3/?$_:bzzt for 1..5e2
Zaid

@Zaidなぜ500ではなく5e2なのか?
はないチャールズチャールズ14年

@Charles:彼らは等価です
ザイド

1
@Zaidそれでは、なぜもっと明確にしないのですか?
はないチャールズ14年

4
@チャールズ:コードゴルフの挑戦の文脈では、気にする必要がありますか?
ザイド14年

10

C#(71)

LinqPadで直接実行できます。

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

1
論理ORの|代わりにビットOR()を使用して文字を保存できます。
ジョンボット14年

@Johnbotご提案ありがとうございます。
EvilFonti 14年

条件を囲む括弧も削除できます。
ジョンボット14年

@ジョンボット:それはビット単位ではありません。オペランドがブール値であるため、これは(非短絡)論理ORです。
ライアンM 14年

ダンプはただのLinqPadです、正しいですか?アプリケーションとしてC#でこれを行うには、拡張メソッドを追加する必要があります。(そして、それは「バズ」ではなく「bzzt」=))
ポール

9

パイソン(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
1つの文字短く:['3'[:i%3]in`i`]
XNOR

7

ハスケル: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 14

1
また、切り替え==0てください<1
誇りに思ってhaskeller 14

また、elemプレフィックスを作成してみてください。私はあなたが書くことができるはずだと思うelem'3'$show n、それはchar短いです。か否か。チェックしませんでした。
誇りに思ってhaskeller 14

@proudhaskeller:仕様には「数値を出力する必要がある」と記載されているため、IOを含める必要があります。またelem、アポストロフィの前にスペースが必要なので、プレフィックス表記で使用しても文字は保存されません。それ以外の場合は取得しNot in scope: elem'3'ます。でも良い目<1
テイラーフォーサック

6

JavaScript 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

コンマ区切りの出力は問題ありません。配列は短くなります:for(o = i = []; i <500;)o [i ++] = i%3 &&!/ 3 / .test(i)?i: 'bzzt' ; alert(o)
edc65 14年

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少なくとも1桁あることがわかっているため、最初のオペランドを引用符で囲むことができます。また、forwith 内で完全なブロックを連結すると&、括弧を保存するために機能する場合があります。
ジョーイ14年

さらに、==代わりに使用することができEQU、おそらくいくつかのスペースをあちこちにドロップします。
ジョーイ

@Joey提案をありがとう!
Οurous

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バイトです)。

いくつかのバイトを削る試みを何度か行ったので、ここでやったことをすべて詳しく説明しているわけではありません。それらは主にループを短縮することを目的としており、このバージョンでは、WhileループとAns変数を使用してIf条件を短縮しました。


私が間違っているなら、私を修正して、これはしていないようですbzzt3人の者を含む数字、例えば13
トール

@Thorあなたは正しいですが、bzzt3で割り切れる数字のみを印刷できると述べているので、私は規則の範囲内にいます。
ドクトロライチャード14年

1
ルールでは、数字に3が含まれている場合、または3で割り切れる場合、数字を言うことはありません。代わりに、「Bzzt」と言うので、両方を置き換える必要があります。
トール14年

@Thor一番気になっているのは、文の中央にある小さなカンマです。私はまた、第二のルールを説明している、やっての両方の方法が等しく有効で、それを解釈してきた方法:番号が唯一の要件1を満たさなければならない...(3を持っているか、3で割り切れることのいずれか)
Doktoro Reichard

1
小文字は2バイトのトークンであるため、ここでバイトを誤ってカウントしました。Thorのルールの解釈には同意します。これは上記のすべての回答で使用されているルールであるためです。
リルトシアスト

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
アナトリグ

4
@anatolyg「1または0(選択した)から開始して、正確に500までカウントする必要があります。」-私は1から開始することを選んだ
うるさいossifrage

そのビットを逃した。ごめんなさい!
アナトリグ14年

引数を渡すとさらにスキップされます(笑)。しかし、それはよくゴルフされています、それをあなたにあげます!sprintfの戻り値を使用して、3桁の数字を使用してwhileを制御します(笑)。とても悪い....笑!
ドリームウォーリアー14年

5

ジュリア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

グルーヴィー-51

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

編集:times印刷バージョンの使用は、「表示」と同じくらい短くなりました。ありがとう@ will-p


1
+1。あなたは入れ替えることができます(1..500).eachのために500.times
ウィル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...ここに何か問題があります。
squeamish ossifrage 14年

私は貪欲すぎて、未定義の動作(変数が変更され、シーケンスポイント間で読み取られる)につまずいたようです。修正されました。
アナトリグ14年



4

T-SQL 2008-80

勝つつもりはありませんが、それでも楽しいだけです:@domagerのおかげで微調整されました:

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

少し知られている事実、@は変数の有効な名前です。セットベースのコードはより多くのSQLバリアントであるため奇妙に感じますが、短いほど短くなります!このバージョンはどのデータベースでも動作します。編集:私はセミが必要ないので2つのセミを削除することができました。これが最適であると確信しています。

Edit2:決して言わないでください。ここでは、gotoを使用することでより粗雑になりましたが、ブロックを回避できます。while、begin、endを短いif、t:、gotoで置き換えて、6文字を保存できます。また、ループを擬似do-whileとして書き直すことにより、ステートメントを再配置します。編集3:ええ、どういうわけか今は短くなっています。元の:

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

masterデータベースで実行する必要があります。騒がしくてugい方法にもかかわらず、私はT-SQLが大好きです。これを簡単にする方法があるかもしれませんが、残念なことに、iif組み込みでは両側で型が一致する必要があります。SQLサーバーの優先ルールは、文字列よりもintに高い優先順位を与えます。数字も非常に長いですが、エイリアシングは価値がある以上の文字です。数値を文字列に変換するより良い方法があるかもしれません。編集:strも動作します。ltrimより2文字少ない


最初は、コードが2012.96バイトの長さだと思っていました。
nyuszika7h 14年

少し長い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()の使用は、if(...)print else printよりも短いので、iif式を使用することでかなりの効果が得られます。また、我々は短いを使用することができます@+=1文字を保存するために
マイケル・B

T-SQLがサポートされていることを知りませんでした+=。テストするのは便利ではありませんが''+@、不変ロケールを使用した文字列変換をサポートしていると確信しています。
ピーターテイラー14年

+=2008年に追加されました。 '' + @をサポートしていますが、望みどおりには動作しません。先ほど言ったように、優先順位規則は最初にintにキャストさ''れるため、int にキャストされ、結果としてゼロになるため''+@@引き続きとして入力されますintstr動作し、それは他の何よりもそれほど高価ではありません(カッコ用の2つの余分な文字)。ここでt-sql 2012を選んだのは、IIFおそらく2016年のリリースのsqlがノイズの一部を取り除き、競争力を高める(おそらくない)ことを知っているオペレーターのためです。
マイケルB 14年

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はインラインif(x? "Y": "N"と考える)を意味し、x / 3は浮動小数点除算を行い、x \ 3は整数除算を行い、instrは文字列のcharの位置を返します。それ以外の場合、true = -1およびfalse = 0。

コードは基本的にxをインクリメントし、x / 3 = x \ 3 = instr(1、x、3)がtrueの場合はxを出力し、それ以外の場合は「Bzzt」を出力します。x / 3 = x \ 3は(float)(x / 3)と(int)(x / 3)を比較し、ブール値を返します(0はfalse、-1はtrue)。instr(1、x、3)は、数値に「3」が含まれていない場合は0を返し、そうでない場合は正の整数を返します。式がtrueを返すのは、(x / 3 = x \ 3)がfalse(0)でinstr(1、x、3)が0の場合、つまりxが3で割り切れず、数字「3」が含まれています。これはまさに探しているものです。


4

k4 (37)(35)

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

k4組み込みのモジュロコマンドが不足しており、これを使用qすると余分な文字が必要になります。このバージョン(ab)は、組み込みの出力形式を使用しxて、3 で除算した結果の文字列に小数点があるかどうかを確認します。

編集:

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

巧妙であってもよい小数点のマッチングとして、私はそれがチェックすることにより、2つのバイトを剃ることができ3*floor x%3、依然としてありますx


小数点の巧妙な一致に賛成です!
マーク14

回答をすべて更新しないでください。これにより、すべてのアクティブな課題がフロントページから押し出されます。一度に1つまたは2つしかやらないといいですね。(私もの間に変化はないと思うが、h1h2最初の場所で編集を保証するのに十分なことが重要です。)
マーティン・エンダー

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は少し錆びています。しかし、andオペランドで短くなりませんか?i%3> 0 &&( "" + i).indexOf(51)<0?i: "bzzt"。forループの{}をスキップすることもできます。
WozzeC 14年

:これは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"));}}
ルイジ・コルテーゼ

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"

多くの文字列操作関数(などstrsplitgreplは、文字以外を入力するとエラーをスローするため、同様に行うと想定しました。ナイスキャッチ!+1
プランナパス14年

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は、1 <= x <= nの場合にのみ、ラベルLの1つに分岐します。

編集:数字3をチェックするループを再配置することにより、4バイトを削減しました。ボーナスとして、コードには算術if-statementも含まれ、if(x) a,b,c常に3つのラベルのいずれかに分岐します:a if x <0、b x == 0の場合、またはx> 0の場合はc。

残念ながら、最初の2つのバージョンでは正しい出力が生成されませんでした。digit-3ループが正しく機能するようになり、コードに最新の論理if文も含まれるようになりました。誰がenddo声明を必要とするので、さらに3バイトがなくなっていますか?ここで出力を確認できます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.