Je définis le n-ième ternaire comme un ternaire qui retourne n et a la forme:
1 ? 2 ? 3 ? n - 1 ? n : 0 : 0 : 0 # n - 1 zeroes
Écrivez une fonction ou un programme complet qui, étant donné une entrée n, affichera ou renverra le n-ième ternaire. Code-Golf.
Cas de test
0 #=> undefined behaviour
1 #=> 1
2 #=> 1 ? 2 : 0
3 #=> 1 ? 2 ? 3 : 0 : 0
10 #=> 1 ? 2 ? 3 ? 4 ? 5 ? 6 ? 7 ? 8 ? 9 ? 10 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0
Le 1000 e ternaire, je pense qu'il y a une sorte d'harmonie zen.
Réponses:
Pyth -
191817 octetsLes espaces me tuent, pensant à une meilleure façon de les gérer.
Il joint simplement les nombres par un
" ? "
, puis concatène la deuxième partie.Essayez-le en ligne ici .
la source
CJam,
1818 octetsEssayez-le en ligne .
Explication
la source
:)
.Rubis, 31 octets
Tester:
la source
array * string
==array.join string
... intéressantf[0]
?irb(main):007:0> f[0] ArgumentError: negative argument from (irb):6:in * from (irb):6:in block in irb_binding from (irb):7:in [] from (irb):7 from /usr/bin/irb:11:in <main>
CJam, 19 octets
Juste un début ...
Comment ça fonctionne
Essayez-le en ligne ici
la source
Brainfuck, 305
(Sans numéro d'entrée de STDIN, voir modifier en bas)
J'ai utilisé ce joli algorithme pour imprimer un nombre, ce qui prend 155 octets de l'ensemble du programme.
Il fonctionne pour des entrées jusqu'à 32 768 (limitation de 16 bits de l'algorithme). Il ne produit pas d'espaces de fin et fonctionne également pour la saisie
1
:Visite rapide:
Configuration (97 octets)
Première partie (181 octets)
Deuxième partie (27 octets)
S'il était permis de mapper les 8 commandes Brainfuck à 3 bits, alors ce programme prendrait 114 octets et 3 autres bits
Unaire, ~ 4,08 * 10 ^ 275 octets
Il serait trop long pour ici, mais il est juste 408452257862560239329948606295286361112603208650130608525040044700379331457759667646985586658469601803889628246410788572492437928714867190270708935427798983714797786123292750743771225096145575210320040188155473030775033228313350778616384531426430459309802833775612506568528463 zéros et fonctionne de la même que le programme Brainfuck.
ÉDITER : J'ai foiré, ce programme ne prend pas vraiment d'entrée utilisateur, il utilise juste la valeur actuelle du pointeur comme entrée. Pour pouvoir analyser un nombre beaucoup plus serait nécessaire et je ne peux pas être dérangé pour le faire.
Il fonctionne donc avec une valeur directement entrée dans le programme (en ajoutant n fois "+" avant le programme) mais pas avec STDIN
la source
JavaScript (ES6),
4239 octetsLa fonction externe
f
prend la valeur d'entrée, puis appelle la fonction interneg
récursivement la pour construire la chaîne du milieu vers l'extérieur, en utilisant la valeur d'entrée au maximum pour tester le cas de base.Non golfé:
la source
Python
5655la source
C # - 76
la source
Haskell, 53 octets
Comment cela fonctionne: créez la chaîne de l'intérieur vers l'extérieur en commençant par une chaîne vide et en boucle de
n
bas en haut2
avec le préfixe du numéro actuel et un?
et l'ajout d'un: 0
. Enfin mettre un1
devant tous.Une approche différente (grâce à @Mauris désormais 9 octets plus court):
Haskell,
6051 octetsFonctionnement: un littéral
1
suivi de? <x>
pour chaque<x>
entrée[2..n]
suivi d'une constante: 0
pour chaque<x>
entrée[2..n]
.la source
g n='1':((=<<[2..n])=<<[(" ? "++).show,\x->" : 0"])
(\_->" : 0")=<<[2..n]
par[2..n]>>" : 0"
Pyth, 17 octets
Manifestation.
la source
Julia,
4431 octetsCela crée une fonction sans nom qui accepte un entier en entrée et renvoie une chaîne. Pour l'appeler, donnez-lui un nom, par exemple
f=n->...
.D'abord, nous réunissons les entiers 1 à n , en séparant chacun avec
?
et les espaces en une seule chaîne. Ensuite, nous y ajoutons la chaîne" : 0"
répétée n -1 fois.Exemples:
la source
JavaScript ES7, 62 octets
Je ne sais pas si je peux jouer au golf plus. Mais c'est une solution assez simple
Firefox uniquement:
Équivalent ES5:
la source
CoffeeScript, 52 octets
Explication
la source
SWI-Prolog, 90 octets
Ne va certainement pas gagner, mais la
\+ (between(1,TopBound,N),\+do_something(N))
construction est assez intéressante pour répéter quelque chose sur une séquence d'entiers.la source
Swift 145 (135 sans espace blanc)
Pouvez-vous croire que la partie à sous-chaîne est en réalité plus longue que la partie à produire l'expression.
la source
str[1]
oustr[0...5]
. Bien sûr, vous pouvez faire une petite extension, mais je souhaite que la bibliothèque standard permette celaPerl, 36 octets
35
caractères+1
pour-n
.Courir avec:
la source
Java, 71
Je n'ai pas pu m'en empêcher après avoir commenté la réponse de RCB . Voici donc un autre Java (71 comme wow quand Java n'est-il pas le plus long!)
la source
Java,
12588 octetsOriginal
Avec un formatage et des noms de variables plus agréables:
Amélioré - Merci aux commentaires de Jack Ammo ci-dessous:
la source
e+=" : 0";
. Vous pouvez ensuite enregistrer 1 octet en post-incrémentant i lorsqu'il est utilisé au lieu de sur la ligne forloop.for(int i=1;i<n;){s+=i+++" ? ";
Votre déclaration de retour n'aura plus besoin de l'espace ajouté après nreturn s+n+e;
. Vous pouvez également enregistrer 1 octet à l'aide dee=s
. De plus, l'instruction if au début n'est pas nécessaire car la logique de la boucle for garantira de toute façon ce résultat.JavaScript (ES6), 59 octets
Même approche que ma réponse CoffeeScript, en utilisant l'aide des chaînes de modèle.
String.prototype.repeat
coûte trop de caractères.Démo
Firefox uniquement pour l'instant, car c'est ES6.
la source
K, 36 octets
la source
Python 2,
63605856Essayez-le ici
Solution simple: (63)
Edit : je voulais vraiment essayer une fonction récursive. Le voici: (56)
Edit : Quelqu'un sait pourquoi cela ne fonctionne pas? J'ai essayé une liste avec un index de
c<n
, mais cela n'a pas fonctionné en raison d'une erreur de débordement de pile. Même chose avec ceci:la source
0*
.rs , 77 octets
Démonstration en direct et cas de test.
Explication:
Développez le nombre en une série de N soulignements.
Créez à plusieurs reprises une gamme de traits de soulignement, séparés par des espaces. par exemple, cela se transformerait
___
en_ __ ___
.Ajouter au dernier ensemble de traits de soulignement (de longueur N) N-1 instances de
: 0
.Remplacez chaque groupe de traits de soulignement par sa longueur, précédé de
?
, SAUF pour le premier.Remplacez le premier par le chiffre 1.
En raison du format, cela gère également
0
bien: il imprime simplement la chaîne vide.la source
Swift,
7975 octetsf
est implicitement déclaré comme une fonction avec unInt
paramètre qui renvoie unString
Fonctionne avec
n >= 1
et se bloque lors de l'exécution lorsquen == 0
. Il n'y a pas d'espaces de fuiteEdit: Géré pour supprimer 2 * 2 caractères, car l'interpolation de chaîne n'est pas toujours la plus courte
Remarque à modifier: ce code prend une éternité (il ne s'arrête pas) pour être compilé, mais il le serait certainement si le compilateur était capable de le gérer. Jetez un oeil à la version avant cette modification pour en obtenir une qui compile
la source
> <> , 32 + 3 = 35 octets
Notez qu'il y a un espace de fin sur la deuxième ligne. Le +3 est pour le
-v
drapeau, par exemple courir commePrendre l'entrée comme un point de code comme
est de 34 octets, mais je préfère la version ci-dessus car elle est plus facile à tester et ne gagnera pas de toute façon.
Explication
Il y a pas mal de pseudo-récursivité et d'abus, alors jetons un coup d'œil.
La première ligne imprime la
"1 ? 2 ? ... n-1 ? "
pièce. La pile commence avec juste l'entréen
, grâce au-v
drapeau, et nous faisons ce qui suit:> <> est toroïdal, donc ce qui précède s'exécute en boucle jusqu'à ce que la pile se compose de
n
en haut avec desn-1
zéros en dessous, point auquel elle passe à la deuxième ligne.La première fois que la deuxième ligne est exécutée, l'
n
instruction est exécutée, imprimant len
en haut de la pile. Cela ne laisse que lesn-1
zéros, et nous faisons ce qui suit, également en boucle:la source
" ? "ooo
Imprimer l'inverse de "?" (Mais bon, les palindromes) imprime l'inverse plus court que l'impression de la chaîne réelle?Scala,
78715250 octetsla source
Objective-C, 346 octets
Mettre
0
pour leint
ou quelque chose de négatif soulève uneNSRangeException
raison deoutString
contenirnil
. Cela devrait fonctionner sur iOS 2.0 et versions ultérieures et sur la plupart des dernières versions de Mac OS X.Une ventilation du code:
Déclaration de fonction standard dans Objective-C.
Crée une chaîne de destination pour la sortie
outString
, et la rend mutable. (En d'autres termes, il peut être lu et écrit.Ajoute la première partie de la chaîne à la sortie.
Nettoie le début de la chaîne pour s'assurer qu'elle
? 1
est remplacée par1
. Remarque: si elle a0
été donnée, c'est là queNSRangeException
se produirait, car il n'y a pas d'index1
.Ajoute la deuxième partie de la chaîne à la chaîne.
Crache la chaîne en arrière en utilisant
NSLog
et ferme la fonction.Production:
La saisie
0
donne ce journal de plantage:1
donne ceci:2
donne ceci:7
donne ceci:200
donne ceci:la source
C,
8478 octetsC, même s'il n'est pas le plus court, en fonction:
Au nom du golf, le
int
spécificateur de type est laissé dei
,f
etn
parce qu'elle est la valeur par défaut.i
peut être non initialisé car il s'agit d'une variable globale et par défaut à zéro.f
ne renvoie pas de valeur, mais cela ne provoque qu'un avertissement.printf
n'est pas#include
'd. Pour exécuter, voici une version complète du programme:la source
for(printf(...);--i;)
.C, 63 octets
Fonction réutilisable, prend n comme argument.
Non golfé et commenté (assez simple):
la source
Lisp commun, 84
Tout d'abord,
(loop for i from 1 to (read) collect i)
génère une liste d'entiers de 1 à tout ce qui est inséré, qui est utilisé comme seul argument de la fonction. Mais la vraie magie réside dans la chaîne de contrôle qui ressemble à du bruit de ligne."~{~A ? ~}"
itère sur la liste entière stockée dans le premier argument, en sortant chaque nombre avec le?
pour la première moitié.~@*
réinitialise la liste d'arguments au premier argument.~{~[~;~:;0~^ ? ~]~}
réitère la liste, produisant0 ?
pour chaque argument consommé, mais ne produisant rien si l'argument est 0 ou 1.la source