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 code-golf , donc le code le plus court gagne.
- Ce concours se termine le 30 juin 2014 (7 jours après l'envoi).
buzz
oubzzt
si les deux exigences s'appliquent? Dois-je sortir12bzzt4
oubzzt
pour1234
?bzzt
pour1234
. C'est un jeu de beuverie 'courant' ici (seulement nous le faisons souvent à 7)Réponses:
CJam - 25
Merci Howard :)
Essayez-le sur http://cjam.aditsu.net/
Explication:
501{…}fI
est fondamentalementfor(int I=0; I<501; ++I) {…}
3s
convertit 3 en chaîne, c'est-à-dire que "3"I3%
estI
% 3<
obtient la sous-chaîne de gauche -"3".substring(0, I % 3)
- qui est "" pourI
% 3 == 0 et "3" sinonIs
convertitI
en chaîne-
avec 2 chaînes fait une différence définie, résultant en un vide Chaîne siI
% 3 == 0 (la première chaîne était vide) ouI
contient 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,N
ajoute une nouvelle lignela source
501{3sI3%<Is-I"bzzt"?N}fI
.Ruby, 43 ans
Assez simple.
Edit: Un octet enregistré, merci Howard!
la source
"#{a}"[?3]||a%3<1
."#{a}"[?3[0,a%3]]
.puts
avecp
et sauver 3 caractères?p
le résultat de l'appelinspect
sur son argument (par rapport à put, qui appelleto_s
). Ainsi, au lieu d’imprimerBzzt
(ce qui est:Bzzt.to_s
), il s’imprimerait:Bzzt
, ce qui ne correspond pas aux spécifications de sortie.seq et GNU sed -
42333130Fonctionne directement au tiret, il peut être nécessaire de désactiver l’extension d’historique, par exemple avec bash
set +H
:la source
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.Code machine x86 sous DOS (fichier .com) - 71 octets
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:
la source
Perl - 35
4042la source
PHP, pas de séparateur -
62, 61,59,58,52,4947Il ne dit pas qu'il devrait y avoir un espace / nouvelle ligne / séparateur entre eux, sans:
Avec le séparateur,
68,67,65,64,58 / 55,53 / 5251/50echo
, m'a sauvé un peu.~õ
crée une nouvelle ligneJavascript -
54,5150Même principe, mais fonctions javascript:
la source
console.log()
évidemment, mais c'est plus court.<?for(;500>$i++;)echo$i%3*!strpbrk($i,3)?$i:bzzt,~õ;
le caractèreõ
245 est un caractère inversé\n
.!strpbrk($1,3)
partrim(3,$i)
pour économiser 4 octetsJavascript
5049-1 octet grâce à core1024
la source
&&
opérateur booléen . Par exemple:497 % 3 = 2
=>2 & true = 0
=>bzzt
for(i=0;++i<501;)alert(!/3/.test(i)*i%3?i:'bzzt')
- 49: PGolfScript,
30 à29 caractèresUne implémentation pas si simple dans GolfScript, peut être testée ici .
la source
Perl, 36
Edit: Je ne suis pas un moine Perl, donc core1024 semble avoir réussi à jouer un autre octet dans sa réponse .
la source
say
pour économiser 4 octets:say$_%3&&!/3/?$_:bzzt for 1..5e2
C # (71)
Peut être exécuté directement dans LinqPad.
la source
|
) au lieu de logical-or.Python (52)
Merci grc!
Ancienne version:
la source
for i in range(501):print[i,'Bzzt'][i%3<1or'3'in`i`]
['3'[:i%3]in`i`]
Haskell:
88828079la source
==0
avec<1
elem'3'$show n
, ce qui est un caractère plus court. Ou pas. Je n'ai pas vérifié.elem
notation avec préfixe ne sauvegarde aucun caractère car il doit y avoir un espace avant l'apostrophe; sinon vous aurezNot in scope: elem'3'
. Bon oeil avec<1
, cependant!JavaScript
666360Merci à 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.
Version 1b - 65
Si nous considérons que 0 n'est pas divisible par 3, nous pouvons raccourcir la solution à 65 caractères:
Version 2 - 63
Merci à grc pour la suggestion de réduire la longueur.
la source
for(a=i="";i<500;)a+=++i ...
PowerShell, 42 ans
Principalement le travail de Ventero, avec un peu d'aide sur la syntaxe de ma part ;-)
la source
R, 49 caractères
A expliqué:
Usage:
la source
Cobra - 70
Lot - 222
Parce que j'aime vraiment cette langue ... pour une raison quelconque ...
la source
if
parce que vous savez qu'il y a au moins un chiffre. En outre, concaténer le bloc complet dans le champfor
with&
pourrait permettre de sauvegarder les parenthèses.==
lieu deEQU
et probablement perdre quelques places ici et là.TI-BASIC - 31
(32) (34) (35) (36) (43)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
Ans
variable.la source
bzzt
nombres contenant des 3, par exemple 13.bzzt
uniquement les nombres qui sont divisibles par 3. Il est possible d'ajouter l'autre méthode, mais elle nécessiterait davantage d'instructions.C, 93
Juste pour l'enfer ...
la source
i = 0
Julia 64 octets
la source
[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.cmd.exe - 91
... parce que pourquoi utiliser un fichier batch alors qu’il existe un one-liner parfaitement simple ... :-)
la source
groovy - 51
edit: l'utilisation de
times
la version d'impression est maintenant aussi courte que "l'affichage". merci @ will-pla source
(1..500).each
pour500.times
C, 80
Utiliser des espaces comme séparateurs au lieu de sauts de ligne.
la source
1 bzzt 3 4 bzzt 6 7 bzzt 9 10 bzzt bzzt 13 bzzt
... Il y a quelque chose qui ne va pas ici.Mathematica, 54 caractères
Cela semble trop simple. Des solutions plus courtes doivent être possibles.
la source
T-SQL 2008 - 80
Ne va pas gagner ou quoi que ce soit d’amusant néanmoins: Tweaked grâce à @domager:
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:
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
iif
inté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 ltrimla source
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
@
. Ensuite, l'utilisation de iif () est toujours plus courte qu'une impression if (...) print sinon, nous gagnons donc un peu en utilisant l'iif
expression. Nous pouvons aussi utiliser le plus court@+=1
pour sauver un personnage+=
. 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.+=
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é commeint
.str
fonctionne 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'IIF
opérateur, qui sait que la version 2016 de sql supprimera une partie du bruit et commencera à être compétitive (peu probable).VBA: 54
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.
la source
k4
(37)(35)k4
il manque une commande intégrée modulo et son utilisationq
prendrait 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 divisionx
par 3 contient un point décimal.MODIFIER:
Aussi intelligent que puisse correspondre la virgule décimale, je peux raser deux octets en vérifiant que cela
3*floor x%3
est toujoursx
.la source
h1
eth2
soit suffisamment important pour mériter un montage en premier lieu.)Frapper,
53 52 4846Nécessite GNU sed (utilise l’
c
extension).la source
Java,
142131 grâce à la suggestion de WozzeCla source
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"));}}
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)
Sortie:
la source
strsplit
) émettent une erreur lorsqu'elles sont alimentées avec des caractères autres que des caractères, je supposegrepl
aussi. Belle prise! +1b
auparavant:a=1:500;a[grepl(3,a)|!a%%3]='bzzt';a
Fortran -
118 114111Un 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:
Le "goto calculé" se
goto(L1,L2,...,Ln) x
branche 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
enddo
déclaration? La sortie peut être vérifiée ici .la source