Cette question est inspirée de la question de Kevin Cruijssen .
Maintenant que le tapis est posé, nous voulons le rouler. Votre tâche consiste à écrire un programme qui prend une chaîne et renvoie une spirale faite à partir de cette chaîne (représentant un tapis roulé vu de côté).
La procédure pour une étape de roulement du tapis est la suivante. Il y a un exemple pour illustrer ce que je veux dire. Notez que l'exemple commence par un tapis partiellement roulé pour une meilleure compréhension:
ac
rpet
- séparer la "tête" de la "queue" du tapis: la tête est ce qui a été roulé jusqu'à présent, la queue est ce qui reste à rouler.
Head: ac Tail:
rp et
- Tournez la tête de 90 ° dans le sens des aiguilles d'une montre.
Rotated head: ra Tail (unchanged):
pc et
- si la largeur de la nouvelle tête (ici
2
) est inférieure ou égale à la longueur de la queue (ici2
)- puis placez-le sur la queue
- sinon, le tapis (comme au début de l'étape) était enroulé
New carpet: ra
pc
et
Répétez la procédure autant de fois que nécessaire.
Deux exemples illustrant toutes les étapes du roulement du tapis:
carpet
c
arpet
ac
rpet
ra
pc
et
0123456789
0
123456789
10
23456789
21
30
456789
432
501
6789
Quelques précisions:
- Vous n'avez pas besoin de montrer toutes les étapes intermédiaires, seulement le tapis roulé (par exemple, si vous trouvez un moyen non itératif de calculer le résultat, c'est parfait). De plus, vous n'avez pas besoin d'imprimer d'espace blanc de premier plan, dans les exemples ci-dessus, je ne les montre que pour aligner les éléments.
- L'entrée est une chaîne, une liste / un tableau de caractères
- La sortie est imprimée sur stdout ou dans un fichier.
- L'entrée est agréable: la longueur est d'au moins 1 caractère et au plus une constante suffisamment petite pour ne pas causer de problèmes, mais vous ne pouvez pas utiliser cette constante dans votre programme; le contenu de la chaîne n'est que de beaux caractères ([a-zA-Z0-9]), encodés à votre guise.
- C'est le code-golf , donc la réponse la plus courte en octets l'emporte. Ne laissez pas les langues de golf de code vous décourager de publier des réponses avec des langues non-golfeur de code. Essayez de trouver une réponse aussi courte que possible pour «n'importe quel» langage de programmation.
- Les failles par défaut sont interdites.
- Si possible, veuillez ajouter un lien avec un test pour votre code.
- Ajoutez également une explication à votre réponse si vous pensez qu'elle est nécessaire.
ProgrammingPuzzlesAndCodeGolf
- la longueur finale de la queue supérieure à 1 m'a déclenché.print
intérieur d'unlambda
.Réponses:
Fusain , 15 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:
Faites une boucle sur le tapis.
Vérifiez s'il y a quelque chose au-dessus du curseur.
Sinon, roulez le tapis.
Déplacer vers la droite et sortir le caractère actuel.
Exemple: pour l'entrée
0123456789
, les actions suivantes se produisent:0
est imprimé.Le curseur se déplace vers la droite et
1
s'imprime.Puisqu'il n'y a rien au-dessus de
1
, la toile est tournée.Le curseur se déplace vers la droite et
2
est imprimé.Puisqu'il n'y a rien au-dessus de
2
, la toile est tournée.Le curseur se déplace vers la droite et
3
est imprimé.Le curseur se déplace vers la droite et
4
est imprimé.Puisqu'il n'y a rien au-dessus de
4
, la toile est tournée.Le curseur se déplace vers la droite et
5
est imprimé.Le curseur se déplace vers la droite et
6
est imprimé.Puisqu'il n'y a rien au-dessus de
6
, la toile est tournée.Le curseur se déplace vers la droite et
7
est imprimé.Le curseur se déplace vers la droite et
8
est imprimé.Le curseur se déplace vers la droite et
9
est imprimé.la source
⟲
?Pyth, 37 octets
Essayez-le en ligne ici ou vérifiez tous les cas de test en même temps ici .
la source
Husk , 24 octets
Essayez-le en ligne!
Explication
la source
J , 69 octets
-3 octets grâce à FrownyFrog
Essayez-le en ligne!
explication
L'algorithme est simple en dépit d'être un peu bavard pour J.
Stratégie globale: Réduisez l'entrée à une table carrée, avec une pièce restante (éventuellement vide).
Au fur et à mesure que nous réduisons, nous utiliserons une liste de cases à 2 éléments. Notre "résultat jusqu'à présent" sera la première case, et les "articles restant à traiter" seront la 2ème case. La première case sera initialisée en tête de l'entrée (mais convertie en tableau):
et "les éléments restant à traiter" seront la queue de l'entrée:
Maintenant nous avons:
où le «c» est en fait une table 1x1.
Nous réduisons cela à l'aide d'une boucle J Do ... While:
Où la partie entre parenthèses est la condition "continuer":
qui dit "continuez pendant que la longueur de la boîte de droite est supérieure ou égale à la longueur de la boîte de gauche (c'est-à-dire la longueur du côté de la matrice carrée)
Que signifie "continuer"? Cela est défini dans le verbe à gauche du premier
^:
, qui nous indique comment prendre le résultat actuel et produire l'itération suivante. Ce verbe est:Décomposons-le:
Autrement dit, ce n'est qu'un algorithme décrit dans l'OP traduit littéralement en J.
Enfin, nous traitons des (éventuellement 0) objets restants, la queue de notre rouleau de tapis:
Cela dit "prenez tout sauf le dernier orme du résultat":
et l'ajouter aux
,
derniers éléments du résultat{:@[
avec les éléments restants ajoutés à ce dernier élément, ]
la source
,.
peut faire ce qui1 1$]
fait et$
peut être utilisé comme{.
.$ can be used as {.
- pouvez-vous clarifier?R ,
146132 octetsEssayez-le en ligne!
Met en œuvre la procédure de laminage de tapis. Prend la saisie sous forme de liste de caractères et imprime sur la sortie standard.
Sauvegardé 14 octets en trouvant un moyen d'utiliser une
do-while
boucle et en l'initialisant à l'aide deF
.la source
Gelée , 30 octets
Semble trop long ...
Essayez-le en ligne!
Comment?
la source
05AB1E , 41 octets
Beaucoup trop long, mais je voulais utiliser le Canvas .. Ce qui était probablement un mauvais choix maintenant que je l'ai fini et il s'est avéré être aussi long ..
Essayez-le en ligne . (Pas de suite de tests, car il semble y avoir un problème étrange avec la fonction
.Λ
intégrée ..)Explication:
Permettez-moi de commencer par donner une explication générale du canevas et de ce que je voulais que mon code accomplisse. Des informations plus détaillées peuvent être trouvées dans cette astuce pertinente 05AB1E , mais pour ce défi, je voulais avoir ce qui suit:
La fonction intégrée de Canvas prend trois paramètres:
[2,2,3,3,4,4,5,5,...]
carpet
0123456789ABCDEFGHI
Quant au code:
Voir cette astuce de mes 05AB1E (section Comment compresser les grands entiers? ) Pour comprendre pourquoi
Ž8O
est2064
.la source
Python 3 , 112 octets
Dans ce cas, la sortie est la valeur de la fonction.
Essayez-le en ligne!
Si vous préférez, voici une autre solution (plus longue, 129 octets ) qui imprime directement l'entrée laminée:
Essayez-le en ligne!
la source
MATLAB / Octave , 154 octets
Pas le plus court, mais jouer au golf à MATLAB / Octave est toujours amusant :)
Essayez-le en ligne!
la source
disp
, je dirais que vous devriez enlever ledisp
laisser les gens qui ne connaissent pas R qu'il fait écrire à STDOUT par défaut