Jouer le jeu "bzzt"


56

Gagnant: La réponse CJam d'Aditsu ! Un énorme 25 octets! Agréable!

Vous pouvez continuer à envoyer votre réponse, mais vous ne pouvez plus gagner. Poste originale conservée pour la postérité:


Le jeu "Bzzt" est un jeu dans lequel vous devez compter jusqu'à un nombre (dans ce cas 500). Cependant, si le nombre contient un 3 ou est divisible par 3, vous ne dites pas le nombre. Au lieu de cela, vous dites "Bzzt".

Règles:

  • Vous ne pouvez pas coder les chiffres en dur.
  • Le numéro doit seulement satisfaire au moins une des exigences suivantes
    • Divisible par 3
    • Le nombre contient un 3
  • Certains types de séparateurs sont obligatoires (12bzzt14 ne compte pas)
  • Le score est mesuré en octets.
  • Vous devez compter exactement à 500, à partir de 1 ou 0 (à vous de choisir).
  • Les nombres doivent être sortis, mais peu importe comment (par exemple, stdout, écrire dans un fichier texte, etc.).
  • 0 peut être divisible par 3 ou non divisible. Tu peux choisir.
  • Vous pouvez sortir les numéros un à un (ex, sortie 1, puis 2, puis bzzt, puis 4, etc.) ou tous en même temps (par exemple, sortie 1 2 bzzt 4 5).
  • Vous devez remplacer la lettre 3 par le mot "bzzt". Ce n'est pas sensible à la casse (bZzt, Bzzt, bzzt, ça va).

  • Ceci est un défi de , donc le code le plus court gagne.
  • Ce concours se termine le 30 juin 2014 (7 jours après l'envoi).

1
Aux fins de cette question, 0 est-il divisible par 3?
Οurous

2
Est-ce "buzz" ou "bzzt"? Vous avez écrit "buzz" deux fois jusqu'à présent.
Aditsu

3
Précisez s'il vous plaît. Dois-je sortir buzzou bzztsi les deux exigences s'appliquent? Dois-je sortir 12bzzt4ou bzztpour 1234?
Nyuszika7h

4
Je dirais bzztpour 1234. C'est un jeu de beuverie 'courant' ici (seulement nous le faisons souvent à 7)
Martijn

66
"0 peut être divisible par 3 ou non divisible. Vous pouvez choisir." Je ne pense vraiment pas que vous puissiez choisir. 0 mod 3 est 0, ce n'est pas vraiment une question d'opinion.
David Conrad

Réponses:


33

CJam - 25

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

Merci Howard :)

Essayez-le sur http://cjam.aditsu.net/

Explication:

501{…}fIest fondamentalement for(int I=0; I<501; ++I) {…}
3sconvertit 3 en chaîne, c'est-à-dire que "3"
I3%est I% 3
<obtient la sous-chaîne de gauche - "3".substring(0, I % 3)- qui est "" pour I% 3 == 0 et "3" sinon
Isconvertit Ien chaîne
-avec 2 chaînes fait une différence définie, résultant en un vide Chaîne si I% 3 == 0 (la première chaîne était vide) ou Icontient 3 chiffres, c'est
…I"bzzt"?comme … ? I : "bzzt"; la chaîne précédente est traitée comme une valeur booléenne, où "" est faux et toute autre chaîne est vraie,
Najoute une nouvelle ligne


Vous pouvez utiliser la même astuce que dans ma solution golfscript et sauver la logique et: 501{3sI3%<Is-I"bzzt"?N}fI.
Howard

29

Ruby, 43 ans

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

Assez simple.

Edit: Un octet enregistré, merci Howard!


1
Vous pouvez enregistrer un seul espace si vous écrivez "#{a}"[?3]||a%3<1.
Howard le

@ Howard: En effet, merci beaucoup!
Ventero

1
Encore plus illisible mais malheureusement même longueur: "#{a}"[?3[0,a%3]].
Howard

Qu'en est- il de remplacer putsavec pet sauver 3 caractères?
David Unric

1
@DavidUnric affiche ple résultat de l'appel inspectsur son argument (par rapport à put, qui appelle to_s). Ainsi, au lieu d’imprimer Bzzt(ce qui est :Bzzt.to_s), il s’imprimerait :Bzzt, ce qui ne correspond pas aux spécifications de sortie.
Ventero

25

seq et GNU sed - 42 33 31 30

Fonctionne directement au tiret, il peut être nécessaire de désactiver l’extension d’historique, par exemple avec bash set +H:

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

Comment ça marche?
nbubis

L'expansion de l'historique est désactivée par défaut dans les scripts shell.
Nyuszika7h

@ nyuszika7h: c'est vrai, mais j'espère que beaucoup essaieront la réponse dans un shell interactif.
Thor

1
@nbubis: la version mise à jour fonctionne en générant la séquence avec seq. 0~3!runs {/3/!b}et ensemble ces expressions laisser la ligne est si elle est non divisible par et ne contient pas de 3. Le dernier bit « corrige » la ligne à bzzt.
Thor

18

Code machine x86 sous DOS (fichier .com) - 71 octets

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

Imprime la sortie requise sur stdout avec l’espace comme délimiteur; peut être exécuté sans problèmes dans DosBox.

Assemblée commentée:

    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
LE RESPECT!!!!! Incroyable!
Yossico

@yossico: merci! :) en fait, ça n'a rien de spécial, je suis sûr que les personnes qui ont écrit Assembly pour DOS pourraient sûrement se débarrasser de quelques octets de plus.
Matteo Italia


17

PHP, pas de séparateur - 62, 61,59,58,52,49 47

Il ne dit pas qu'il devrait y avoir un espace / nouvelle ligne / séparateur entre eux, sans:

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

Avec le séparateur, 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
  • Je viens de trouver un petit "tricheur", pas besoin d'espace après echo, m'a sauvé un peu.
  • Le crée une nouvelle ligne
  • Un autre petit "tricheur", le bzzt n'a pas besoin de guillemets (testé). Pas la voie à suivre, mais ça marche.

Javascript - 54,51 50

Même principe, mais fonctions javascript:

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

Merci @ core pour les crochets et pour () astuce. Le pour m'a fait planter mon navigateur plusieurs fois ^^
Martijn

Haha. Je l'ai testé avec console.log()évidemment, mais c'est plus court.
Martijn

1
Votre solution Javascript compte pour 501.
nderscore

1
PHP pour 52: <?for(;500>$i++;)echo$i%3*!strpbrk($i,3)?$i:bzzt,~õ;le caractère õ245 est un caractère inversé \n.
dimanche

1
Vous pouvez remplacer !strpbrk($1,3)par trim(3,$i)pour économiser 4 octets
aross

16

Javascript 50 49

-1 octet grâce à core1024

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

Je savais que cela pourrait être fait! Mais n'a pas trouvé comment
edc65

1
Vous pouvez imaginer mon visage quand une solution JavaScript bat mon LiveScript.
nyuszika7h

dans votre deuxième solution, vous pouvez supprimer un & signe et cela fonctionnera toujours
user902383

@ user902383 Ce n'est pas un résultat valide sans &&opérateur booléen . Par exemple: 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 caractères

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

Une implémentation pas si simple dans GolfScript, peut être testée ici .


10

Perl, 36

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

Edit: Je ne suis pas un moine Perl, donc core1024 semble avoir réussi à jouer un autre octet dans sa réponse .


1
Utilisez saypour économiser 4 octets:say$_%3&&!/3/?$_:bzzt for 1..5e2
Zaid

@ Zaid pourquoi 5e2 et non 500?
Pas que Charles

@Charles: ils sont équivalents
Zaid

1
@ Zaid alors pourquoi ne pas être plus clair?
Pas que Charles

4
@Charles: Dans le contexte d'un défi de code-golf, faut-il même s'en soucier?
Zaid

10

C # (71)

Peut être exécuté directement dans LinqPad.

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

1
Vous pouvez enregistrer un caractère en utilisant bitwise-or ( |) au lieu de logical-or.
Johnbot

@ Johnbot Merci pour votre suggestion.
EvilFonti

Vous pouvez également supprimer les parenthèses autour du conditionnel.
Johnbot

@ Johnbot: Ce n'est pas au niveau des bits ou. C'est logique (ou non court-circuitant), puisque les opérandes sont booléens.
Ryan M

Dump est juste LinqPad cependant, correct? Faire cela en C # en tant qu'application nécessiterait l'ajout d'une méthode d'extension. (Et c'est 'bzzt' pas 'buzz' =))
Paul

9

Python (52)

Merci grc!

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

Ancienne version:

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

1
Un peu plus court:for i in range(501):print[i,'Bzzt'][i%3<1or'3'in`i`]
grc le

4
Un personnage plus court:['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

Si j'écrivais une réponse, je laisserais tomber IO et renverrais une valeur de chaîne.
fier haskeller

1
Vous devriez également passer ==0avec<1
fier haskeller

Aussi, essayez de faire le préfixe elem. Je pense que vous devriez être capable d'écrire elem'3'$show n, ce qui est un caractère plus court. Ou pas. Je n'ai pas vérifié.
fier haskeller

@proudhaskeller: La spécification indique que les "nombres doivent être sortis", donc IO doit être impliqué. Et utiliser la elemnotation avec préfixe ne sauvegarde aucun caractère car il doit y avoir un espace avant l'apostrophe; sinon vous aurez Not in scope: elem'3'. Bon oeil avec <1, cependant!
Taylor Fausak

6

JavaScript 66 63 60

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

Merci à edc65 pour la suggestion d’utiliser array. La sortie sera maintenant séparée par des virgules.


anciennes versions

Version 1a - 66

Imprimez de 1 à 500 dans une boîte d’alerte conformément à la règle. La sortie est séparée par des espaces.

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

Version 1b - 65

Si nous considérons que 0 n'est pas divisible par 3, nous pouvons raccourcir la solution à 65 caractères:

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

Version 2 - 63

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

Merci à grc pour la suggestion de réduire la longueur.


1
Je pense que vous pourriez commencer avecfor(a=i="";i<500;)a+=++i ...
grc

Si la sortie est séparée par des virgules est OK, un tableau sera plus court: pour (o = i = []; i <500;) o [i ++] = i% 3 &&! / 3 / .test (i)? I: 'bzzt' ; alert (o)
edc65

6

PowerShell, 42 ans

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

Principalement le travail de Ventero, avec un peu d'aide sur la syntaxe de ma part ;-)


6

R, 49 caractères

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

A expliqué:

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

Usage:

> 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

Cobra - 70

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

Lot - 222

Parce que j'aime vraiment cette langue ... pour une raison quelconque ...

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)

Vous devriez pouvoir supprimer les guillemets autour des opérandes du premier ifparce que vous savez qu'il y a au moins un chiffre. En outre, concaténer le bloc complet dans le champ forwith &pourrait permettre de sauvegarder les parenthèses.
Joey

De plus, vous pouvez utiliser au ==lieu de EQUet probablement perdre quelques places ici et là.
Joey

@ Joey Merci pour les suggestions!
ousurous

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

Notez que la plupart des commandes sur TI-BASIC sont représentées sous forme d'entités à un octet.

Le code nécessite que X soit initialisé à 0 à l’avance (sinon, c’est 3 octets supplémentaires).

J'ai fait plusieurs tentatives pour supprimer plusieurs octets, je ne détaille donc pas tout ce que j'ai fait ici, pour ne pas encombrer le message. Elles visaient principalement à raccourcir la boucle, ce que j'ai fait dans cette version par une boucle While et en raccourcissant la condition If à l'aide de la Ansvariable.


Corrigez-moi si je me trompe, mais cela ne semble pas correspondre aux bzztnombres contenant des 3, par exemple 13.
Thor

@Thor Vous avez raison, mais je suis dans les règles, car ils stipulent que je peux imprimer bzztuniquement les nombres qui sont divisibles par 3. Il est possible d'ajouter l'autre méthode, mais elle nécessiterait davantage d'instructions.
Doktoro Reichard le

1
Les règles disent: si le nombre contient un 3 ou est divisible par 3, vous ne dites pas le nombre. Au lieu de cela, vous dites "Bzzt" , donc je dirais que les deux doivent être remplacés.
Thor

@Thor Ce qui me dérange le plus maintenant est cette petite virgule minuscule au milieu de la phrase. Comme je l’ai interprété, les deux façons de faire sont également valables, ce qui explique également la deuxième règle: le nombre doit seulement satisfaire à 1 des exigences ... (soit avoir un 3, soit être divisible par 3)
Doktoro Reichard

1
Vous avez mal compté les octets ici parce que les lettres minuscules sont des jetons de deux octets. Je suis d'accord avec l'interprétation des règles de Thor car c'est celle que toutes les réponses précédentes utilisent.
lirtosiast

5

C, 93

Juste pour l'enfer ...

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

Cela a un petit problème - il saute la sortie pouri = 0
anatolyg

4
@anatolyg "Vous devez compter exactement jusqu'à 500, en commençant à 1 ou 0 (à vous de choisir)." - J'ai choisi de partir de 1.
ossifrage

Vous avez manqué ce bit. Pardon!
Anatolyg

Saute beaucoup plus si vous passez des arguments, lol. Mais, c'est bien joué au golf, je vais vous donner ça! Jusqu'à utiliser la valeur de retour de sprintf lorsque vous avez tendance à vous rapprocher des nombres à trois chiffres pour contrôler le temps, lol. Tellement mal .... haha!
DreamWarrior

5

Julia 64 octets

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]est de 54 octets. De plus, renvoyer un tableau n'imprime pas tout le tableau, donc je ne suis pas sûr qu'il soit considéré comme "sortie". Si le nombre de tableaux retournés est pris en compte, il est possible [a%3==0||3 in digits(a)?"bzzt":a for a=1:500]qu'il compte 45 points.
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

... parce que pourquoi utiliser un fichier batch alors qu’il existe un one-liner parfaitement simple ... :-)


5

groovy - 51

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

edit: l'utilisation de timesla version d'impression est maintenant aussi courte que "l'affichage". merci @ will-p


1
+1 Vous pouvez échanger (1..500).eachpour500.times
Will Lp

4

C, 80

Utiliser des espaces comme séparateurs au lieu de sauts de ligne.

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... Il y a quelque chose qui ne va pas ici.
ossifrage

Il me semble que j'étais trop gourmand et que je suis tombé sur un comportement indéfini (variable modifiée et lue entre les points de la séquence). Maintenant corrigé.
Anatolyg

Je travaille maintenant :-)
ossifrage

4

Mathematica, 54 caractères

Cela semble trop simple. Des solutions plus courtes doivent être possibles.

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

Vous n'avez pas besoin des apostrophes :)
Dr. belisarius

@ belisarius en effet. Merci.
Michael Stern

4

T-SQL 2008 - 80

Ne va pas gagner ou quoi que ce soit d’amusant néanmoins: Tweaked grâce à @domager:

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

Un fait peu connu, @ est un nom valide pour une variable. Cela fait bizarre car le code basé sur le set est la variante la plus SQL, mais plus court est court! Cette version fonctionne sur n'importe quelle base de données. Edit: J'ai réussi à enlever deux des demi-finales car elles n'étaient pas nécessaires. Je suis sûr que c'est aussi optimal que possible.

Edit2: Ne dites jamais jamais. Ici, c'est encore plus brutal que d'utiliser goto, mais cela nous permet d'éviter le blocage. Nous pouvons remplacer en commençant, commencer par le plus court si, t:, allez sauvegarder 6 caractères. Nous réarrangons également une instruction en réécrivant la boucle comme un pseudo-do-while, sémantiquement équivalent. Edit3: Oui, en quelque sorte, si est maintenant plus court. Original:

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

Doit être exécuté sur la base de données master. J'adore T-SQL malgré ses manières bruyantes et laides. Il y aurait peut-être un moyen de simplifier cela, mais malheureusement, la fonction iifintégrée nécessite que les deux parties se mettent d' accord sur les types. Les règles de priorité des serveurs SQL donnent une priorité supérieure à celle des chaînes. Le nombre est également très long, mais l'aliasing est plus de caractères qu'il ne vaut. Il pourrait y avoir un meilleur moyen de transformer un nombre en chaîne. Edit: str fonctionne aussi. 2 caractères de moins que ltrim


Au début, je pensais que votre code avait une longueur de 2012,96 octets.
nyuszika7h

légèrement plus long à @ 101, mais ne repose pas sur une tabledeclare @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, tout à fait à droite, en plus, nous pouvons économiser pas mal de caractères en basculant la variable sur @. Ensuite, l'utilisation de iif () est toujours plus courte qu'une impression if (...) print sinon, nous gagnons donc un peu en utilisant l' iifexpression. Nous pouvons aussi utiliser le plus court @+=1pour sauver un personnage
Michael B

Je ne savais pas que T-SQL était supporté +=. Je ne l’ai pas sous la main pour le tester, mais je suis presque sûr qu’il prend en charge ''+@la conversion de chaînes en utilisant les paramètres régionaux invariants.
Peter Taylor

+=a été ajouté en 2008. Il prend en charge '' @, mais il ne fait pas ce que vous voulez. Comme je l' ai dit, les règles de priorité int première jetèrent il jette ''int, entraînant zéro , de sorte ''+@est @encore tapé comme int. strfonctionne et ce n’est pas beaucoup plus cher qu’autre chose (2 caractères supplémentaires pour les parens). J'ai choisi le t-sql 2012 ici à cause de l' IIFopérateur, qui sait que la version 2016 de sql supprimera une partie du bruit et commencera à être compétitive (peu probable).
Michael B

4

VBA: 54

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

Ouvrez votre programme Office préféré, appuyez sur alt + F11 pour ouvrir l'EDI VBA, collez le code dans le volet immédiat et appuyez sur Entrée.

En VBA, le séparateur de lignes est-il? est un raccourci pour print, iif signifie inline si (pensez x? "Y": "N"), x / 3 divise en virgule flottante et x \ 3 divise un nombre entier, instr renvoie la position d'un caractère dans une chaîne, ou 0 sinon, true = -1 et false = 0.

Le code incrémente fondamentalement x et génère x si x / 3 = x \ 3 = instr (1, x, 3) est vrai et "Bzzt" sinon. x / 3 = x \ 3 compare (float) (x / 3) à (int) (x / 3) et renvoie un booléen (0 est faux et -1 vrai). instr (1, x, 3) renvoie 0 si "3" n'est pas dans le nombre et un entier positif dans le cas contraire. La seule fois où l'expression renvoie vrai, c'est quand (x / 3 = x \ 3) est faux (0) et instr (1, x, 3) est égal à 0 ou, en d'autres termes, lorsque x n'est pas divisible par 3 et qu'il ne l'est pas. contient le chiffre "3", ce qui est exactement ce que nous recherchons.


4

k4 (37) (35)

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

k4il manque une commande intégrée modulo et son utilisation qprendrait un caractère supplémentaire; cette version (ab) utilise le format de sortie intégré pour vérifier si la chaîne du résultat de la division xpar 3 contient un point décimal.

MODIFIER:

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

Aussi intelligent que puisse correspondre la virgule décimale, je peux raser deux octets en vérifiant que cela 3*floor x%3est toujours x.


Upvote pour faire correspondre intelligemment le point décimal!
Mark

S'il vous plaît, ne mettez pas à jour toutes vos réponses. Cela fera sortir tous les défis actifs de la première page. Ce serait bien si vous ne faisiez qu'une ou deux fois. (Bien que je ne pense même pas que le changement entre h1et h2soit suffisamment important pour mériter un montage en premier lieu.)
Martin Ender

3

Frapper, 53 52 48 46

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

Nécessite GNU sed (utilise l’ cextension).


3

Java, 142 131 grâce à la suggestion de 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
Mon Java est un peu rouillé. Mais ne sera-t-il pas plus court avec un opérande et? i% 3> 0 && ("" + i) .indexOf (51) <0? i: "bzzt". Il pourrait également être possible de sauter le {} pour le forloop.
WozzeC

c'est 122 octets, 9 de moins: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)

Ceci est essentiellement la réponse plannapus un peu raccourcie, mais je ne peux pas commenter encore

Mise à jour: -4 caractères (voir le commentaire de plannapus)

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

Sortie:

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

Étant donné que de nombreuses fonctions d'opération sur les chaînes (telles que strsplit) émettent une erreur lorsqu'elles sont alimentées avec des caractères autres que des caractères, je suppose greplaussi. Belle prise! +1
plannapus

2
En passant, puisque vous l'avez réduite à une expression, vous n'avez pas besoin de définir bauparavant:a=1:500;a[grepl(3,a)|!a%%3]='bzzt';a
plannapus

3

Fortran - 118 114 111

Un candidat désespérément improbable, bien que développé à l’origine pour les cartes perforées. En utilisant toutes les constructions obscures du passé, certains codes courts peuvent encore être écrits:

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

Le "goto calculé" se goto(L1,L2,...,Ln) xbranche sur l'une des étiquettes L si et seulement si 1 <= x <= n.

Éditer: Il a été possible de supprimer 4 octets en réorganisant la boucle qui recherche le chiffre 3. En bonus, le code contient désormais également l'instruction if arithmétique if(x) a,b,c, qui renvoie toujours à l'une des trois étiquettes suivantes: a if x <0, b si x == 0 ou c si x> 0.

Malheureusement, les deux premières versions n’ont pas produit le bon résultat. La boucle digit-3 fonctionne maintenant correctement et le code inclut également une instruction if moderne et logique. Trois octets supplémentaires ont disparu, car qui a besoin d'une enddodéclaration? La sortie peut être vérifiée ici .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.