Si vous avez déjà essayé d'ajouter des étiquettes à un tracé très dense, vous vous rendrez compte que parfois les étiquettes se chevauchent, ce qui les rend difficiles à lire. Nous allons faire quelque chose de similaire mais en 1D.
L'entrée sera une séquence de (label, x-coordinate)
paires et la sortie sera le résultat du dessin de chaque point et étiquette, dans l'ordre donné. Un astérisque *
représentant le point doit être placé à la coordonnée x donnée et l'étiquette doit suivre. Tous les caractères existants seront remplacés.
Par exemple, si l'entrée était
Hello 0
World 8
Fizz 3
Buzz 5
PPCG 16
X 9
Ensuite, ce qui se passerait:
*Hello
*Hello *World
*He*Fizz*World
*He*F*Buzzorld
*He*F*Buzzorld *PPCG
*He*F*Buz*Xrld *PPCG
La ligne finale doit ensuite être sortie.
Règles d'E / S
L'entrée peut être constituée de n'importe quel nombre de paires. Chaque étiquette se composera uniquement de lettres majuscules et minuscules, et les longueurs d'étiquette seront au plus 127 caractères. Chaque coordonnée x sera comprise entre 0 et 127 inclus.
L'entrée peut être dans n'importe quel format de liste ou de chaîne pratique de sorte que les paires soient sans ambiguïté et que les étiquettes / coordonnées x alternent dans l'entrée. Par exemple, un format comme
[("Hello", 0), ("World", 8) ...]
ou[0 "Hello" 8 "World" ...]
est très bien. Cependant, vous ne pouvez pas supposer deux listes distinctes d'étiquettes et de coordonnées x.Les fonctions et les programmes complets sont tous deux corrects.
Tout point non couvert par une étiquette doit être représenté par un espace. Cependant, il peut ne pas y avoir d'espaces extérieurs de début ou de fin en dehors d'une seule nouvelle ligne de fin facultative.
Exemples
Contribution:
OneLabel 10
Sortie:
*OneLabel
Contribution:
Heathrow 0
Edinburgh 2
London 4
Liverpool 6
Oxford 8
Sortie:
*H*E*L*L*Oxfordl
Contribution:
alpha 20
beta 4
gamma 57
delta 3
epsilon 22
zeta 32
eta 53
theta 27
Sortie:
*delta *a*epsi*thetazeta *eta*gamma
Contribution:
abc 5
d 5
abc 10
ABCDEFGHIJKLMNOPQRSTUVWXYZ 127
Sortie:
*dbc *abc *ABCDEFGHIJKLMNOPQRSTUVWXYZ
Notez que les étiquettes et / ou les coordonnées x peuvent être répétées.
Réponses:
CJam,
242319 octetsCela lit l'entrée comme un tableau CJam de paires d'étiquettes de coordonnées.
Essayez ce violon dans l'interpréteur CJam ou vérifiez tous les cas de test à la fois.
Merci à @ MartinBüttner de m'avoir aidé à économiser 4 octets!
Comment ça marche
la source
Pyth, 20 octets
Essayez-le en ligne: démonstration ou suite de tests
Explication
la source
JavaScript ES6, 104 octets
Exemple d'utilisation
Entrée dans une console compatible:
Sortie de la dernière instruction:
Explication
Cela crée une fonction anonyme de
c
à trois expressions qui ont été logiquement ET combinées. Les deux premières déclarations sont toujours véridiques, et les règles de court-circuit JS disent que chaque fois que la première est véridique, retourne la valeur entière sur le côté droit (sans forcer à booléen): c'est donc formellement équivalent àLa première instruction doit être placée entre parenthèses ci-dessus car l'opérateur d'affectation
=
a une priorité inférieure à l'opérateur logique ET&&
.L'assemblage "paramètre de repos"
..."*"+v
fait également partie d'ES6; il concatène un début*
à la chaîne, puis l'interprète comme un paramètre de type liste, le divisant en un groupe d'arguments fournisArray.prototype.splice
, qui prend(m, n, ...rest)
et modifie son tableau en positionm
pour supprimer desn
éléments, puis insère tous lesrest
arguments. Pour ce faire avant ES6, vous utiliseriez le plus lourd:Le tableau est ensuite concaténé avec la chaîne vide et les espaces de fin sont supprimés.
la source
Python 2, 67 octets
Prend l'entrée comme
[('Heathrow', 0), ('Edinburgh', 2), ('London', 4), ('Liverpool', 6), ('Oxford', 8)]
et imprime le résultat.Python n'autorise pas la modification des chaînes, et la conversion vers et depuis une liste coûte cher. Ainsi, cela recrée la chaîne
z
à ajouter dans un nouveau mot. Nous prenons lesb
caractères avant le mot, en remplissant les espaces si nécessaire, puis le nouveau texte avec un astérisque, puis la partiez
après le nouveau mot. Notez que les espaces de fin ne sont jamais ajoutés.La
reduce
version est plus longue de 3 caractères (70):la source
Rubis,
948175 octetsGolfé:
Voici le code non golfé:
Merci @ w0lf pour les suggestions sur le mappage de l'entrée!
Merci @ w0lf et @Not que Charles pour la réflexion sur la suppression d'une variable.
la source
puts
par$><<
(ce qui ne nécessite pas d'espace supplémentaire)..chomp
peut être supprimé..to_i
va l'attraper. Bonne pensée. Merci @ w0lf!s[int, int]
formulaire au lieu des[range]
pour 1 épargne.Javascript 121 caractères
En utilisant des fonctionnalités non standard, fonctionne sur Firefox.
x=Array(255).fill(" ");eval(prompt()).map(s=>{s[0].split``.map((n,i)=>x[s[1]+i+1]=n);x[s[1]]="*"});x=x.join``.trimRight()
Ancienne version:
x=Array(255).fill(" ");eval(prompt()).map(s=>{s[0].split``.map((n,i)=>x[s[1]+i+1]=n);x[s[1]]="*"});x=x.join``.replace(/ +$/,"")
la source
/ +/
est beaucoup plus logique que\s
déçu, j'ai raté ça! Pourriez-vous enregistrer des octets en utilisantx=' '.repeat(255);
et en évitant le.join
?.split('')
dans une structure de données mutable, mais à ce stade, elleArray(255).fill(' ')
est plus courte. Dans ma version, la plupart de mes économies proviennent de (a) l'utilisation de la règle "vous pouvez donner une fonction ou un programme" à supprimereval(prompt())
en échange dec=>
et (b) en utilisant laArray.prototype.slice
méthode intégrée avec un paramètre de repos pour raccourcir un peu la partie logique .[].map.call(s[0],
n'en sauve pas non plus ...Python, 85 octets
Essayez-le en ligne
la source
'z'[2::5]
(backticks au lieu d'apostrophes) au lieu d'''.join(z)
enregistrer un octet, et le déplacementz=[' ']*256
vers les paramètres devrait en enregistrer un autre. De plus, je pense que vous pouvez changerreturn
pourprint
.p=input()
(Python 2) plutôt qu'une fonction, ce qui évite l'indentation. En outre,b+len(a)+1
peut êtreb-~len(a)
for a,b in input():
.Perl, 66 octets
Script de 63 octets + 3 octets pour
-p
Rien de trop spécial, en utilisant les variables
$`
et$'
qui sont «avant la correspondance» et «après la correspondance» respectivement, au lieu de diviser la chaîne. J'ai utilisé un$}
pour la variable chaîne car à l'origine il me faisait économiser un octet, mais ce n'est plus le cas!Exemple d'exécution:
Perl, 65 octets
Script de 62 octets + 3 octets pour
-p
Une autre version qui imprime chaque ligne (pour un octet de moins!). (Oui, je l'ai fait parce que je n'ai pas bien lu la question ...)
Exemple d'exécution:
la source
PHP - 84 octets
Utilise les codes d'échappement ANSI pour positionner le curseur (
\x1b[XG
, avec le caractère d'échappement et X étant la coordonnée basée sur 1), suivi de la*
chaîne d'entrée de cette ligne. Accepte la saisie sur la ligne de commande du formulaire:Accepte les entrées de plusieurs mots si elles sont entre guillemets, car ce sont des arguments de ligne de commande.
la source
C ++ 11, 95 octets
Pourquoi pas?
En tant que fonction, recevez l'entrée en tant que
map<int, string>
nomv
contenant la position et la chaîne.Usage
Vérifiez-le en cours d'exécution ici
la source