Étant donné une chaîne, commencez par la mettre au carré comme suit:
Tout d'abord, écrivez la chaîne.
abcde
Ensuite, écrivez la chaîne tournée à gauche.
abcde
bcdea
Continuez ainsi jusqu'à ce que vous ayez écrit des lignes len (chaîne) .
abcde
bcdea
cdeab
deabc
eabcd
Maintenant, lisez la chaîne comme ceci:
----+
+--+|
|+>||
|+-+|
+---+
Qui donne:
abcdeabcdcbaedcbcdeabaede
Imprimez cette chaîne.
Cas de test
abcdef -> abcdefabcdedcbafedcbcdefabcbafedefaf
cena! -> cena!cenanec!anena!cec!a!
ppcg -> ppcgppcppgcpcgpg
abc -> abcabacbc
ab -> abab
a -> a
->
Veuillez commenter si un scénario de test est incorrect.
N'oubliez pas qu'il s'agit de code-golf , donc le code avec le plus petit nombre d'octets l'emporte.
cena!
est faux. Il devrait correspondre à votre exemple,abcde
car les deux sont de 5 lettres:cena!cenanec!anena!cec!a!
Réponses:
JavaScript (ES7),
83807877 octetsProgramme conforme à ES3 en prime:
Explication
Cela profite du fait que la sortie, par exemple pour une chaîne de longueur 5, peut être représentée comme:
où chaque chiffre représente un index dans la chaîne (à partir de 0), modulez la longueur de la chaîne. En d'autres termes, si n est la longueur de la chaîne, nous incrémentons l'index 2n - 1 fois, puis le décrémentons 2 (n - 1) - 1 fois, puis l'incrémentons 2 (n - 2) - 1 fois, etc. Cela peut être simplifié par l'algorithme suivant:
Cela fonctionne parce que floor (sqrt (x)) change de parité après 2n - 1 itérations, puis 2 (n - 1) - 1 itérations, etc.
la source
Pyth , 15 octets
Un programme qui prend l'entrée d'un
"quoted string"
et imprime le résultat.Essayez-le en ligne! ou vérifiez tous les cas de test (modifiés pour plusieurs entrées).
Comment ça fonctionne
la source
Python 2.7 (dans CMD.EXE), 91 octets
Cela nécessite un terminal avec un backspace fonctionnel (
\b
), et ne fonctionnera pas sur repl.it ou ideone.com . Une instruction print se terminant par une virgule sépare la sortie supplémentaire par un espace au lieu d'une nouvelle ligne ou d'un retour. Le retour arrière nous permet d'écraser l'espace de séparation.Python 2.7, 96 octets
Essayez-le sur ideone.com ou repl.it (merci à Oliver). L'entrée doit être une chaîne python, par exemple
'cena!'
.Les quatre tranches annexées par la boucle (
s[i:]
,s[:n-i]
,r[i+2:]
,r[:n-i]
) sont prises à partir des quatre bords de la spirale. Par exemple, avec01234
le carré est:Nous prenons donc
01234
,0123
,210
,4321
. La variablei
est l'indice de la valeur en haut à gauche à chaque étape du processus. Dans la spirale finale, plusieurs des tranches peuvent être vides.la source
S=''
,print S
etS+=
, et tout emballage avanti+=2
dans uneprint()
déclaration avecsep=''
, vous pouvez enregistrer 2 octets.i<=n
pourn>i
"a string of odd length."
Gelée ,
1110 octetsTryItOnline! ou tous les tests
Comment?
Le carré non spiralé est une série de tirages "bord supérieur plus bord droit" et "bord inférieur plus bord gauche", chacun étant l'inverse du tirage précédent sans la première et la dernière lettre, et le premier est l'entrée plus l'entrée sans la dernière lettre (par exemple, l'entrée
"abcde"
a une sortie de"abcdeabcd" + "cbaedcb" + "cdeab" + "aed" + "e"
).la source
05AB1E, 12 octets
Essayez-le en ligne!
Explication:
la source
MATL , 27 octets
L'entrée vide se termine avec une erreur (produisant la sortie correcte).
Essayez-le en ligne! Ou vérifiez tous les cas de test .
la source
C,
9594 octetsInspiré par la réponse @ETHproductions.
la source
Perl, 99 octets
Les espaces blancs ne font pas partie du programme et sont fournis pour la lisibilité.
Code pas extrêmement efficace. Je devrais pouvoir raccourcir les trois premières lignes d'une manière ou d'une autre, mais tout ce que j'ai essayé de faire a échoué. Cet opérateur ternaire doit également être corrigé d'une manière ou d'une autre, mais le faire de cette façon a permis de raccourcir mon code de 10 octets, car je pouvais tellement découper.
Le code fonctionne en compilant une liste de palindromes, séparés par des nombres pairs, qui représentent les valeurs de position de la chaîne à extraire.
la source
-F
ce qui remplacera les lignes 1 et 3. Donnez l'entrée avececho -n
pour supprimer lechop
. (cela devrait vous faire environ 81 octets)En fait ,
2113 octetsCet algorithme est largement basé sur la réponse Jelly de Jonathan Allan . Il existe deux méthodes pour imprimer le résultat en une seule chaîne. L'approche utilisée ici duplique une étape intermédiaire, puis l'ajoute à un total cumulé dans le registre 1 (une chaîne vide par défaut);
;╕
dans la fonction, puis╛
à la fin. L'autre approche consiste à dupliquer une étape intermédiaire, à laisser ces étapes en double sur la pile et à les additionner en une seule chaîne à la fin;;
dans la fonction, puiskΣ
à la fin.Suggestions de golf bienvenues. Essayez-le en ligne!
Ungolfing
la source
Python 3, 59 octets
repl.it
Un port direct de ma réponse Jelly ; seulement un programme complet prenant une entrée (plutôt qu'une fonction).
Il
print(x,end='')
s'agit d'une instruction d'impression qui n'imprimera pas la nouvelle ligne par défaut.la source
Python 3, 93 octets
Essayez-le en ligne!
la source
print(...,end='')
, faitesprint(end=s[i:]+s[:n-i]+r[i+2:]+r[:n-i]
abcde
, il en manque une
à la fin.i<=n
plutôt quen-i
pour votre condition.