On vous donne un tas de tubes à essai ASCII, votre tâche est de réduire le nombre de tubes à essai utilisés.
Chaque tube à essai ressemble à ceci:
| |
| |
| |
|~~|
| |
| |
| |
| |
|__|
De toute évidence, ~~
c'est le niveau de l'eau. Le tube à essai peut également être vide, auquel cas il n'y a pas de ~~
caractères à l'intérieur. Un seul tube peut contenir jusqu'à 8 unités de niveau d'eau.
On vous donne un nombre fini de tubes à essai avec différents niveaux d'eau à l'intérieur. Vous devez verser l'eau dans le moins de tubes à essai possible et produire le résultat.
| | | | | | | | |~~| | |
| | | | | | | | | | | |
| | |~~| | | | | | | | |
|~~| | | | | | | | | |~~|
| | | | | | | | ------> | | | |
| | | | | | | | | | | |
| | | | |~~| | | | | | |
| | | | | | | | | | | |
|__| |__| |__| |__| |__| |__|
05 + 06 + 02 + 00 ------> 08 + 05
Comme vous pouvez le voir, les éprouvettes sont séparées par un seul espace. Les tubes vides ne doivent pas être affichés en sortie. Il s'agit de code golf, donc le code avec le moins d'octets gagne.
Cas de test: http://pastebin.com/BC0C0uii
Bon golf!
Réponses:
Pyth,
484544 octetsEssayez-le en ligne.
Imprime un seul espace de fin sur chaque ligne.
la source
JavaScript (ES6),
159148 octetsSort un saut de ligne de fin. Edit: enregistré 11 octets avec l'aide de @Arnauld.
la source
s.replace(/~~/g,(_,i)=>n+=9-i/s.indexOf`\n`|0,n=0)
devrait économiser 4 octets. Vous voudrez peut-être initialiser n à -1 à la place et utilisern>>3
et~n&7^i
enregistrer un octet supplémentaire.-1
idée mais j'ai pu l'améliorerreplace
.1/"\n"
c'était vrai.Perl, 150 octets
149 octets de code +
-n
indicateur.Je ne vais pas expliquer tout le code, juste quelques petites choses:
$l+=9-$.for/~~/g
compte la quantité d'eau dans l'entrée.La deuxième partie du code imprime la sortie. L'idée est de mettre autant de tubes remplis que possible, et un dernier qui contient l'eau qui reste (le cas échéant). Donc , l'algorithme est en 4 parties: imprime la première ligne de l' eau (le haut de tubes)
say"|~~| "x$v.($@="| | ")x$r
. Ensuite, imprimez les parties vides de tubes jusqu'à ce qu'on atteigne le niveau d'eau du dernier tube:say$:=$@x$%for$l%8..6
. Ensuite , imprimez le niveau où l'eau est la dernière du tube:say$@x$v."|~~|"x$r
. Ensuite, imprimez tous les autres niveaux « vides »:say$:for 2..$l%8;
. Et enfin, imprimer la ligne de fond:say"|__| "x$%
.Les noms de variables font qu'il est difficile à lire (
$%
,$@
,$:
) mais permet des mots clés commex
etfor
à écrire après la variable sans espace.Pour l'exécuter:
Je ne suis pas très satisfait de la durée de cette réponse. J'ai essayé de tirer le meilleur parti de mon algorithme, mais une approche différente pourrait probablement être plus courte. J'essaierai d'y travailler bientôt.
la source
Befunge,
144138 octetsEssayez-le en ligne!
Les deux premières lignes traitent l'entrée, ignorant pratiquement tout sauf le premier caractère de chaque tube qui pourrait être un marqueur de niveau. Nous prenons la valeur ASCII de ce caractère, divisons par 2 et mod 2 (en nous donnant 1 ou 0 selon que nous sommes sur un marqueur de niveau ou non), multiplions cela par le numéro de ligne (en comptant à partir de 8, nous donnant ainsi la valeur de niveau pour ce tube), et l'ajouter à un total cumulé.
La sortie est gérée sur les deux secondes lignes, commençant essentiellement à l'extrême droite de la troisième ligne. Nous calculons d'abord le nombre de tubes en prenant le niveau d'eau total plus 7 divisé par 8. Ensuite, lors de l'itération sur les rangées de tous les tubes, nous calculons le caractère à afficher à l'intérieur d'un tube spécifique ( t , compte à rebours jusqu'à 0) pour un ligne donnée ( r , compte à rebours de 8 à 0) comme suit:
Le type de char calculé est -1 pour la ligne la plus basse (la base du tube), 0 pour toute autre zone qui n'est pas un niveau d'eau et 1 pour le niveau d'eau. Il peut donc être utilisé comme simple recherche de table pour le caractère approprié à afficher (vous pouvez voir ce tableau au début de la ligne 4).
la source
Haskell, 186 octets
Exemple d'utilisation:
Place un espace de fin sur chaque ligne. Comment ça fonctionne:
La principale douleur était le manque d'une fonction qui compte la fréquence à laquelle une sous-chaîne se produit dans une chaîne. Il y
count
en aData.Text
, mais l'importer conduit à un tas de conflits de noms qui sont beaucoup trop chers à résoudre.la source
Python, 261 octets
J'ai l'impression qu'il me manque quelque chose. De plus, si un tas de sauts de ligne sont acceptables pour la sortie vierge, je pourrais perdre quelques octets. Prend l'entrée comme
'| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n|__| |__| |__|'
.la source
Rubis , 139 octets
(138 octets de code plus un octet pour le
-n
)Essayez-le en ligne!
Quelques explications:
Mise à jour 1: Ajout de détails sur les variables, la
gsub
ruse et la phaseEND{
…}
.Mise à jour 2: (± 0 octets au total)
n||=0
au lieu den=n||0
(-1 octet)-n
(+1 octet)la source
Python 3, 404 octets
Ce programme crée la sortie prévue complète avec les niveaux d'eau à la fois en format ASCII et numérique.
la source