Aux États-Unis , les deux sens de circulation opposés sur une route sont séparés par une ligne jaune en pointillés si le dépassement est autorisé et deux lignes jaunes continues si le dépassement n'est pas autorisé.
(Un seul côté peut être pointillé pour permettre de passer de ce côté, et les lignes jaunes peuvent signifier d'autres choses comme les voies centrales ou réversibles, mais nous ne sommes concernés par aucun de ces cas.)
Écrivez un programme qui accepte une chaîne codée de longueurP
pour passer et N
pour ne pas passer , et imprime une version ASCII de la route correspondante. À l'exception de la ligne médiane, la route a toujours le même schéma, ce qui peut être facilement déduit des exemples ci-dessous.
Il y aura un nombre décimal positif avant chaque P
et N
dans la chaîne d'entrée. Ce nombre définit la longueur de la zone de passage ou pas de passage de la partie actuelle de la route.
Exemples
Une entrée de 12N
produirait 12 colonnes de route sans passage (ligne centrale toutes =
):
____________
============
____________
Une entrée de 12P
produirait 12 colonnes de route de passage ( -
répétition de la ligne médiane ):
____________
- - - - - -
____________
La réussite et la non-réussite peuvent alors être combinées, par exemple 4N4P9N7P1N1P2N2P
produiraient:
______________________________
====- - =========- - - -=-==-
______________________________
Ce sont 4 colonnes sans passage , puis 4 sans passage , puis 9 sans passage , etc.
Notez qu'une zone de passage commence toujours par un tiret ( -
) sur le côté le plus à gauche, pas un espace ( ). Ceci est nécessaire.
Détails
- L'entrée n'aura jamais deux
N
zones ou deuxP
zones d'affilée. par exemple4P5P
, ne se produira jamais. - Vous n'avez pas besoin de prendre en charge les lettres sans un nombre positif en tête. La plaine
P
sera toujours1P
, la plaineN
sera toujours1N
. - Il peut y avoir des espaces de fuite tant qu'ils ne s'étendent pas au-delà de la dernière colonne de la route. Il peut y avoir une nouvelle ligne de fin facultative.
- Au lieu d'un programme, vous pouvez écrire une fonction qui prend la chaîne encodée de longueur d'exécution et imprime ou renvoie la route ASCII.
- Prend l'entrée de n'importe quelle manière standard (stdin, ligne de commande, fonction arg).
Le code le plus court en octets gagne. Tiebreaker est un post antérieur.
Réponses:
CJam, 38 octets
Comment ça marche
Nous avons d' abord attribuons la colonne de route correcte aux variables
N
etP
puis évaluer simplement la chaîne d'entrée. Cela laisse une paire de la longueur et de la colonne sur la pile. Nous les regroupons, exécutons un RLD dessus pour obtenir les colonnes complètes, transposons pour les rejoindre, puis convertissons le continu--
en-
.Essayez-le en ligne ici
la source
JavaScript (ES6), 114
En utilisant des chaînes de modèle , les 5 sauts de ligne sont significatifs et doivent être comptés.
la source
rs , 252 caractères
Bien que cela puisse ne pas compter parce que j'ai ajouté l'opérateur de convergence comme arnaque à la rétine de Martin Büttner il y a une heure ... Je ne suis pas vraiment là pour concurrencer de toute façon. C'est juste amusant de créer une solution basée sur des expressions rationnelles pour cela.
J'ai reçu la ligne 2 de la réponse Retina de Martin pour les langages de programmation à travers les années .
Explication
Cela fait beaucoup de magie. Voir la réponse que j'ai liée ci-dessus pour plus d'informations.
Fondamentalement, avec l'entrée
4N4P9N7P1N1P2N2P
, ce sera le résultat:Prochain:
Cela remplace les chiffres précédant le symbole d'interdiction de passage (N) par les signes égaux. Le résultat avec l'entrée précédente:
Cette:
remplace le premier chiffre précédant un symbole passant (P) par le premier tiret. Le résultat:
Les deux lignes suivantes poursuivent le même schéma:
La première ligne remplace le reste de la ligne par le motif d'espace de tiret. Le second gère un nombre impair; il remplace le dernier tiret suivi d'un seul entier (comme
-5
) par un tiret-espace (-
). Maintenant, la sortie est:Maintenant, les choses commencent à se mettre en place. La ligne suivante:
supprime simplement le
#N
et#P
.placez les traits de soulignement en haut et en bas pour donner:
Enfin, nous supprimons
A
:la source
Haskell, 165 octets
Exemple d'exécution (
f
renvoie une chaîne, donc pour un meilleur affichage, imprimez-la):Comment cela fonctionne:
p
renvoie la ligne médiane en analysant récursivement la chaîne d'entrée et en concaténant le nombre donné de symboles trouvés par la fonction de recherchek
. La fonction principalef
rejoint une liste de cinq éléments avec des sauts de ligne, comprenant la ligne du haut (chaque caractère de la ligne du milieu remplacé par_
), un retour à la ligne, la ligne du milieu, une ligne vide et la ligne du bas (comme en haut).la source
Python 3,
169168 octets. (167 avec Python 2)Assez non golfé:
Essayez-le en ligne ici .
la source
p+=['='*v,('- '*v)[:v]][_[-1]=='P']
à la fin de la ligne précédente avec un point-virgule précédent enregistre un octet.print
.Python 2, 136 octets
Étonnamment, l'importation
re
semble en fait valoir la peine ici.la source
PHP, 187 octets
Le code peut rester sur une seule ligne; il est affiché ici sur plusieurs lignes pour être plus lisible (les espaces blancs et les nouvelles lignes utilisés pour le formatage n'ont pas été comptés).
Deux octets peuvent être enregistrés en n'imprimant pas la nouvelle ligne de fin. Cinq octets supplémentaires peuvent être enregistrés en utilisant de vrais caractères de nouvelle ligne sur
echo()
:Six octets supplémentaires peuvent être enregistrés en omettant l'initialisation de
$o
($o='';
) mais cela déclenchera une notification. L'avis peut être supprimé en exécutant le script à l'aide de la ligne de commande:Cela porte à 174 octets.
la source
Rubis,
137135 octetsPas le plus court possible, mais proche du plus beau. En partie emprunté à la réponse d'Optimizer.
Non golfé:
la source
(a.shift.zip(*a).map(&:join)*?\n).gsub'--','- '
.C, 155 octets
Plus lisible:
La boucle externe compte les lignes de 5 à 0.
La boucle du milieu itère sur des parties de la chaîne codée:
La boucle intérieure décode une partie, comme,
7P
et itère le nombre de fois nécessaire (par exemple 7).Chaque itération en imprime un
char
. La valeur dechar
est décrite par le codel%5?l^2?32:c^78?++x&1?45:32:61:95
:_
)=
)x
de 1 (il a été initialisé à 2 parsscanf
)-
), sinon imprimer 32 (espace)la source
Scala, 163 octets
D'abord, essayez de jouer au golf un peu plus.
la source
Rubis, 94 octets
Emprunte l'
gsub'--','- '
idée de la réponse de 14mRh4X0r . Je pense que cette réponse est plus intéressante, bien qu'elle soit plus courte.Essai:
Produit:
la source
permettez-moi d'inclure ma version matlab
MATLAB (267 b)
contribution
Une chaîne au format ascii entourée d'un espace (car il n'y a pas de fin de chaîne '\ 0' dans matlab
exemple V = '12N13P'
production
représentation du motif de la route
une fonction
la fonction doit être appelée depuis sa queue-1 (le caractère vide est supprimé)
exemple : p (V, numel (V) -1)
Simulation
essayez-le en ligne ici
la source
R, 132 octets
Pas très satisfait de cela, mais c'était un peu amusant à faire :) J'ai essayé de me débarrasser des multiples
gsub
, mais mes efforts ont été vains. Je soupçonne qu'il existe une bien meilleure façon de procéder.scan
obtient les cordes de STDIN et attrape la 4ème. Remarque que les lignes vides nécessitent un espace (ou quelque chose) pour que l'analyse puisse continuer à obtenir l'entrée.=
s parN
s, le-
etpar
P
s.NP
etPN
rbind
) avec le premier caractère de chaque chaînecat
.Essai
la source