Contexte
Vous travaillez pour un fabricant de jeux de société et devez produire des tuiles en bois avec les numéros de 0 à n gravés dessus pour certains jeux. Cependant, sans plus tarder, certaines tuiles deviendraient indiscernables, par exemple, 6et 9. Pour éviter cela, vous devez équiper les numéros qui peuvent être confondus avec les autres (et seulement ceux-ci) d'un point sans ambiguïté, par exemple, vous auriez des tuiles comme 9.ou 6089..
Malheureusement, vous devez utiliser pour cela un appareil de gravure sur bois ancien, mais programmable, dont l'interface est si brisée que vous devez encoder tous les caractères du programme à la main dans un processus extrêmement fastidieux. Heureusement, l'appareil comprend tous les langages de programmation existants. Vous recherchez donc le programme le plus court qui imprime de telles tuiles.
Tâche réelle
Écrivez le programme le plus court qui:
- Prend un entier positif n en entrée. La façon dont l'entrée est lue dépend de vous.
- Imprime chacun des nombres de 0 à n (0 et n inclus) exactement une fois dans l'ordre de votre choix, séparés par un seul caractère d'espacement (y compris les retours à la ligne). Les chiffres doivent être imprimés sans zéros de tête.
- Ajoute un point (.) À chaque nombre qui se transforme en un autre nombre valide lors de la rotation de π (180 °), même si ce nombre est supérieur à n. Les caractères 0 et 8 de votre police sont symétriques en rotation et le 9 est un 6. pivoté. Les 2 et 5 sont distincts lors de la rotation; le 1 n'est pas symétrique en rotation. Les nombres avec des zéros non significatifs ne sont pas valides.
Exemples
Chacun des numéros suivants doit être imprimé exactement de cette façon:
2
4
5
6.
8
9.
16
60
66.
68.
69
906
909.
8088.
9806.
9886
9889.
60
être ainsi60.
?8088.
dans vos exemples un numéro à rotation non sûre qui n'a pas de 6 ou de 9.Réponses:
Pyth - 34
38Je dois remercier @ Sp3000 de m'avoir aidé à supprimer 4 octets. Au départ, j'avais une vérification supplémentaire
&@JK
qui m'assurait qu'il y avait un 6 ou 9 dans le nombre, mais après avoir lu les réponses avant de poster, j'ai lu sa réponse et j'ai remarqué que ma traduction et mon annulation identiques s'en étaient déjà occupées.Merci également à @isaacg pour avoir souligné que les chaînes sont itérables et que vous pouvez utiliser des opérations de définition sur elles. Aussi pour faire le code actuel;)
Explication:
la source
K
etJ
- utilisez simplement des chaînes à la place. Le passageK
à <backtick> 69 etJ
à <backtick> N enregistre quelques caractères, comme le fait l'incrustationK
dans le programme résultant. Le moins de temps possible avec cette technique était deVhQJ``N+J*\.&nJX_J``69``96&eN!-J"0689
34 caractères. (Deux backticks sont vraiment un.)hell`o wo`rld
_
, avant le`96
.CJam,
46444342 octetsJe pense qu'il y a matière à amélioration.
Testez-le ici.
Explication
la source
n
dans Input.CJam,
46 45 4342 octetsJe pense qu'il peut être joué un peu plus.
Prend
n
de STDIN.Essayez-le en ligne ici
la source
APL 66
Explication:
Essayez-le sur tryapl.org
Notez que dans l'interpréteur en ligne, la fonction doesn't ne fonctionne pas, j'ai donc dû la remplacer par 2⊃⎕VFI qui fait la même chose dans ce cas, exécute et renvoie le nombre, en fonction d'une chaîne.
la source
⊃,/
ou,/
vous pouvez utiliser un∊
à l'avant.Perl 5, 53 octets
Démo en ligne.
Utilise la fonctionnalité Perl 5.10+
say
, doit donc être exécutée avecperl -M5.010
(ouperl -E
) pour l'activer. (Voir ce fil méta. ) Lit l'entrée depuis stdin, imprime vers stdout.la source
Python 2,
130116113 octetsDéfinit une fonction
f
qui imprime les nombres sur STDOUT, dans l'ordre croissant.Cette fois, j'ai pensé que je prendrais une feuille du livre de @ feersum avec
.translate
:)Étendu:
Solution précédente:
Merci à @xnor de m'avoir montré l'
.replace
astuce il y a quelque temps.la source
(u''+S[::-1])
place deunicode(S[::-1])
. De plus, si vous échangez l'print
appel et l'appel récursif, les numéros sortiront dans l'ordre croissant.u""+
cela fonctionnerait réellementC #,
343309 caractèresBeaucoup trop longtemps, mais de toute façon:
Comment ça marche? Pour ajouter une période au nombre, il doit correspondre aux exigences suivantes:
0
,8
,6
et9
.6
s et9
s, etc
= le nombre avec tous les6
s remplace par9
s,c
==c
,Les nombres sont séparés par un espace.
Code avec indentation:
la source
M (MUMPS) -
7270La plupart des commandes et fonctions intégrées dans M ont des versions abrégées. J'ai utilisé les noms complets ci-dessous.
READ n
- Lire une chaîne du clavier et la stocker dansn
.FOR i=0:1:n
- Boucle de zéro àn
, incrémentanti
de 1 à chaque fois. (Le reste de la ligne constitue le corps de la boucle.)WRITE !,i
- Imprime une nouvelle ligne suivie de la valeur dei
.SET r=$TRANSLATE($REVERSE(i),69,96))
- Inversezi
, remplacez les neuf par des six et les six par des neuf et stockez-le dansr
.WRITE:r=+r*r'=i*'$TRANSLATE(i,0689) "."
:
- Indique une expression postconditionnelle, donc laWRITE
commande n'est exécutée que si elle estr=+r*r'=i*'$TRANSLATE(i,0689)
évaluée à une valeur véridique.r=+r
- Vérifiez qu'ilr
n'y a pas de zéro non significatif. L'+
opérateur unaire convertit une chaîne en nombre, ce qui supprime les zéros en tête s'il y en a.*
- Opérateur de multiplication. M n'a aucun ordre de fonctionnement; tous les opérateurs binaires sont évalués dans l'ordre dans lequel ils apparaissent de gauche à droite.r'=i
- Vérifiez que cei
n'est pas la même chose que sa version retournéer
.'$TRANSLATE(i,0689)
- Supprimez tous les zéros, six, huit et neufi
et vérifiez qu'il ne reste plus rien. ('
est l'opérateur de négation logique.)"."
- Enfin l'argument de laWRITE
commande (une chaîne littérale).Edit: rendu un peu plus court en abusant de l'opérateur de multiplication. La version précédente:
la source
APL, 53 caractères
∊{⍵,'. '↓⍨∨/(3≡⊃i)(5∊i),⍵≡'9608x'[i←⌽'6908'⍳⍵]}∘⍕¨0,⍳
la source
C # 205
209C # ne doit pas être aussi long ...
plus ou moins, un port de ma réponse JavaScript
Non golfé
la source
Rubis, 81
L'entrée provient de la ligne de commande.
Génère une liste de
String
s de0
àn
. Il les boucle et les imprime. Il ajoute un point si toutes les conditions sont remplies:6
s par9
s ne donne pas l'original0
,6
,8
et9
0
la source
JavaScript (ES6) 101
104 106 109Une fonction avec n comme argument, sortie via console.log
Edit en utilisant% 10 pour tester la réorganisation de
Edit 0
for
, je n'ai pas besoin de la compréhension du tableau après tout,Edit 3 a modifié (à nouveau) la vérification de l'interlignage 0
Non golfé et plus facile à tester
Sortie
la source
[]
? Je cherche une documentation, car je ne le savais que depuis python jusqu'à présent.Bash + coreutils, 105
Tester:
la source
sed, 467
Plus long que C # ...
J'ai à peu près terminé cela lorsque @ edc65 a souligné que les réponses doivent traiter les nombres 0-n et pas seulement n. L'ajout du code sed à l'incrémentation 0-n ajoute BEAUCOUP plus de code, car cette tâche n'est pas adaptée aux sed sans arithmétique.
Selon l'OP, la commande n'a pas d'importance, nous travaillons donc vers le bas de n à 0.
Sortie:
la source
AWK: 120
Lisez la valeur n de stdin.
Tester:
la source
Rebol - 195
Non golfé + quelques annotations:
la source
avant JC, 158
Après avoir fait cela purement en sed en utilisant toutes les opérations de chaîne et d'expression régulière sans arithmétique native, j'étais curieux de voir à quoi cela ressemblerait, à savoir toutes les opérations arithmétiques et logiques et sans chaîne / expression régulière:
La sortie est triée par ordre décroissant.
Sortie:
la source
Python - 152
la source
"."if a[i]else"" -> "."*a[i]
,int(raw_input()) -> input()
( ce qui est vraiment justeeval(raw_input())
)str(i)
par`i`
. (2) Vousa
ne l' utilisez qu'une seule fois, alors pourquoi l'assigner à une variable.str(i)
plusieurs fois. Avec laquelle puis-je remplaceri
?i
, maisi
avec des backticks, ce qui est également synonyme derepr(i)
. Vous pouvez l'utiliser au lieu destr(i)
partout, bien que si vous en avezstr(i)
autant de fois, il pourrait être plus court de l'affecter à une variable et de l'utiliser en plus d'utiliser des astuces. (c.-à-d.x=`i`; (do stuff with x)
)JavaScript -
168 129 119 113 111108Ou version lisible:
Je ne suis pas très content du regex, des idées?
Edit : Astuce soignée apprise avec
~
etfor (... of ...)
depuis @ edc65Edit2 : Conditions réorganisées
Edit3 : suggestions appliquées par @ edc65
la source
i=n+"";for(c of i)
=>for(c of i=n+"")
économisez 2 octetsc==6?A:B
=>c!=6=>B:A
=>c-6?B:A
for(c of i=n+"")
est tout à fait logique quand je le vois, mais je n'y penserais pas.c-6?B:A
Dieu m'en05AB1E ,
38373029 octetsEssayez-le en ligne.
Explication:
Explication supplémentaire pour certaines parties:
la source
Perl - 84
la source
Powershell,
111102 octetsScript de test expliqué:
Sortie:
la source
Stax , 27 octets
Exécuter et déboguer
Déballé, non golfé et commenté, il ressemble à ceci.
Exécutez celui-ci
la source