玩“ bzzt”游戏


56

获胜者:Aditsu的CJam答案!高达25个字节!真好!

您可以继续提交答案,但是您将无法再获胜。供后代保留的原始帖子:


“ Bzzt”游戏是一种您必须数数(在本例中为500)的游戏。但是,如果数字中包含3或被3整除,则无需说数字。而是说“ Bzzt”。

规则:

  • 您不能对数字进行硬编码。
  • 该号码仅需满足以下至少一项要求
    • 可被3整除
    • 编号包含3
  • 某些类型的分隔符是强制性的(12bzzt14不计算在内)
  • 分数以字节为单位。
  • 您必须精确计数到500,从1或0开始(选择)。
  • 数字必须输出,但是如何输出(例如,stdout,写入文本文件等)都无关紧要。
  • 0可以被3整除,也可以不被3整除。你可以选择。
  • 您可以一次输出一个数字(例如,输出1,然后输出2,然后bzzt,然后4,等等),也可以一次输出所有数字(例如,输出1 2 bzzt 4 5)。
  • 您必须用单词“ bzzt”代替字母3。这不区分大小写(bZzt,Bzzt,bzzt都可以)。

  • 这是一个挑战,因此以最短的代码为准。
  • 该竞赛将于2014年6月30日(发布后7天)结束。

1
出于这个问题的目的,0是否可被3整除?
2011年

2
是“嗡嗡”还是“嗡嗡”?到目前为止,您写了两次“嗡嗡声”。
aditsu

3
请澄清。我必须输出buzz还是bzzt两个要求都适用?我必须输出12bzzt4还是bzzt用于1234
nyuszika7h 2014年

4
我会说bzzt1234。这是一个“常见”的喝酒游戏(只有我们经常用7来做)
Martijn 2014年

66
“ 0可以被3整除,或者不能被3整除。可以选择。” 我真的不认为您可以选择。0 mod 3是0,这实际上不是意见问题。
David Conrad

Answers:


33

果酱-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 则为“”,否则
Is将“ 3” 转换I
-具有2个字符串的字符串会产生设置差异,从而导致为空字符串iff I%3 == 0(第一个字符串为空)或其中I包含3位数字,
…I"bzzt"?例如… ? I : "bzzt";前一个字符串被视为布尔值,其中“”为false,其他任何字符串为true则
N添加换行符


您可以使用与golfscript解决方案相同的技巧,并保存逻辑和:501{3sI3%<Is-I"bzzt"?N}fI
2014年

29

Ruby,43岁

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

非常简单。

编辑:保存了一个字节,谢谢霍华德!


1
如果编写,则可以保存一个空格"#{a}"[?3]||a%3<1
2014年

@霍华德:的确,非常感谢!
Ventero 2014年

1
甚至更难以理解,但不幸的是长度相同:"#{a}"[?3[0,a%3]]
霍华德

怎么样更换putsp和保存3个字符?
David Unric 2014年

1
@DavidUnric p打印调用inspect其参数的结果(与puts相比,后者调用to_s)。因此,它不会打印Bzzt(而是:Bzzt.to_s),而是打印:Bzzt,这与输出规范不匹配。
Ventero 2014年

25

seq和GNU sed- 42 33 31 30

直接在破折号中工作,其他一些外壳可能需要禁用历史记录扩展,例如使用bash set +H

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

它是如何工作的?
nbubis 2014年

默认情况下,shell脚本中禁用了历史记录扩展。
nyuszika7h 2014年

@ nyuszika7h:是的,但是我希望很多人会在交互式shell中尝试答案。
2014年

1
@nbubis:更新的版本通过使用seq生成序列来工作。0~3!运行{/3/!b}共同这些表情离开线是,如果它是不是整除不包含3.最后一位“纠正”行至bzzt。
2014年

18

DOS上的x86机器代码(.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 2014年


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

原理相同,但javascript函数:

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

感谢@core的括号和for()技巧。for使我的浏览器几次崩溃^^
Martijn 2014年

哈哈。我console.log()显然用它测试过,但这要短一些。
Martijn 2014年

1
你的JavaScript解决计数到501
nderscore

1
PHP为52:<?for(;500>$i++;)echo$i%3*!strpbrk($i,3)?$i:bzzt,~õ;õ是char 245,位反转\n
primo

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 2014年

1
您可以想象当JavaScript解决方案胜过LiveScript时我的面孔。
nyuszika7h 2014年

在第二个解决方案中,您可以删除一个&号,它仍然可以工作
user902383 2014年

@ user902383如果没有布尔&&运算符,这不是有效的结果。例如:497 % 3 = 2=> 2 & true = 0=>bzzt
nderscore 2014年

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为什么5e2而不是500?
不是查尔斯(Charles)

@Charles:它们是等效的
Zaid

1
@Zaid为什么不更清楚?
并不是说

4
@Charles:在进行代码高尔夫球挑战的情况下,是否还要关心?
Zaid 2014年

10

C#(71)

可以在LinqPad中直接执行。

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

1
您可以使用按位或(|)而不是逻辑或来保存字符。
Johnbot 2014年

@Johnbot感谢您的建议。
EvilFonti 2014年

您也可以删除条件周围的括号。
Johnbot 2014年

@Johnbot:不是按位或。这是(非短路的)逻辑或,因为操作数是布尔值。
Ryan M

转储只是LinqPad,对吗?在C#中作为应用程序执行此操作将需要添加扩展方法。(这是'bzzt'而不是'buzz'=))
Paul

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 2014年

4
缩短一个字符:['3'[:i%3]in`i`]
xnor 2014年

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 2014年

1
你也应该转==0<1
傲haskeller

另外,尝试使用elem前缀。我认为您应该能够写elem'3'$show n,这是一个字符短。或不。我没有检查。
骄傲的haskeller 2014年

@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 2014年

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因为您知道至少有一个数字,所以您应该能够在第一个操作数周围加上引号。另外,将forwith中的完整块连接起来&可能也可以保存括号。
2014年

此外,您可以使用==代替,EQU并且可能会在此处和此处放置一些空格。
2014年

@Joey感谢您的建议!
乌鲁斯2014年

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条件。


纠正我,如果我错了,但是这似乎没有不bzzt含有3个的,如13号
雷神

@Thor您是正确的,但我在规则之内,因为它们指出,我只能打印bzzt可被3整除的数字。可以添加其他方法,但需要更多说明。
Doktoro Reichard 2014年

1
规则说:如果数字中有3,或者被3整除,那么您就不用说数字了。相反,您说“ Bzzt”,所以我要说两个都应该替换。
2014年

@Thor现在最让我困扰的是句子中间的小小逗号。我解释它的方式,两种方法都同样有效,这也解释了第二条规则:数字只需要满足1个要求...(可以是3或可以被3整除)
Doktoro Reichard

1
您在这里误算了字节,因为小写字母是两字节的令牌。我同意托尔(Thor)对规则的解释,因为它是以上所有答案中使用的一种。
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 2014年

4
@anatolyg“您必须精确计数到500,从1或0开始(选择)。” -我选择从1开始
娇气ossifrage

错过了那一点。抱歉!
anatolyg 2014年

如果您将参数传递给它,则跳过更多,大声笑。但是,打得很好,我给你!当您趋向于控制三个数字时,立即使用sprintf的返回值来控制while,大声笑。太糟糕了....哈哈!
DreamWarrior 2014年

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).each500.times
将LP



4

T-SQL 2008年-80

仍然不会赢球或其他任何事情,但仍然很有趣:感谢@domager:

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

鲜为人知的事实是,@是变量的有效名称。由于基于集合的代码是更多的SQL变体,但是越短越短,这感觉就很奇怪!此版本适用于任何数据库。编辑:我能够删除两个半决赛,因为它们是不需要的。我很确定这是最佳的。

Edit2:永不言败。在这里,使用goto变得更加粗暴,但它使我们能够避免障碍。我们可以在开始时以较短的结尾替换,如果t:保存6个字符。我们还通过将循环重写为伪do-while(在语义上等效)来重新排列语句。Edit3:是的,如果现在缩短了。原版的:

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

必须在master数据库上运行。我喜欢T-SQL,尽管它嘈杂而丑陋。可能有一种方法可以简化此过程,但不幸的是,iif内置方法要求双方在类型上达成共识。SQL服务器优先级规则给int的优先级高于字符串。数字也确实很长,但是别名比它值得的字符更多。将数字转为字符串可能是更好的方法。编辑:str也可以。比ltrim少2个字符


起初我以为您的代码长2012.96字节。
nyuszika7h 2014年

@ 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 2014年

@domager,完全正确,另外,通过将变量切换为,我们可以节省很多字符@。然后使用iif()仍然比if(...)print else print短,因此我们可以通过使用iif表达式获得很多收益。我们也可以使用较短@+=1的字符来保存字符
Michael B

我不知道支持T-SQL +=。我没有方便的测试方法,但是我很确定它支持''+@使用不变语言环境进行字符串转换。
彼得·泰勒2014年

+=是在2008年添加的。它确实支持''+ @,但不满足您的要求。正如我所说,投第一为int所以它转换优先级规则''为int,造成零因此''+@@仍然类型化为一个intstr可以,而且没有比其他任何东西贵的多了(parens额外增加了2个字符)。我在这里选择t-sql 2012是因为IIF操作员的原因,他知道也许2016年的sql版本将消除一些噪音并开始具有竞争力(不太可能)。
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表示内联if(认为x?“ Y”:“ N”),x / 3执行浮点除法,x \ 3执行整数除法,instr返回字符串中char的位置,或0否则,true = -1和false = 0。

如果x / 3 = x \ 3 = instr(1,x,3)为true,则代码基本上递增x并输出x,否则为“ Bzzt”。x / 3 = x \ 3将(float)(x / 3)与(int)(x / 3)进行比较并返回布尔值(0为false,-1为true)。如果数字中不包含“ 3”,则instr(1,x,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

匹配小数点可能很聪明,我可以通过检查3*floor x%3still 来剃掉两个字节x


巧妙匹配小数点而赞誉!
2014年

请不要将所有答案都更新为一个。这将把所有活跃的挑战从头版推开。如果您一次只做一两次,那就太好了。(尽管我什至不认为在两者之间进行更改,h1并且h2其重要性足以确保首先进行编辑。)
Martin Ender 2014年

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 2014年

这是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 2015年

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 2014年

2
顺便说一句,由于您将其简化为一个表达式,因此您无需在此b之前定义:a=1:500;a[grepl(3,a)|!a%%3]='bzzt';a
plannapus 2014年

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之一。

编辑:设法通过重新排列检查数字3的循环来节省4个字节。作为奖励,代码现在还包含算术if语句if(x) a,b,c,该语句始终分支到以下三个标签之一:a if x <0,b如果x == 0或c如果x> 0。

不幸的是,前两个版本没有产生正确的输出。现在,digit-3循环可以正常工作,并且代码现在还包含现代的逻辑if语句。因为还有谁需要enddo声明,所以又丢失了三个字节。输出可以在这里验证。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.