Contribution
Un entier non négatif n
et une chaîne non vide s
contenant uniquement des caractères alphanumériques et des traits de soulignement _
. Le premier caractère de s
n'est pas _
. Les traits de soulignement de s
sont interprétés comme des espaces vides qui peuvent être remplis avec d'autres caractères.
Nous définissons une séquence infinie de "chaînes infinies" comme suit. La chaîne est juste répétée infiniment de fois. Pour tous , la chaîne est obtenue en remplissant ses espaces vides avec les caractères de , de sorte que le premier de soit remplacé par , le second de , etc. Puisque la première lettre de n'est pas , chaque espace vide est finalement rempli, et nous désignons la chaîne infinie où chacun a été remplacé par sa valeur éventuelle.s1 = s s s...
s
k > 1
sk+1
sk
s1
_
sk
s1[0]
s1[1]
s
_
s∞
_
Production
Les premiers n
caractères d' une chaîne.s∞
Exemple
Considérez les entrées n = 30
et s = ab_c_
. Nous avons
s1 = ab_c_ab_c_ab_c_ab_c_ab_c_ab_c_ab_c_...
Remplaçant les blancs de , nous avonss1
s1
s2 = abacbab_ccab_caabbc_abcc_abacbab_cc...
Nous remplaçons à nouveau les blancs, ce qui se traduit pars1
s3 = abacbabaccabbcaabbc_abcccabacbab_cc...
Encore une substitution:
s4 = abacbabaccabbcaabbcaabcccabacbabbcc...
On peut déjà en déduire les 30 premiers caractères de , qui sonts∞
abacbabaccabbcaabbcaabcccabacb
Ceci est la sortie correcte.
Règles
Vous pouvez écrire un programme complet ou une fonction. Le nombre d'octets le plus bas gagne et les failles standard sont interdites. Un plantage sur une entrée incorrecte est acceptable.
Cas de test
0 "ab__" -> ""
1 "ab__" -> "a"
3 "ab__" -> "aba"
20 "ab" -> "abababababababababab"
20 "ab__" -> "abababababababababab"
20 "ab_" -> "abaabbabaabaabbabbab"
30 "ab_c_" -> "abacbabaccabbcaabbcaabcccabacb"
50 "ab_a_cc" -> "abaabccabaaaccabbacccabcaaccabbaaccabaaaccabcaccca"
50 "abc____" -> "abcabcaabcbcaaabcbcbcabcaaababccbcbabccabcabcaaaba"
Réponses:
Pyth, 17
L'entrée doit être donnée avec la chaîne sur la première ligne, et la longueur sur la seconde, sur STDIN. Par exemple:
Essayez-le ici.
Explication:
la source
APL
2928il est utilisé comme ceci:
Explication:
Tryapl.org
la source
⍣≡
est une idée astucieuse. Je devrais peut-être essayer de porter cela sur J ...CJam,
262420 octets4 octets économisés grâce à Peter.
Testez-le ici. Prend la chaîne en premier et en
n
deuxième sur STDIN.Vous pouvez exécuter tous les cas de test en les collant dans l’entrée tels quels (inclure le
-> output
si vous le souhaitez) et en utilisant le faisceau de test suivant (qui inverse l'ordre du code):Explication
Le résultat est imprimé automatiquement à la fin du programme.
Une note sur
[\]
: En principe, se[
souvient de la taille actuelle de la pile et]
collecte tout jusqu'à la dernière taille mémorisée dans un tableau. Cependant, si la taille du tableau tombe en dessous de la taille mémorisée entre les deux, le début du tableau est ajusté en conséquence. Maintenant, vous pourriez penser que l'échange des deux premiers éléments du tableau n'affecte pas du tout la taille du tableau, mais\
fait apparaître deux valeurs, puis les pousse dans l'ordre inverse. C'est ce qui pousse le début du tableau vers le bas de deux. Par conséquent,[\]
c'est le moyen le plus court pour encapsuler les deux premiers éléments de pile dans un tableau. Parfois, l'effet secondaire de les collecter dans l'ordre inverse est assez ennuyeux, mais dans ce cas, c'est exactement ce dont j'ai besoin.la source
_'_#)
g
parI*
. Fonctionne pour moi dans GolfScript.Python 3, 110 octets
A besoin d'un peu plus de golf, mais voici une folie pure. Lit
n
ensuites
partir de STDIN.La partie amusante est, dans l'affectation de la boucle que nous copions
b
, puis commençons à sauterb
pendant une compréhension de la liste . Si l'affectation était l'inverse, cela ne fonctionnerait pas!la source
k, 30
la source
Java - 162
174Ce n'est pas tous les jours que j'utilise une boucle do / while lorsque je joue au golf en Java: D
Cela réitère et remplit les blancs au fur et à mesure. Cela continue jusqu'à ce qu'il n'y en ait plus
_
dans le résultat.Avec des sauts de ligne:
la source
Java 8, 238
Moins golfé:
la source
Rubis, 60
Se concatène
s
à lui-mêmen
fois, puis génère desn
copies de code qui remplacents
lesn
traits de soulignement , évalue ces copies et renvoie les premiers caractères du résultat. Puisqu'au moins un trait de soulignement est supprimé dans chaque boucle, cela nous garantit de nous donnern
des caractères sans trait de soulignement.la source
f
et l' exécutionputs f[10,"ab_"]
, je reçois l'erreur suivante:in 'eval': undefined method 'next' for #<Array:...
. Cela semble fonctionner quand il n'y a pas de soulignement dans la chaîne.String#chars
changé entre Ruby 1.9.3 et Ruby 2.0; dans Ruby 1, il renvoie un énumérateur lorsqu'il n'y a pas de bloc, dans Ruby 2 un tableau. Il peut être rendu insensible à la version en changeantchars
eneach_char
, au prix de 4 octets nets supplémentaires de code.Python 2, 75
Cela attend une entrée comme
(30,"ab_c_")
.En Python, les chaînes ne permettent pas l'attribution. Il est donc difficile de remplacer les blancs par le caractère souhaité. On peut contourner cela en convertissant en une liste et inversement, mais je l'ai trouvé plus court pour générer simplement la chaîne de sortie à partir de zéro, en ajoutant les caractères souhaités un à la fois.
La sortie en cours de construction est
S
, qui commence vide. Nous parcourons les caractères de l'entrées
copiée plusieurs fois pour simuler un cercle. Nous vérifions s'il s'agit d'un blanc via le booléenb
. Nous vérifions l'égalitéx=='_'
plutôt que la comparaison car le trait de soulignement se situe entre les majuscules et les minuscules.Si le caractère n'est pas un blanc, nous l'ajoutons juste dessus
S
. S'il est vide, nous ajoutons la prochaine lettre inutilisée de la sortie jusqu'à présentS
. Nous suivons les lettres utilisées par un pointeur d'indexc
qui commence à 0 et est incrémenté chaque fois que nous rencontrons un blanc.À la fin, nous imprimons les premiers
n
caractères de la chaîne résultanteS
.Nous devons utiliser
S[c:c+b]
à la place du plus court,b*S[c]
car ce dernier donne une erreur hors limites lorsqueS
commence vide etc
vaut 0. Cela n'a jamais d'importance car nous sommes garantis que le premier caractère des
n'est pas vide, donc ceS[c]
n'est jamais nécessaire, mais le code ne le sait pas. Inverser leor
court-circuit pourrait également résoudre ce problème, mais coûte plus de caractères.Python 2, 83
Un port Pyth-to-Python de la solution d' isaacg , qui utilise
split
etzip
effectue le remplacement:Cela s'est avéré plus long car, surprise, les méthodes nommées sont longues en python. Mais il peut peut-être être amélioré en rayonnant
s
ets.split('_')
ensemble de manière plus courte.la source
Haskell
(93)67Je n'ai pas écrit de Haskell depuis un moment,
donc cela peut probablement être beaucoup raccourci.mais c'était tellement bon, nous avons dû le raccourcir et le rendre meilleur!Usage:
la source
Lot - 425
Dois-je perdre?
Le lot a des limites - j'accepte cela. Par exemple; J'ai dû utiliser une boucle for pour obtenir une seule variable dans un format utilisable en raison des limitations de la syntaxe d'analyse des variables.
for %%b in (!c!)do...
existe juste pour que je puisse utiliser%%b
au lieu de!c!
pour que je puisse réellement faire la manipulation de chaîne!s:~%%b,1!
et avoir les variables se développer au bon moment.Il y a quelques choses assez basiques que je pourrais faire pour jouer au golf plus loin, mais probablement pas en dessous de 400 octets. J'aurai bientôt un autre crack.
la source
ECMAScript 6, 78
Commence par une chaîne vide et pour chaque occurrence de trait de soulignement, la remplace par le caractère à l'index suivant de la chaîne actuelle.
la source
Python 2 -
9997 octetsParce que 4 soumissions basées sur python ne suffisent pas ...
Exemple:
la source
ECMAScript 6,
9391Rasé 2 caractères de la première version.
la source
C # - 162
J'ai volé la solution Geobits et l'ai changé en C #
1 char de mieux, donc vous pouvez améliorer les géobits;)
la source