introduction
Le code Parsons n'est qu'un moyen simple de décrire les variations de hauteur d'un morceau de musique, qu'une note soit plus élevée ou plus basse que la précédente.
Même si vous craignez de vous souvenir de morceaux, vous pouvez toujours vous rappeler à peu près si une note monte ou descend, ainsi le code Parsons peut vous aider à identifier une musique à l'aide d'un moteur de recherche.
La description
Chaque variation est représentée par un seul caractère, qui est l'un des suivants:
R
si la note est la même que la précédente (signifie " R epeat" )U
si la note est plus élevée que la précédente (signifie " U p" )D
si la note est plus basse que la précédente (signifie " D own" )
La note initiale est écrite comme *
.
Exemple
Voici un exemple de code Parsons (début de "Ode to Joy" ):
*RUURDDDDRUURDR
Vous pouvez réellement le visualiser , comme ceci:
*-*
/ \
* *
/ \
*-* * *-*
\ / \
* * *-*
\ /
*-*
Nous appellerons cela un contour à partir de maintenant.
Les règles de dessin de tels contours sont considérées comme explicites par l'exemple ci-dessus.
Défi
Maintenant vient le vrai défi.
Écrivez un programme qui, étant donné un contour en entrée, sort son code Parsons correspondant.
On ne vous demande pas de dessiner le contour, mais l'inverse en fait.
À partir du contour, trouvez le code Parsons d'origine.
Règles
- Les règles habituelles pour le golf à code s'appliquent
- Le programme le plus court en nombre d'octets gagne
- L'entrée est un contour et la sortie doit être un code Parsons valide
- Les détails sur les espaces supplémentaires pour l'entrée ne sont pas pertinents, faites ce qui vous convient le mieux
- Vous n'êtes pas autorisé à coder en dur, d'une manière ou d'une autre, des parties de la sortie et / ou du programme en utilisant des espaces supplémentaires en raison de la règle précédente
Remarques
- Cela pourrait être utile pour tester
- Le code Parsons correspondant pour
*
est*
- Une chaîne vide n'est pas un contour valide
- Un code Parsons commence toujours par
*
*
qui ne fait rien?*
? Nan. Il devrait imprimer,*
je suppose. J'ajouterai cette valise d'angle.*
. Toujours.Réponses:
Pyth -
28252725 octets2 byes sauvés grâce à @Jakube.
Essayez-le en ligne ici .
la source
*
comme entrée. La sortie est*0
alors qu'elle devrait être juste*
. Un zéro traînant sauvage maléfique apparut.U
etD
au fait. Sinon, bravo.CJam, 21 octets
Pliez les lignes (
:
) en vectorisant (.
) une opération maximale par caractèree>
. Puisqu'il n'y a qu'un seul caractère non-espace dans chaque colonne, celui-ci sera le résultat, car l'espace a un code ASCII plus petit que tous les caractères non-espace imprimables.Décochez et imprimez le premier astérisque
(o
, puis mappez tous les autres caractères (2%
) à l'UDR
utilisation de l'indexation modulaire.Ancienne solution (29 octets)
qN/
obtient les lignes d'entrée.z
transpose cette matrice de caractères.2%
laisse tomber chaque rangée impaire.'*f#
trouve l'index de l'astérisque dans chaque ligne.0+2ew);
obtient toutes les paires d'indices successives.::-
calcule leurs différences, et"RDU"f=
les cartes aux lettres (via l' indexation modulaire:0 → R
,2 → U
,-2 ≡ 1 → D
). Le premier'*
ajoute l'astérisque.EDIT : J'ai changé
2ew
pour0+2ew);
contourner CJam ne traitant pasew
(tranches successives) sur des listes trop courtes. Cela fait fonctionner le code pour la chaîne d'entrée*
.Essayez-le ici ou regardez-le en action:
la source
:-p
*
Cependant, cela ne fonctionne pas avec comme entrée. Je reçois une belleRuntimeException
place.[X]2ew
devrait revenir[]
au lieu de l'erreur. Je vais ajouter une solution de contournement, cependant.Python 3,
1291089886 octetsIl y a probablement plusieurs façons de jouer au golf, mais j'aime plutôt le fait que tout soit sur une seule ligne.
Modifier: maintenant en utilisant
''.translate()
Edit: Merci beaucoup à wnnmaw .
Modifier: j'ai changé le format d'entrée en un tableau de chaînes au lieu d'une chaîne séparée par des sauts de ligne pour enregistrer les octets. De plus, dans le dernier montage, j'ai mélangé
U
etR
, donc j'ai corrigé cela.L'entrée doit être un tableau de chaînes. Pour l'exemple ci-dessus, cela ressemble à ceci:
Non golfé:
la source
lambda s:'*'+"".join((('D','R')[j=='-'],'U')[j=='/']for l in zip(*s.split('\n'))for j in l if j in'\\/-')
horloges à 105 octets. La principale différence est d'utiliser un tuple conditionnel au lieu de traduireRubis, 87 octets
Nécessite des espaces de fin dans l'entrée afin que toutes les lignes aient la même longueur.
la source
>:D
.Japt, 38 octets
40 41 45 46 48Enregistré 2 octets grâce à @ETHproductions
S'il y avait une commande de trim, cela ne serait que de 38 octets; -; ajoutera une explication lorsque j'aurai fini de jouer au golf. Ce
:P
n'est pas le programme qui essaie d'être drôle, c'est en fait le programme qui ignore les caractères qui ne sont pas importants.Essayez-le en ligne
la source
x
et transposer et faire pivoter les fonctions ày
etz
(fractionner aux sauts de ligne, utiliser la fonction tableau, rejoindre avec lesYu ?"RUD"g1+(XrS c -47 g):P
Haskell, 89 octets
Exemple d'utilisation:
Transposez l'entrée et remplacez les caractères
/
/-
/\
par des chaînes singleton"U"
/"R"
/"D"
. Tous les autres caractères sont remplacés par des chaînes vides""
, qui disparaissent plus tard en concaténant tout. Enfin, ajoutez l'astérisque*
.la source
Mathematica, 103 octets
Assez court, étant donné qu'il s'agit d'un défi de traitement de chaîne.
la source
JavaScript (ES6) 90
Une fonction anonyme. Il scanne la chaîne d'entrée char par char, en prenant en compte la position dans la ligne courante. Faire cela, il construit un tableau de sortie subsituting
U D R
pour/ \ -
au bon endroitla source
Matlab, 62 octets
Cela nécessite que l'entrée soit rectangulaire (même nombre de caractères dans chaque ligne). Par exemple
Explication
la source