Piet est un langage de programmation intéressant pour plusieurs raisons. Aujourd'hui, nous allons nous concentrer sur une raison: la commande roll . La commande roll était à l'origine de PostScript et est un moyen puissant pour manipuler la pile.
La commande roll fait apparaître les deux premiers éléments de la pile et les utilise comme paramètres. Nous appellerons la première valeur sautée turns
et la seconde depth
. Un virage à la profondeur n prendra l'élément le plus haut de la pile, en fera le nième élément de la pile, et déplacera chacun des éléments au-dessus de celui-ci. Si turns
est négatif, cela se fait dans la direction opposée. Autrement dit, le nième élément est déplacé vers le haut et les autres éléments sont déplacés vers le bas. C'est répété plusieurs abs(turns)
fois.
Défi
Écrivez un programme ou une fonction qui prend une pile et retourne cette pile après avoir exécuté un rouleau.
Règles
- L'entrée et la sortie peuvent être dans une liste, un tableau, une chaîne avec un délimiteur, passées dans un élément à la fois, ou tout autre format raisonnable. La sortie doit être au même format que l'entrée.
depth
ne sera jamais négatif et ne sera jamais supérieur à la longueur de la pile.- La pile d'entrée contiendra toujours au moins deux éléments.
- Il s'agit de code-golf, donc la réponse la plus courte dans chaque langue l'emporte. En tant que tel, je n'accepterai pas de réponse.
- Les failles standard sont interdites.
Cas de test
in: out:
2
4
1 3
2 4
3 1
4 2
5 5
6 6
in: out:
-2
3
1 2
2 3
3 1
in: out:
-42
0
1 1
2 2
3 3
4 4
5 5
Réponses:
Haskell ,
6462 octetsEdit: -2 octets: @xnor a vu quelque chose que je pensais mal.
r
prend et retourne une liste deInt
s.Essayez-le en ligne!
splitAt n l
divise une listel
à l'indexn
,mod
calcule le reste de la division,++
concatène les listes.la source
(%)=splitAt
infix.JavaScript (ES6),
4947 octetsEdit: sauvé 2 octets grâce à @Shaggy en prenant les éléments de la pile comme paramètres séparés. Explication:
1
déplace l'élément supérieur vers l'depth
élément. Une rotation de2
déplace les deux éléments supérieurs, etc. Cependant, vous pouvez également y parvenir en déplaçant les éléments entre la rotation et la profondeur vers l'avant.splice
supprime ces éléments et lesconcat
ajoute aux éléments restants. (J'aurais pu utiliser une compréhension de tableau à la place car c'est la même longueur.)slice
au deuxième paramètre,splice
c'est le nombre d'éléments à supprimer.la source
(t%d+d)%d
la même chose quet%d
?%
est un reste, donc il donne une réponse négative quand ilt
est négatif.(t,d,...a)=>
car les règles permettent à l'entrée d'être passée dans un élément à la fois.CJam, 31 octets
L'entrée et la sortie sont des tableaux sur la pile, le dernier élément représentant le haut de la pile.
Trace de la pile:
la source
Mathematica,
5850 octetsEdit: Merci à Martin Ender pour avoir économisé 8 octets.
Explication:
Fonction pure qui attend une liste où le début de la liste représente le haut de la pile. Nous passons les éléments de la liste dans la fonction pure
Take[x={##3},#2]~RotateLeft~#~Join~Drop[x,#2]&
.x
est défini sur la séquence d'éléments commençant par le troisième argument., puis nous faisons pivoter les premiers#2
(deuxième argument) éléments dex
vers la gauche#
(premier argument) fois, puisJoin
les éléments restants dex
.Cela économiserait des
3
octets si nous venions de passer directement les éléments de la pile en tant qu'arguments à la fonction plutôt que d'être initialement dans une liste, mais les formats d'entrée et de sortie ne correspondraient pas.Solution originale:
Il y a quelque chose de vraiment satisfaisant dans cette chaîne de fonctions d'infixe. Remplace une liste par le premier élément
t
, le deuxième élémentd
et les éléments restantsx
avec pour résultat de faire tourner les premiersd
éléments de{x}
vers la gauchet
et de joindre les éléments restants de{x}
.la source
±
insérée dans une règle de remplacement, et un autre 1 octet en exploitantTakeDrop
comme suit:±{t_,d_,x___}:=#~RotateLeft~t~Join~#2&@@{x}~TakeDrop~d
...&[1, 1, 3, 4]
et des retours{3, 4}
ou faites-le manuellement avec unApply
au début:Take[x={##3},#2]~RotateLeft~#~Join~Drop[x,#2]&@@#&
(juste pour être clair, ma première suggestion omet le@@#&
.))Rubis, 40 octets
Essayez-le en ligne!
Prend l'entrée comme une liste, renvoie une liste. Le fait qu'il
rotate
existe un système intégré capable de gérer à la fois les rotations positives et négatives rend cela trivial.la source
Python,
141988774 octets11 octets économisés grâce à @Cole
Reçoit l'entrée sous forme de liste, où le dernier élément est le haut de la pile.
Utilise l'astuce 0ⁿ pour filtrer la profondeur nulle et l'opérateur modulo d'ajustement de signe de python pour déterminer la partie de la liste à couper.
la source
f(s,t,d)
?f(s,t,d)
(l'entrée est la pile entière).r=-t%d-d
. En outre, le remplacements*0**d
pars*(d<1)
maintient le nombre d'octets, mais améliore peut-être la lisibilité (ce n'est pas l'objectif). Je ne savais pas cela0**0==1
en Python cependant, c'est intéressant.-t%d-d
tant que valeur (comme je l'ai fait auparavant), car lorsqued
est0
cela déclencherait une exception division par zéro.JavaScript ES6,
10992 octetsEssayez-le en ligne!
Reçoit une entrée sous la forme d'un tableau d'entiers.
A également le nombre de flèches: P
Explication:
Le code utilise la fonction shift pour extraire les deux premiers éléments de la liste.
Il obtient alors la valeur absolue du premier élément, qui est le nombre de tours.
Étant donné que Javascript est indexé zéro, l'indice de profondeur doit être diminué de 1.
Si l'indice de profondeur était 0 ou 1, rien ne devrait changer, mais en raison de la diminution, l'indice de 0 entraînerait des changements. Quittez donc la boucle si l'indice de profondeur n'est pas <= 0.
La fonction splice (a, b) renvoie le sous-tableau de longueur b avec l'index de départ a du tableau et laisse le tableau d'origine sans ces éléments.
Lorsqu'il est concaténé avec le reste du tableau d'origine, il s'agit d'une seule rotation du tableau à l'indice de profondeur.
En effectuant cette opération n fois, où n est le nombre de tours, la matrice résultante est le résultat de l'opérateur de roulis.
la source
Python 2 , 48 octets
Essayez-le en ligne!
la source
TI-Basic,
141150 octets (sans concurrence)Edit: cas fixe où la profondeur est nulle (+9 octets)
TI-Basic ne prend pas en charge les listes de longueur 0, donc cette approche ne fonctionnera pas pour une entrée à deux longueurs.
Explication:
la source
seq(
.Lot, 163 octets
Prend l'entrée en tant que paramètres de ligne de commande et génère une liste séparée par des espaces. Les paramètres entre
t
etd
sont extraits dans lar
variable afin de pouvoir être ajoutés à las
variable, qui reçoit tous les autres paramètres.la source