Votre but est d’afficher l’art ASCII d’une formation au bowling à dix quilles où il ne reste que quelques-unes des quilles. Le moins d'octets gagne.
Les broches des dizaines sont dans une formation triangulaire:
O O O O
O O O
O O
O
Les repères sont étiquetés de 1 à 10 comme suit:
7 8 9 10
4 5 6
2 3
1
Traceurs au fur O
et à mesure qu'il en manque .
, la formation 1 3 5 6 9 10
est:
. . O O
. O O
. O
O
Contribution:
Chaîne séparée par des espaces qui répertorie un sous-ensemble non vide des nombres 1 à 10 dans l'ordre.
Sortie:
Imprimer la formation correspondante ou la sortir sous forme de chaîne avec des sauts de ligne.
La formation doit être alignée avec la gauche de l'écran. N'importe quel espace est correct tant que l'image visible est correcte. Les lignes vides avant et après sont bien aussi.
Cas de test:
>> 1 2 3 4 5 6 7 8 9 10
O O O O
O O O
O O
O
>> 7 10
O . . O
. . .
. .
.
>> 3 5 7 9 10
O . O O
. O .
. O
.
>> 1
. . . .
. . .
. .
O
Réponses:
brainfuck -
617616604 octetsCela m'a pris la plus grande partie de deux jours. Je pense que ça valait le coup. Il est probablement possible de jouer au golf davantage en modifiant la cellule dans laquelle un objet est stocké, mais pour le moment, je suis simplement heureux de l'avoir fait fonctionner.
Ce programme devrait être complètement différent si la question ne spécifiait pas que l'entrée serait triée. Cela fonctionne en construisant une liste de 10 broches autour de celles qui sont entrées. C'est un peu déroutant mais peut-être que cela l'expliquera mieux:
Pendant ce temps, il se souvient quelles broches l’utilisateur a placées et celles qu’il a placées là. Cette stratégie serait très difficile à utiliser si l'entrée n'était pas triée.
Une autre chose que le tri facilite est la détection du nombre 10. Étant donné que le brainfuck concerne des octets individuels, et non pas des "nombres" en tant que tels, cela aurait pu être un casse-tête, mais l'entrée triée m'a beaucoup facilité la gestion avec. La raison en est liée à la manière dont j'ai stocké les données dans le programme. Je prends l’entrée un caractère à la fois et soustrais 32 du résultat. Si la cellule est non nulle par la suite, j'avance 4 cellules. avant de répéter. Cela signifie que je reçois un octet d’entrée non-espace toutes les 4 cellules et que je stocke effectivement les épingles sous leur numéro + 16. Cependant, il faut deux octets à la saisie de 10, j’ai donc dû le mettre dans un cas spécial. Si l'entrée n'était pas triée, il faudrait que je regarde à travers les punaises, mais comme elle est triée, ce sera toujours la dernière punaise si elle apparaît. Je vérifie si le (dernier octet de l'entrée + 1) == (l'avant-dernier octet de l'entrée) et, dans l'affirmative, il doit être 10. Je me débarrasse du dernier octet et mets l'avant-dernier en fonction de ce que mon système comprend "dix". Les personnages
'1'
et'0'
ne rentre pas dans un seul octet, mais le nombre 26 le fait!Utiliser des astuces pour faire fonctionner quelque chose est ce que je préfère dans l'utilisation de ce langage. :)
Si le fonctionnement de ce programme vous intéresse plus en détail, vous pouvez consulter le programme avec les commentaires que j'ai utilisés lors de sa rédaction pour vous assurer que je me souvenais de tout. Même écrire des commentaires dans brainfuck est difficile, car il n'y a pas de syntaxe de commentaire. Au lieu de cela, tous les personnages sauf ceux qui
<[+.,-]>
sont dedans sont no-ops. Il est facile d'introduire des bugs en incluant.
ou,
dans vos commentaires accidentellement ! C'est pourquoi la grammaire est si méchante et les points-virgules sont partout.EDIT: Comme exemple de combien il est facile de tout gâcher: j'ai utilisé "non-espace" dans l'un des commentaires! Quand j'ai enlevé tous les caractères non-bf de la source, le programme que j’avais l'habitude de faire était conservé dans le
-
. Heureusement, rien n'a été cassé, mais maintenant je l'ai supprimé pour sauvegarder un octet. :)EDIT II: Cela fait longtemps que je n’ai pas touché celui-ci, haha. Dans une autre réponse de brainfuck sur ce site, j'ai remarqué que j'avais accidentellement utilisé une virgule dans la version commentée. Comme l'entrée avait déjà été épuisée, la cellule actuelle était définie sur 0 (cela dépend de la mise en œuvre, mais d'après mon expérience, c'est le comportement le plus courant). J'ai corrigé le bug, mais ça m'a fait réfléchir. La manière idiomatique de définir une cellule sur 0 est
[-]
(approximativementwhile (*p) { *p--; }
), ce qui correspond à deux octets de plus. Chaque fois que toutes les entrées ont été lues, je peux les utiliser à la,
place. Cela m'a sauvé 2 octets dans cette réponse et 12 dans celle-ci!la source
Python 2, 108 octets
Appeler avec
f("3 5 7 9 10")
.i
est le numéro de la ligne, 4 étant la première ligne et 1 la dernière.z
est la nième épingle de cette rangée, 0 signifiant que c'est la première épingle de la rangée eti-1
que c'est la dernière épingle de la rangée.Le hack principal est celui
i*~-i/2-~z
qui convertit(i, z) -> pin number
. Par exemple,(4, 0) -> 7
la broche 7 est la première de la rangée 4 (la première rangée). La dérivation va comme ceci:Nous voulons une fonction prenant
i
la première broche sur la lignei
, c'est à dire4 -> 7, 3 -> 4, 2 -> 2, 1 -> 1
. Ceci est satisfait par(i**2-i)/2 + 1
, et(i**2-i)/2 + 1 + z
donne donc le numéro de pin correct pour l’entrée(i, z)
Alors simplifiez:
Pyth , 33 octets
Essayez-le en ligne.
Le programme se traduit approximativement par:
(Merci à isaacg pour les conseils)
la source
V4
est équivalent àFNU4
, etrz7
équivalent àmvkcz\
.Pyth , 31
Essayez ici .
V4
définit une boucle for, avec N comme variable sur [0,1,2,3].*dN
fournit les espaces initiaux, card
is space.Pour trouver les emplacements des broches, il utilise
+7+dZ
- 7 + d + Z.d
est:while
Z
est 0 dans la première ligne, -4 dans la seconde, -7 dans la troisième et -9 dans la quatrième. C'est parce queZ
commence à 0 et~Z-N4
diminueZ
de 4, puis 3, puis 2.Ensuite, il vérifie si l'emplacement de la broche est dans l'entrée, en utilisant
}+7+dZrz7
.rz7
est les pins désirés sous forme de liste-of-int.Ensuite, il crée un
O
si il était présent, et.
sinon. Ceci est séparé de l’espace, avecjd
et imprimé implicitement.la source
Perl 5: 51 (50 + 1 pour
-p
)Utiliser
r
flag pours///
lequel est l’un des ajouts récents de perl 5.la source
CJam,
4841 octetsWow, cela a horriblement long
Testez-le ici.
Explication
Nous générons d'abord la mise en page:
Cela donne
Et maintenant, nous remplaçons les caractères numériques en fonction de l'entrée:
la source
"789A456S23SS1":~S*7/N*[l~]'OerB,'.er
est un peu plus court.er
autoclast était destiné à la mise en réseau à l'époque."789A456S23SS1":~S*7/N*[l~]"O"erB,"."er
fonctionne très bien en 0.6.2.Python 2,
9794Ceci utilise la fonction de traduction, qui permet de faire des substitutions caractère par caractère dans une chaîne. Comme tr en perl, mais beaucoup plus longtemps à taper. Je reçois une liste de chiffres décimaux en créant une chaîne de 9 à la 99ème puissance.
la source
Javascript, 155
Premier golf, peut-être probablement plus court.
appeler avec
MODIFIER
Version ES6, 130
MODIFIER
Version ES6,échec de79Version ES6,
7277, aucune alerte, ne fait que revenirla source
.match
). C'est le plus élégant de tous.Ruby, 91
Substitue simplement les arguments de la ligne de commande avec
.
s et0
s et les imprime en utilisant une boucle de 4 cycles.Version lisible
la source
GNU sed, 75
Le score inclut 1 extra pour l'
-r
option:Entrée via STDIN:
Essayez-le en ligne .
la source
l
s .0
à10
la ligne 2,1/
à la1 /
ligne 5 et[0-9]
aux[0-9]+
lignes 7 et 9, vous pouvez supprimer la première ligne de 4 octets.CJam,
4039 octetsJe sais qu'il existe un moyen plus court, vous n'avez pas le temps de le savoir maintenant.
Comment ça marche:
Essayez-le en ligne ici
la source
APL (35)
Tester:
Explication:
17110357⊤⍨28/2
: la représentation 28 bits de17110357
:\⍨
: Pour chaque0
, donnez un espace, et pour chaque1
, prenez un élément de la chaîne à gauche.⎕∊⍨⍳10
: Lit une ligne sur le clavier et l’évalue (⎕
), puis vérifie chaque nombre compris entre 1 et 10 (⍳10
), qu’il soit contenu ou non dans input (∊⍨
).'.O'[1+
...]
: Ajoutez 1 à chaque valeur (donnant 1 et 2 au lieu de 0 et 1), puis remplacez tous les 1 par.
et tous les 2 parO
.4 7⍴
: transformer la chaîne générée en une matrice 4 x 7⊖
: retournez-le horizontalementla source
Powershell: 109
L'entrée est dans $ i
C'était amusant. J'ai appris beaucoup de choses sur le fonctionnement du pipeline.
la source
Haskell:
163160 octetsCeci accepte une ligne d'espaces séparés par des nombres
stdin
.Ungolfed:
Et un bonus:
C: 250 octets
Cette version s'attend à ce que ses arguments de ligne de commande soient la liste des nombres.
la source
Perl, 73
Et une approche de bonus loufoque qui n'a pas abouti, 90 personnages:
la source
Mathematica, 109 octets
Une fonction:
Appelé par:
Si les fonctions anonymes sont autorisées, cela peut être réduit à 105 octets :
Si l'entrée ne doit pas nécessairement être une chaîne délimitée par des espaces, mais peut être un tableau de nombres sous la forme
{3,5,7,9,10}
, vous pouvez réduire ce nombre à 79 octets :la source
Pure bash (no coreutils), 85
Remplacement de modèle simple:
La liste est entrée via les arguments de ligne de commande.
la source
Rebol - 117
Ungolfed:
la source
Brainfuck, 179 octets
Formaté:
Attend une entrée sans fin de ligne.
Essayez-le en ligne.
La bande est initialisée avec dix nœuds, chacun contenant un nœud suivi d’un zéro. L'un est la valeur initiale de la broche et le zéro facilite la navigation et sert d'espace réservé pour le caractère d'espace. Pour chaque numéro de l'entrée, cette broche est incrémentée de 3; notez que
ord('O') - ord('.') = 33
, et pendant la phase d'impression, la valeur de la broche sera multipliée par 11. (Cette multiplication sert également à générer le caractère d'espacement.) L'ordre des broches de gauche à droite sur la bande va tout simplement1
jusqu'à10
. Si l'entrée se termine par un10
, une correction est effectuée, car elle10
est initialement traitée comme un1
.Une fois l’entrée traitée, un négatif est placé après chaque ligne. Ensuite, les lignes sont imprimées en boucle, le nombre d'espaces en tête étant déterminé par le nombre de lignes traitées précédemment.
la source
Clojure, 216 caractères (ough)
Je suis sûr que cela peut être joué au golf plus loin.
Utilisez comme ceci:
la source
AWK: 96 octets
Remarque:
la source
C # - 192 octets
Parce que C #!
J'ai commencé par essayer de construire la sortie avec les mathématiques, mais la méthode simple de remplacement des jetons dans la chaîne semble être la meilleure solution pour les langages de niveau supérieur. La dépendance à Linq est longue mais reste plus courte que celle de garder un compteur et de vérifier les plages.
EDIT: retourne une ligne (-3 octets)
la source
Scala,
150148Accepte les ensembles de chaînes délimités par des espaces
la source
JavaScript ES6, 78 octets
Utilisez l'extrait suivant pour tester. Il utilise des invites et des alertes et une notation de fonction régulière pour faciliter les tests.
la source
VB / Basic-229
Mon but était de battre java ^^
éditer vbCr au lieu de chr (13)
r = r + espace (3 - (e - b))
sténographie si
utilisation de la fonction au lieu de sous
sous MAIN () -> sous m ()
la source
Java - 223 caractères
J'aimais cette façon de faire, puis j'ai réalisé qu'il me fallait un petit bidouillage, tout comme ma solution.
la source
K, 57 octets
Pas encore très compétitif, mais c'est un début:
Exemple d'utilisation:
Je commence par évaluer la chaîne d'entrée avec
.
- heureusement, les nombres séparés par des espaces constituent un littéral de liste valide en K. En ajoutant une liste vide au résultat de eval, je peux m'assurer que c'est une liste même dans le cas d'une seule broche. Puis je crée un vecteur booléen représentant les positions des pins:Ensuite, j'indexe dans une liste de chaînes pour obtenir des caractères remplis d'espace pour chaque position de la broche.
Je découpe cette séquence en lignes (
_
), les inverse (|
) et assemble chaque fragment (,/'
):Maintenant, cela commence à ressembler au modèle que nous voulons. Tout ce qui reste à faire est de clouer sur les espaces devant chaque ligne (
((!4)#\:" "),'
) et d’imprimer les lignes sur stdout (0:
).la source
Pascal (FPC) , 165 octets
Essayez-le en ligne!
Prend les nombres de l'entrée standard, imprime la formation sur la sortie standard.
Pascal (FPC) , 175 octets
Essayez-le en ligne!
Une fonction qui fait la même chose, prenant un tableau de positions de broches et renvoyant une chaîne formatée.
la source
Powershell, 84 octets
Script de test:
Sortie:
la source
Java -
371316294 caractèresLa première fois que je fais ça, je suis presque sûr que c'est merdique, mais je suis novice. Cela fonctionne également lorsque les numéros ne sont pas commandés. La numérotation est fausse, mais je n'ai pas le temps de trouver des solutions.
l'entrée est donnée par
java B 1 2 3 5 10
exemple. La sortie sera alors:la source
Japt
-Rx
,29191817 octetsL'essayer
Explication
la source