Les gars ASCII décalés aiment changer de ASCII Ii
:
>_> <_< >_< <_>
Avec une série de types décalés, des lignes espacées ou séparées, déplacez-le Ii
d'un côté à l'autre, à gauche du mur et à droite du ciel:
Ii
Le shifter le plus court remporte le prix.
Tu peux répéter s'il te plait?
Ecrivez un programme ou une fonction prenant une chaîne d'une liste arbitraire de ces quatre émoticônes ASCII, séparés par un espace ou une nouvelle ligne (avec une nouvelle ligne de fin optionnelle):
>_>
<_<
>_<
<_>
Par exemple, l’entrée peut être
>_> >_> <_>
ou
>_> >_> <_>
(La méthode que vous soutenez est à vous.)
Chaque émoticône effectue une action différente sur les caractères I
et i
, qui commencent toujours ainsi:
Ii
>_>
décaleI
vers la droite par un, si possible, puis versi
la droite par un.<_<
décaleI
à gauche par un, si possible, puisi
à gauche par un, si possible.>_<
décaleI
si possible vers la droite, puis si possiblei
vers la gauche.<_>
décaleI
à gauche par un, si possible, puisi
à droite par un.
I
ne peut pas être déplacé à gauche s'il se trouve au bord gauche de la ligne (comme il en a été initialement), ni à droite s'il se i
trouve directement à sa droite (comme il en était initialement).
i
ne peut pas être déplacé à gauche s'il I
est directement à sa gauche (comme au début), mais peut toujours être déplacé à droite.
Notez qu'avec ces règles, I
restera toujours à gauche de i
, et I
est tenté d'être déplacé avant i
pour tous les émoticônes.
Votre programme ou votre fonction doit imprimer ou renvoyer une chaîne de la dernière Ii
ligne après avoir appliqué tous les décalages dans l'ordre indiqué, en utilisant des espaces (
) ou des périodes ( .
) pour les espaces vides. Les espaces ou les points de fin et un seul nouveau trait sont autorisés dans la sortie. Ne mélangez pas les espaces et les périodes.
Par exemple, l'entrée
>_> >_> <_>
a sortie
I...i
parce que les changements s'appliquent comme
start |Ii >_> |I.i >_> |.I.i <_> |I...i
Le code le plus court en octets gagne. Tiebreaker est la réponse la plus votée.
Cas de test
#[id number]
[space separated input]
[output]
Utiliser .
pour plus de clarté.
#0
[empty string]
Ii
#1
>_>
I.i
#2
<_<
Ii
#3
>_<
Ii
#4
<_>
I.i
#5
>_> >_>
.I.i
#6
>_> <_<
Ii
#7
>_> >_<
.Ii
#8
>_> <_>
I..i
#9
<_< >_>
I.i
#10
<_< <_<
Ii
#11
<_< >_<
Ii
#12
<_< <_>
I.i
#13
>_< >_>
I.i
#14
>_< <_<
Ii
#15
>_< >_<
Ii
#16
>_< <_>
I.i
#17
<_> >_>
.I.i
#18
<_> <_<
Ii
#19
<_> >_<
.Ii
#20
<_> <_>
I..i
#21
>_> >_> <_>
I...i
#22
<_> >_> >_> >_> <_> <_<
.I...i
#23
<_> >_> >_> >_> <_> <_< >_< <_< >_<
..Ii
#24
>_> >_< >_> >_> >_> >_> >_> >_> <_> <_> <_<
...I.....i
Réponses:
CJam, 33 octets
Utilise le même algorithme que ma réponse Python , sauf avec l'indexation 0. Essentiellement:
<
en -1 et>
en 1I
et appliqueri
, nous alternons la position que nous mettons à jour après chaque flèche.Merci à @ MartinBüttner pour avoir joué 5 octets dans l'étape de sortie.
Essayez-le en ligne | Suite de tests
la source
Perl,
595654 octetsComprend +1 pour
-p
Exécuter avec l'entrée sur STDIN, par exemple
perl -p shifty.pl <<< ">_> <_< >_< <_>"
shifty.pl
:Explication
La chaîne de contrôle alterne les instructions pour
i
etI
et la règle est la même pour les deux si vous les formulez comme suit:<
Déplacer à gauche s'il y a un espace à gauche>
Déplacer à droite s'il y a un espace ou une fin de chaîne à droiteDonc, je vais échanger
i
etI
dans la chaîne cible à chaque étape, je n'ai donc qu'à appliquer la règle à une lettre. C'est ley/iI/Ii/
Je vais parcourir la chaîne de contrôle en recherchant
<
et en>
utilisant une substitution qui est généralement le moyen le plus court en perl pour traiter un caractère à la fois. Pour éviter d'avoir à écrire,$var =~
je veux la chaîne de contrôle dans la variable perl par défaut$_
. Et je veux aussi un moyen facile de distinguer<
de>
. Tout cela peut être accompli en utilisantLa chaîne cible que je veux également manipuler à l'aide de substitutions et pour la même raison, je souhaite l'inclure
$_
également.$_
être deux choses à la fois semble impossible.Cependant, je peux avoir mon gâteau et le manger aussi parce que l'
$_
intérieur du corps d'une substitution ne doit pas rester identique à celui qui$_
est substitué. Une fois que perl a commencé à substituer une chaîne, cette chaîne ne changera pas, même si vous modifiez la variable dont la chaîne est originaire. Donc, vous pouvez faire quelque chose comme:Je souhaite remplacer l'original
$_
par l'initiale"Ii"
uniquement la toute première fois que le corps de substitution est exécuté (sinon, je réinitialise continuellement la chaîne cible). Toutefois, ce remplacement doit également se produire pour une chaîne de contrôle vide. Ainsi, même pour la chaîne de contrôle vide, le corps doit être exécuté au moins une fois. Pour m'assurer que la sous-fonction s'exécute une heure supplémentaire au début de la chaîne de contrôle (même pour les chaînes de contrôle vides), je remplace le remplacement par:Je vais lancer le
y/iI/Ii/
comme la première chose à l'intérieur du code de substitution. Tant qu'il$_
s'agit toujours de la chaîne de contrôle, celle-ci n'en contient pas encoreIi
. Par conséquent, si la translittération indique que rien n'a été modifié, c'est l'initialisation de mon déclencheur$_
:Maintenant, je peux mettre en œuvre le déplacement réel des lettres. Depuis que je commence par un échange, tous les mouvements doivent être effectués
i
, pasI
. Si$1
est défini, déplacezi
le curseur vers la droite:Si
$1
n'est pas défini déplaceri
à gaucheRemarquez que, au début de la chaîne de contrôle, la correspondance
^
$1
ne sera pas définie; le système essaie donc de se déplaceri
vers la gauche de la chaîne initialeIi
. Cela ne fonctionnera pas car il n’ya pas d’espace, donc la chaîne initiale reste intacte (c’est pourquoi je mets la()
autour>
au lieu de<
)Un seul problème demeure: à la fin de la substitution externe, le
$_
résultat de la substitution externe doit être pris en compte, indépendamment de ce que vous avez fait$_
dans le corps de substitution. Donc, la chaîne cible avec le bon placement dei
etI
se perd. Dans les vieux perls, ce serait un défaut fatal. Les perls les plus récents ont cependant ler
modificateur qui signifie "faire une copie de la chaîne d'origine, faites votre substitution sur celle-ci et renvoyez la chaîne résultante (au lieu du nombre de correspondances)". Lorsque j'utilise cela ici, le résultat est que la chaîne de commande modifiée est supprimée alors que l'original$_
n'est pas perturbé par Perl et reste après la substitution. Cependant, le dérangement que je fais$_
est toujours fait après que Perl soit parti$_
seul. Donc à la fin$_
sera la chaîne cible appropriée.L'
-p
option s'assure que la chaîne d'origine est dedans$_
et imprime également la finale$_
.la source
Ii
, pasiI
.^
match supplémentaire signifie que je dois les échanger. L'initialisation inverse est donc correcte.LittleLua - 178 octets
Mise en œuvre directe.
Ungolfed:
Qu'est-ce que LittleLua?
LittleLua est un travail en cours pour essayer de niveler le terrain de jeu entre la langue de mon choix pour ces défis et les langues ésotériques qui ont souvent des fonctions intégrées extrêmement puissantes.
LittleLua est un interpréteur Lua 5.3.6 avec un module supplémentaire (LittleLua.Lua), ainsi que des noms de fonctions et de modules réduits. Ces changements s’étendront au cours des deux prochains jours, jusqu’à ce que je sois heureux, mais les changements les plus importants entre LittleLua et l’interprète Lua standard sont les suivants:
Les fonctions et les modules sont réduits:
Variables intégrées
LittleLua a plusieurs variables intégrées pour réduire certaines tâches:
Fonctions intégrées
Actuellement une liste déprimante, mais la voici:
la source
$
, et utilisez cela à la place deend
oue
- lesA-Za-z
caractères autres que des mots n'ont pas besoin d'espaces autour d'eux, n'est-ce pas? Ce serait raser octet parend
/e
if
au golf eni
économisant un octet par utilisation, etend
ene
avez économisé deux, mais vous êtes restéelse
seul? Même dans ce programme simple (5if
s et 2else
s), vous gaspillez plus d'octetselse
que vous n'enregistrezif
. (Je suppose que c'est une amélioration prévue?)La rétine ,
10186Essayez-le en ligne
Sauvegardé 15 octets grâce à daavko!
Prend les entrées séparées par des nouvelles lignes et les sorties avec les yeux séparés par des espaces.
Explication:
Je vais expliquer étape par étape, comme d'habitude. Toutes ces étapes sont en mode Remplacer de Retina. Cela signifie que la première ligne est une expression régulière et la deuxième ligne est une chaîne de remplacement.
Ajoutez l'initiale
Ii
à la fin de l'entrée.Le backtick sépare la scène des options. Le caractère d'option
(
indique que cette étape est le début d'une boucle d'étapes à exécuter de manière répétée dans l'ordre jusqu'à la fin d'un cycle complet sans modification de l'entrée. Puisque cette parenthèse ouverte n'est jamais fermée, toutes les étapes restantes font partie de cette boucle.La phase actuelle est très simple, si le premier caractère de la chaîne est une nouvelle ligne, supprimez-la. Ceci est juste pour aider à faciliter la gestion de l'entrée vide, sinon il serait plus compliqué de l'ajouter aux deux dernières étapes.
Ici, l'option
s
fait en sorte que le métacaractère Regex.
corresponde aux nouvelles lignes. Cette étape fait en sorte que l'interligne>
corresponde auI
suivi d'un espace facultatif. Ensuite, il remplace la correspondance par le texte après le>
, suivi de l’espace facultatif (donc la chaîne vide si l’espace ne peut pas correspondre), puis leI
.Cette étape est très similaire à la précédente, seul l’espace optionnel est avant
I
, et l’ordre et l’œil sont inversés.Le traitement de
i
est en fait souvent plus simple, car nous n’avons pas à nous soucier d’ajouter ou de supprimer facultativement car nousi
pouvons toujours nous déplacer correctement. Pour lesi
cas, nous comparons le trait de soulignement et le signe plus / moins que, mais faisons la même chose. Celui-ci ajoute un espace avant lei
.De nouveau semblable au précédent, mais il supprime le caractère avant le
i
si ce caractère est un espace, sinon il supprime seulement l’émoticône.la source
s`^_>(.*)i( |$)?
=>s`^_>(.*)i
et son remplacement$1$#2$* i
=>$1 i
, ets`^_<(.*?)( )?i
=>s`^_<(.*?) ?i
et son remplacement$1i$2
=>$1i
.Python,
142141134122121 octets19 octets sauvés grâce à xnor.
Exemple:
Explication:
la source
i
restera pas toujours plus grand queI
?I
, pointsi
, sans aucun besoin de listes ni de jointures.GNU sed, 81 octets
(y compris +1 pour le
-r
drapeau)Cela crée un nouveau programme sed à partir de l'entrée (ce que vous pouvez voir en supprimant la dernière ligne) et l'applique à l'état de départ
Ii
.Explication
<
et>
remplacent des commandes qui se déplacentI
respectivement vers la gauche et la droite._
pour travailleri
plutôt que pourI
i
n'est pas délimité par un bord droit, alors n'ajoutez pas et ne consommez pas d'espace à sa suiteIi
.s///e
utilise toujours/bin/sh
comme shell, donc je ne pouvais pas le raccourcirsed '&'<<<Ii
comme je le souhaitais (c'est une syntaxe de redirection Bash).Résultats de test
la source
Javascript (ES6)
176 171 168 155 148 147 147 142141 octetsUsage
Degolfed (v6, v7 n'est pas très différent)
la source
=>{ ... }
vous pourriez faire est une expression et économiser pas mal d'octetsMATL ,
5655504947 octetsEssayez-le en ligne!
la source
Retina,
9186 octetsJe n’ai probablement pas choisi la meilleure approche, alors on peut probablement jouer davantage au golf. Et non, je n'ai pas copié FryAmTheEggman (je sais que nos approches sont très similaires). Je n'ai même pas vu sa réponse avant d'avoir posté la mienne.
Essayez-le en ligne
la source
( |)
de la fin de la dernière ligne de match, car il n’y aura jamais d’espace aprèsi
. De plus, toujours sur la dernière ligne de match, vous n’avez pas besoin de crochet de fermeture pour la boucle. La boucle non fermée est fermée automatiquement à la fin du fichier dans Retina.i
et quelque chose après que remplacer. J'ai oublié de les changer.Javascript (ES6) 166 octets
En utilisant la réponse de Charlie Wynn, j'ai réussi à économiser 10 octets en définissant Math.max comme M et en appelant M chaque fois que son script utilise
(Je n'ai pas écrit ce golf, Charlie Wynn l'a fait ici . Je l'ai simplement modifié pour le rendre plus court)
la source
SyntaxError: missing : in conditional expression
sur Firefox. Vous pouvez le réparer avec_=>{I=0,i=1,M=Math.max;_.split` `.map(m=>(I=(m=m.split`_`)[0]=='<'?M(0,I-1):M(i-1,I+1))+(i=m[1]=='<'?M(I+1,i-1):i+1));(a=Array(i).fill`.`)[I]='I';return a.join``+'i'}
, qui a la même taille exacte.JavaScript (ES6), 115
118Edit: 3 octets enregistrés grâce à CharlieWynn
p
est le nombre d'espaces avantI
;q
est le nombre d'espaces entreI
eti
. Ni peut être négatif.Moins joué au golf
Tester
la source
Retina,
6158 octets3 octets enregistrés grâce à @FryAmTheEggman.
L'explication vient un peu plus tard.
Essayez-le en ligne!
Code modifié avec test de lot.
la source
Python 2,
9692 octetsSolution d'assez sournoise pour un défi sournois. Entrée comme
f('>_> <_>')
, sortie comme'I i'
.Programme de vérification (en supposant qu'il
tests
s'agisse d'une chaîne de cas de test multiligne):Le programme lit chaque flèche une à la fois, en commençant par les
I=1, i=2
index basés sur 1 et en les utilisant. Les noms de variable sont un peu trompeurs car ils échangent des rôles - après chaque caractère,I
devienti
eti
devientI
mis à jour. Un caractère n'est mis à jour que s'il ne se déplace pas vers la position de l'autre caractère ni la position 0.Par exemple, pour
>_> <_> >_<
nous faire:Cela donne
' Ii'
comme souhaité.la source
Lua, 104 octets
Usage:
la source
Javascript (ES5),
153 à125 octetsprend une entrée en définissant une variable
a
avant de lancerUn peu non-golfé:
la source
Mathematica, 125 octets
Fonction pure avec le premier argument
#
. L'idée est que chaque<_
,>_
,<
et>
dans les correspond d'entrée à une règle de remplacement de chaîne."<_"|">_"|">"|"<"
est un modèle de chaîne qui correspond à l'une de ces quatre expressions.StringCases[#,"<_"|">_"|">"|"<"]
trouvera tous ces matches. Ensuite, nous remplaçons (/.
)"<_"
par la règle de remplacement de chaîne".I"->"I."
,">_"
par la règle"I."->".I"
, etc. Ensuite, je veux appliquer séquentiellement chaque règle de remplacement à la chaîne"Ii"
, maisStringReplace
je ne rechercherai que les correspondances dans les parties de la chaîne qui n'ont pas été remplacées. Nous avons donc laisséFold
la fonctionStringReplace
sur la liste des règles de remplacement avec la valeur de départ"Ii"
.Peut-être serait-il plus clair avec un exemple (ici
%
la sortie de la cellule précédente):la source