Ou, "Échangez les première et dernière lettres de chaque mot"
Votre défi consiste à, étant donné une chaîne de caractères alphabétiques ASCII ainsi qu'un autre caractère à utiliser comme délimiteur (pour séparer chaque mot), permuter les première et dernière lettres de chaque mot. S'il y a un mot à un caractère, laissez-le tranquille.
Les exemples / testcases utilisent les lettres minuscules et l'espace comme délimiteur.
Vous n'avez pas besoin de gérer la ponctuation; toutes les entrées seront uniquement constituées des lettres a à z, séparées par un délimiteur, toutes dans un cas uniforme.
Par exemple, avec la chaîne "hello world":
Input string: "hello world"
Identify each word: "[hello] [world]"
Identify the first and last letters of each word: "[[h]ell[o]] [[w]orl[d]]"
Swap the first letters of each word: "[[o]ell[h]] [[d]orl[w]]"
Final string: "oellh dorlw"
REMARQUE: le délimiteur n'a pas besoin d'être entré séparément. Le délimiteur est juste le caractère utilisé pour séparer les mots. Ça peut être n'importe quoi. Je voulais laisser les options ouvertes aux golfeurs créatifs, donc je ne voulais pas la limiter aux seuls espaces ou aux nouvelles lignes. Le délimiteur est juste un caractère qui sépare les mots dans la chaîne d'entrée.
Cas de test:
"swap the first and last letters of each word" -> "pwas eht tirsf dna tasl setterl fo hace dorw"
"hello world" -> "oellh dorlw"
"test cases" -> "test sasec"
"programming puzzles and code golf" -> "grogramminp suzzlep dna eodc folg"
"in a green meadow" -> "ni a nreeg weadom"
"yay racecar" -> "yay racecar"
Hello, world!
devient,elloH !orldw
(permutation de la ponctuation en lettre) ouoellH, dorlw!
(maintien de la ponctuation en place)?Réponses:
TeX, 216 octets (4 lignes, 54 caractères chacune)
Parce qu'il ne s'agit pas du nombre d'octets, il s'agit de la qualité de la sortie de composition :-)
Essayez-le en ligne! (Au verso; je ne sais pas comment cela fonctionne)
Fichier de test complet:
Sortie:
Pour LaTeX, vous avez juste besoin du passe-partout:
Explication
TeX est une étrange bête. Lire du code normal et le comprendre est un exploit en soi. La compréhension du code TeX obscurci va plus loin. Je vais essayer de rendre cela compréhensible pour les personnes qui ne connaissent pas aussi TeX, donc avant de commencer, voici quelques concepts sur TeX pour rendre les choses plus faciles à suivre:
Pour (pas tellement) les débutants absolus de TeX
Tout d' abord, et élément le plus important dans cette liste: le code ne pas avoir à être en forme rectangulaire, même si la culture pop pourrait vous amener à penser .
TeX est un langage d'expansion de macro. Vous pouvez, par exemple, définir
\def\sayhello#1{Hello, #1!}
puis écrire\sayhello{Code Golfists}
pour que TeX s'imprimeHello, Code Golfists!
. C'est ce qu'on appelle une «macro non délimitée», et pour lui donner le premier (et seulement, dans ce cas) paramètre, vous la mettez entre accolades. TeX supprime ces accolades lorsque la macro prend l'argument. Vous pouvez utiliser jusqu'à 9 paramètres:\def\say#1#2{#1, #2!}
alors\say{Good news}{everyone}
.La contrepartie de macros sont non délimitées, sans surprise, les délimité :) Vous pouvez faire la définition précédente un peu plus sémantiquement :
\def\say #1 to #2.{#1, #2!}
. Dans ce cas, les paramètres sont suivis d'un texte dit de paramètres . Un tel texte de paramètre délimite l'argument de la macro (#1
est délimité par␣to␣
, espaces inclus et#2
est délimité par.
). Après cette définition, vous pouvez écrire\say Good news to everyone.
, qui se développeraGood news, everyone!
. Sympa, non? :) Cependant, un argument délimité est (en citant le TeXbook ) "la séquence de jetons la plus courte (éventuellement vide) avec des{...}
groupes correctement imbriqués qui est suivie en entrée par cette liste particulière de jetons non paramétriques". Cela signifie que l'expansion de\say Let's go to the mall to Martin
produira une phrase bizarre. Dans ce cas , vous auriez besoin de « cacher » la première␣to␣
avec{...}
:\say {Let's go to the mall} to Martin
.Jusqu'ici tout va bien. Maintenant, les choses commencent à devenir bizarres. Lorsque TeX lit un caractère (qui est défini par un «code de caractère»), il attribue à ce caractère un «code de catégorie» (catcode, pour les amis :) qui définit ce que ce caractère signifie. Cette combinaison de caractères et de code de catégorie fait un jeton (plus d'informations ici , par exemple). Ceux qui nous intéressent ici sont essentiellement:
catcode 11 , qui définit des jetons qui peuvent constituer une séquence de contrôle (un nom chic pour une macro). Par défaut, toutes les lettres [a-zA-Z] sont catcode 11, donc je peux écrire
\hello
, qui est une seule séquence de contrôle, tandis que\he11o
la séquence de contrôle est\he
suivie de deux caractères1
, suivie de la lettreo
, car ce1
n'est pas le catcode 11. Si je a\catcode`1=11
, à partir de ce moment-là\he11o
serait une séquence de contrôle. Une chose importante est que les catcodes sont définis lorsque TeX voit pour la première fois le personnage à portée de main, et ce catcode est gelé ... POUR TOUJOURS ! (Les termes et conditions peuvent s'appliquer)catcode 12 , qui sont la plupart des autres caractères, tels que
0"!@*(?,.-+/
et ainsi de suite. Ils sont le type de catcode le moins spécial car ils ne servent qu'à écrire des trucs sur le papier. Mais bon, qui utilise TeX pour écrire?!? (encore une fois, des conditions générales peuvent s'appliquer)catcode 13 , qui est l'enfer :) Vraiment. Arrêtez de lire et allez faire quelque chose de votre vie. Vous ne voulez pas savoir ce qu'est le catcode 13. Avez-vous déjà entendu parler du vendredi 13? Devinez d'où il tire son nom! Continuez à vos risques et périls! Un caractère catcode 13, également appelé caractère «actif», n'est plus seulement un caractère, c'est une macro en soi! Vous pouvez le définir pour avoir des paramètres et développer quelque chose comme nous l'avons vu ci-dessus. Une fois que vous le faites ,
\catcode`e=13
vous pensez que vous pouvez faire\def e{I am the letter e!}
, MAIS. TOI. NE PEUX PAS!e
n'est plus une lettre, donc ce\def
n'est pas ce que\def
vous savez, ça l'est\d e f
! Oh, choisissez une autre lettre que vous dites? D'accord!\catcode`R=13 \def R{I am an ARRR!}
. Très bien, Jimmy, essaye! J'ose vous faire ça et écrire unR
dans votre code! C'est ce qu'est un catcode 13. JE SUIS CALME! Allons-nous en.D'accord, maintenant au regroupement. C'est assez simple. Quelles que soient les affectations (il
\def
s'agit d'une opération d'affectation\let
(nous y reviendrons) en est une autre) effectuées dans un groupe sont restaurées à ce qu'elles étaient avant le démarrage de ce groupe, sauf si cette affectation est globale. Il existe plusieurs façons de démarrer des groupes, l'un d'eux est avec les caractères catcode 1 et 2 (oh, catcodes à nouveau). Par défaut{
est catcode 1, ou begin-group, et}
est catcode 2, ou end-group. Un exemple:\def\a{1} \a{\def\a{2} \a} \a
cela s'imprime1 2 1
. En dehors du groupe\a
était1
, puis à l' intérieur , il a été redéfinie2
, et quand le groupe a pris fin, il a été restauré1
.L'
\let
opération est une autre opération d'affectation comme\def
, mais plutôt différente. Avec\def
vous définissez des macros qui se développeront en choses, avec\let
vous créez des copies de choses déjà existantes. Après\let\blub=\def
(le=
est facultatif), vous pouvez changer le début de l'e
exemple de l'élément catcode 13 ci-dessus pour\blub e{...
vous amuser avec celui-ci. Ou mieux, au lieu de casser des choses que vous pouvez fixer (chercheriez-vous à cela!) L'R
exemple:\let\newr=R \catcode`R=13 \def R{I am an A\newr\newr\newr!}
. Question rapide: pourriez-vous renommer\newR
?Enfin, les soi-disant «espaces parasites». C'est une sorte de sujet tabou car il y a des gens qui prétendent que la réputation gagnée dans l' échange de piles TeX - LaTeX en répondant à des questions sur les «espaces parasites» ne devrait pas être prise en compte, tandis que d'autres sont en désaccord sans réserve. Avec qui êtes-vous d'accord? Placez vos paris! Pendant ce temps: TeX comprend un saut de ligne comme un espace. Essayez d'écrire plusieurs mots avec un saut de ligne (pas une ligne vide ) entre eux. Ajoutez maintenant un
%
à la fin de ces lignes. C'est comme si vous «commentiez» ces espaces de fin de ligne. C'est ça :)(Sorte de) dé-golfer le code
Faisons de ce rectangle quelque chose (sans doute) plus facile à suivre:
Explication de chaque étape
chaque ligne contient une seule instruction. Allons un par un, les disséquant:
{
Tout d'abord, nous commençons un groupe pour garder certaines modifications (à savoir les modifications de code de cat) locales afin qu'elles ne gâchent pas le texte d'entrée.
\let~\catcode
Fondamentalement, tous les codes d'obscurcissement TeX commencent par cette instruction. Par défaut, à la fois dans TeX simple et LaTeX, le
~
caractère est le seul caractère actif qui peut être transformé en macro pour une utilisation ultérieure. Et le meilleur outil pour étrangler le code TeX sont les changements de catcode, c'est donc généralement le meilleur choix. Maintenant, au lieu de\catcode`A=13
nous pouvons écrire~`A13
(le=
est facultatif):~`A13
Maintenant, la lettre
A
est un caractère actif, et nous pouvons le définir pour faire quelque chose:\defA#1{~`#113\gdef}
A
est maintenant une macro qui prend un argument (qui devrait être un autre caractère). Tout d'abord, le code cat de l'argument est changé en 13 pour le rendre actif:~`#113
(remplacez le~
par\catcode
et ajoutez un=
et vous avez :)\catcode`#1=13
. Enfin, il laisse un\gdef
(global\def
) dans le flux d'entrée. En bref,A
rend un autre personnage actif et commence sa définition. Essayons:AGG#1{~`#113\global\let}
AG
le premier «s'active»G
et le fait\gdef
, ce qui, suivi du suivant,G
démarre la définition. La définition deG
est très similaire à celle deA
, sauf qu'au lieu de\gdef
cela, il y a un\global\let
(il n'y en a pas\glet
comme le\gdef
). En bref,G
active un personnage et en fait quelque chose d'autre. Faisons des raccourcis pour deux commandes que nous utiliserons plus tard:GFF\else
GHH\fi
Maintenant, au lieu de
\else
et\fi
nous pouvons simplement utiliserF
etH
. Plus court :)AQQ{Q}
Maintenant , nous utilisons à
A
nouveau pour définir une autre macro,Q
. La déclaration ci-dessus fait essentiellement (dans un langage moins obscur)\def\Q{\Q}
. Ce n'est pas une définition terriblement intéressante, mais elle a une fonctionnalité intéressante. À moins que vous ne vouliez casser du code, la seule macro qui se développeQ
estQ
elle - même, elle agit donc comme un marqueur unique (on l'appelle un quark ). Vous pouvez utiliser le\ifx
conditionnel pour tester si l'argument d'une macro est tel quark avec\ifx Q#1
:AII{\ifxQ}
vous pouvez donc être sûr que vous avez trouvé un tel marqueur. Notez que dans cette définition, j'ai supprimé l'espace entre
\ifx
etQ
. Habituellement, cela entraînerait une erreur (notez que la mise en évidence de la syntaxe pense que\ifxQ
c'est une chose), mais comme ilQ
s'agit maintenant de catcode 13, il ne peut pas former une séquence de contrôle. Attention, cependant, à ne pas étendre ce quark ou vous serez coincé dans une boucle infinie car seQ
dilate versQ
lequel se développe versQ
lequel ...Maintenant que les préliminaires sont terminés, nous pouvons passer à l'algorithme approprié pour pwas eht setterl. En raison de la tokenisation de TeX, l'algorithme doit être écrit à l'envers. En effet, au moment où vous faites une définition, TeX va tokenize (attribuer des catcodes) aux caractères de la définition en utilisant les paramètres actuels, par exemple, si je le fais:
la sortie est
E1
, alors que si je change l'ordre des définitions:la sortie est
11
. En effet, dans le premier exemple, laE
définition a été symbolisée sous forme de lettre (catcode 11) avant le changement de catcode, ce sera donc toujours une lettreE
. Dans le deuxième exemple, cependant, aE
été rendu actif pour la première fois, et seulement alors a\one
été défini, et maintenant la définition contient le code cat 13E
qui se développe1
.Je vais cependant ignorer ce fait et réorganiser les définitions pour avoir un ordre logique (mais pas fonctionnel). Dans les paragraphes qui suivent , vous pouvez supposer que les lettres
B
,C
,D
etE
sont actifs.\gdef\S#1{\iftrueBH#1 Q }
(remarquez qu'il y avait un petit bug dans la version précédente, il ne contenait pas l'espace final dans la définition ci-dessus. Je l'ai seulement remarqué en écrivant ceci. Lisez la suite et vous verrez pourquoi nous avons besoin de celui-ci pour terminer correctement la macro. ) Tout d'
abord , nous définissons la macro-niveau utilisateur,
\S
. Celui-ci ne doit pas être un caractère actif pour avoir une syntaxe conviviale (?), Donc la macro pour gwappins eht setterl est\S
. La macro commence par un conditionnel toujours vrai\iftrue
(il sera bientôt clair pourquoi), puis appelle laB
macro suivie deH
(que nous avons définie précédemment comme étant\fi
) pour correspondre à\iftrue
. Ensuite, nous laissons l'argument de la macro#1
suivi d'un espace et du quarkQ
. Supposons que nous utilisons\S{hello world}
, alors le flux d'entréedevrait ressembler à ceci:\iftrue BHhello world Q␣
(J'ai remplacé le dernier espace par un␣
pour que le rendu du site ne le mange pas, comme je le faisais dans la version précédente du code).\iftrue
est vrai, donc il se développe et nous nous retrouvons avecBHhello world Q␣
. TeX ne supprime pas le\fi
(H
) après l'évaluation du conditionnel, mais le laisse là jusqu'à ce que le\fi
soit réellement développé. Maintenant, laB
macro est développée:ABBH#1 {HI#1FC#1|BH}
B
est une macro délimitée dont le texte du paramètre estH#1␣
, donc l'argument est tout ce qui est entreH
et un espace. Poursuivant l'exemple au-dessus du flux d'entrée avant l'expansion deB
isBHhello world Q␣
.B
est suiviH
, comme il se doit (sinon TeX soulèverait une erreur), alors l'espace suivant est entrehello
etworld
,#1
le mot aussihello
. Et ici, nous devons diviser le texte d'entrée dans les espaces. Yay: D L'expansion deB
Enlève tout jusqu'au premier espace à partir du flux d'entrée et remplace parHI#1FC#1|BH
d'#1
êtrehello
:HIhelloFChello|BHworld Q␣
. Notez qu'il y a un nouveauBH
plus tard dans le flux d'entrée, pour faire une récursion de queue deB
et traiter les mots ultérieurs. Une fois ce mot traité, ilB
traite le mot suivant jusqu'à ce que le mot à traiter soit le quarkQ
. Le dernier espace aprèsQ
est nécessaire car la macro délimitée enB
requiert un à la fin de l'argument. Avec la version précédente (voir l'historique des modifications), le code se comporterait mal si vous l'utilisiez\S{hello world}abc abc
(l'espace entre lesabc
s disparaîtrait).OK, retour au flux d'entrée:
HIhelloFChello|BHworld Q␣
. Il y a d'abord leH
(\fi
) qui complète l'initiale\iftrue
. Maintenant, nous avons ceci (pseudocodé):La
I...F...H
réflexion est en fait une\ifx Q...\else...\fi
structure. Le\ifx
test vérifie si le (premier jeton du) mot saisi est leQ
quark. S'il est il n'y a rien d' autre à faire et les termine d'exécution, sinon ce qui reste est:Chello|BHworld Q␣
. MaintenantC
est développé:ACC#1#2|{D#2Q|#1 }
Le premier argument de
C
est non délimité, de sorte que si contreventés ce sera un jeton unique, le second argument est délimitée par|
, donc après l'expansion de laC
(avec#1=h
et#2=ello
) le flux d'entrée est la suivante :DelloQ|h BHworld Q␣
. Remarquez qu'un autre|
est mis là, et leh
ofhello
est mis après. La moitié de l'échange est effectuée; la première lettre est à la fin. Dans TeX, il est facile de récupérer le premier jeton d'une liste de jetons. Une macro simple\def\first#1#2|{#1}
obtient la première lettre lorsque vous utilisez\first hello|
. Le dernier est un problème car TeX saisit toujours la liste de jetons "la plus petite, éventuellement vide" comme argument, nous avons donc besoin de quelques solutions. L'élément suivant dans la liste des jetons estD
:ADD#1#2|{I#1FE{}#1#2|H}
Cette
D
macro est l'une des solutions de contournement et elle est utile dans le seul cas où le mot a une seule lettre. Supposons qu'au lieu dehello
nousx
. Dans ce cas , le flux d'entrée seraitDQ|x
alorsD
élargirait (avec#1=Q
et#2
vide) à:IQFE{}Q|Hx
. Ceci est similaire au blocI...F...H
(\ifx Q...\else...\fi
) dansB
, qui verra que l'argument est le quark et interrompra l'exécution en ne laissant que lax
composition. Dans d' autres cas (retour à l'hello
exemple),D
élargirait (avec#1=e
et#2=lloQ
) à:IeFE{}elloQ|Hh BHworld Q␣
. Encore une fois, leI...F...H
vérifieraQ
mais échouera et prendre la\else
branche:E{}elloQ|Hh BHworld Q␣
. Maintenant, le dernier morceau de cette chose, leE
la macro se développerait:AEE#1#2#3|{I#3#2#1FE{#1#2}#3|H}
Le texte du paramètre ici est assez similaire à
C
etD
; les premier et deuxième arguments ne sont pas délimités et le dernier est délimité par|
. Le flux d'entrée ressemble à ceci:E{}elloQ|Hh BHworld Q␣
, puis seE
dilate (avec#1
vide,#2=e
, et#3=lloQ
):IlloQeFE{e}lloQ|HHh BHworld Q␣
. Un autreI...F...H
bloc vérifie pour le quark (qui voitl
et retournefalse
):E{e}lloQ|HHh BHworld Q␣
. Maintenant , seE
développe à nouveau (avec#1=e
vide,#2=l
et#3=loQ
):IloQleFE{el}loQ|HHHh BHworld Q␣
. Et encoreI...F...H
. La macro effectue quelques itérations supplémentaires jusqu'à ce que leQ
soit finalement trouvé et que latrue
branche soit prise:E{el}loQ|HHHh BHworld Q␣
->IoQlelFE{ell}oQ|HHHHh BHworld Q␣
->E{ell}oQ|HHHHh BHworld Q␣
->IQoellFE{ello}Q|HHHHHh BHworld Q␣
. Maintenant , le quark se trouve et les conditionnels à se dilate:oellHHHHh BHworld Q␣
. Phew.Oh, attendez, qu'est-ce que c'est? LETTRES NORMALES? Oh mec! Les lettres sont finalement trouvés et TeX écrit vers le bas
oell
, puis un tas deH
(\fi
) se trouvent et étendu (rien) en laissant le flux d'entrée avec:oellh BHworld Q␣
. Maintenant, le premier mot a la première et la dernière lettres échangées et ce que TeX trouve ensuite est l'autreB
pour répéter tout le processus pour le mot suivant.}
Enfin, nous terminons le groupe commencé là-bas afin que toutes les affectations locales soient annulées. Les missions locales sont les changements de catcode des lettres
A
,B
,C
... qui ont été faites des macros pour qu'ils reviennent à leur signification normale de lettre et peuvent être utilisés en toute sécurité dans le texte. Et c'est tout. Maintenant, la\S
macro définie là-bas déclenchera le traitement du texte comme ci-dessus.Une chose intéressante à propos de ce code est qu'il est entièrement extensible. Autrement dit, vous pouvez l'utiliser en toute sécurité pour déplacer des arguments sans craindre qu'il explose. Vous pouvez même utiliser le code pour vérifier si la dernière lettre d'un mot est la même que la seconde (pour une raison quelconque, vous en aurez besoin) dans un
\if
test:Désolé pour l'explication (probablement beaucoup trop) verbeuse. J'ai essayé de le rendre aussi clair que possible pour les non TeXies :)
Résumé pour les impatients
La macro
\S
ajoute à l'entrée un caractère actifB
qui récupère les listes de jetons délimités par un espace final et les transmet àC
.C
prend le premier jeton de cette liste et le déplace à la fin de la liste de jetons et se développeD
avec ce qui reste.D
vérifie si «ce qui reste» est vide, auquel cas un mot d'une seule lettre a été trouvé, puis ne fait rien; sinon se développeE
.E
parcourt la liste des jetons jusqu'à ce qu'il trouve la dernière lettre du mot, lorsqu'il le trouve, il laisse cette dernière lettre, suivi du milieu du mot, qui est ensuite suivi de la première lettre laissée à la fin du flux de jetons parC
.la source
JavaScript (ES6),
3936 octetsEnregistré 3 octets grâce à @FryAmTheEggman
Utilise un saut de ligne comme séparateur.
Essayez-le en ligne!
la source
(.)(.*)(.)
est-ce l'émoticône Total Recall?Retina ,
85 octetsEssayez-le en ligne!
Enregistré 3 octets grâce à Kevin Cruijssen !
Utilise une nouvelle ligne comme séparateur. Nous utilisons l'étape inverse de Retina et certaines limites. La première limite est celle qui correspond à laquelle appliquer l'inversion, nous les choisissons donc tous avec
,
. Ensuite, nous voulons que la première et la dernière lettre de chaque correspondance soient échangées, nous prenons donc chaque lettre dans la plage,,
qui se traduit par une plage du début à la fin avec une taille de pas zéro.la source
V
, mais ne savais pas qu'il pouvait être utilisé avec des indices1,-2
comme ça. Joli!Pepe ,
107105 octetsEssayez-le en ligne!
Explication:
Notation sur les commentaires:
command-explanation -> (stack) // explanation
la source
Python 3 ,
7258 octetsEssayez-le en ligne!
la source
a
)laskelH , 71 octets
Essayez-le en ligne!
Exemple d'entrée / sortie:
la source
where
clause peut être déplacée vers une liaison en garde pour économiser 5 octets: Essayez-la en ligne!05AB1E , 10 octets
Essayez-le en ligne!
-3 Merci à @Kevin Cruijssen .
la source
|ʒRćsRćJ,
loop_as_long_as_there_are_inputs
, alors j'aurais connu un 8 octets:[RćsRćJ,
ce 8 octets n'utilisant[
jamais de sorties en théorie cependant, uniquement lorsque vous êtes à court de mémoire ou que vous expirez comme sur TIO (et qu'il nécessite un suivi retour à la ligne dans l'entrée, sinon il continuera à utiliser le dernier mot) ..ð¡
d'une entrée de mot unique, maisð¡εćsÁì}ðý
elle fonctionne également à 10 octets.J ,
2317 octetsEssayez-le en ligne!
la source
1 A.
!1&A.&.(1&|.)
->({:,1|.}:)
puis vous pouvez supprimer le::]
Rubis avec
-p
,424129 octetsEssayez-le en ligne!
la source
\w
s par le.
s.Haskell, 54 octets
Essayez-le en ligne!
la source
Japt
-S
, 7 octetsEssayez-le
la source
PowerShell , 37 octets
Essayez-le en ligne!
la source
Stax , 8 octets
Exécuter et déboguer
Utilise les nouvelles lignes comme séparateurs de mots.
la source
Espace , 179 octets
Lettres
S
(espace),T
(tabulation) etN
(nouvelle ligne) ajoutées uniquement en surbrillance.[..._some_action]
ajouté à titre d'explication uniquement.Tab comme délimiteur. L'entrée doit contenir un retour à la ligne (ou un onglet), sinon le programme ne sait pas quand s'arrêter, car la saisie dans l'espace blanc ne peut être effectuée qu'un caractère à la fois.
Essayez-le en ligne (avec des espaces bruts, des tabulations et des nouvelles lignes uniquement).
Explication en pseudo-code:
L'espace blanc n'a qu'une pile et un tas, où le tas est une carte avec une clé et une valeur (les deux entiers). Les entrées ne peuvent être lues qu'un seul entier ou caractère à la fois, qui sont toujours placés dans le tas en tant qu'entiers, et peuvent ensuite être reçues et poussées vers la pile avec leurs adresses de tas définies (clés de carte). Dans mon approche, je stocke le mot entier aux adresses de tas (clés de carte)[ 0 , . . . , longueur_mot ] , puis récupérez les caractères à imprimer un par un dans l'ordre souhaité après qu'un onglet (ou une nouvelle ligne) soit rencontré comme délimiteur.
Le programme se termine avec une erreur lorsqu'il essaie de lire un caractère alors qu'aucun n'est donné dans TIO (ou il se bloque en attendant une entrée dans certains compilateurs d' espaces comme vii5ard ).
la source
Wolfram Language (Mathematica) , 58 octets
Essayez-le en ligne!
-22 octets de @attinat
-12 octets de @ M.Stern
la source
StringReplace
avecStringExpression
sStringTake
au lieu deStringReplace
:StringRiffle[StringSplit@##~StringTake~{{-1},{2,-2},{1}},#2,""]&
StringReplace[#, a : u ~~ w : u .. ~~ b : u :> b <> w <> a /. {u -> Except@#2}] &
QuadR , 20 octets
Créez simplement trois groupes de capture composés de 1, 0 ou plus, et 1 mot-caractères, puis inverse leur ordre.
Essayez-le en ligne!
la source
APL + WIN, 50 octets
Demande la chaîne et utilise l'espace comme délimiteur.
Essayez-le en ligne! Gracieuseté de Dyalog Classic
la source
Japt
-S
, 10 octetsConvaincu qu'il doit y avoir une approche plus courte (et j'avais raison ) mais cela suffira pour l'instant.
Essayez-le
la source
¸®Ì+Zs1J +Zg
¸®ÎiZÌ+Zs1J
.sed, 64 octets
la source
.
instead of[[:alpha:]]
, but it would actually have to be[^ ]
, which reduces it to 43, but breaks on punctuation and such. Using[a-zA-Z]
brings it up to 55, by which point I'm just hankering after those sweet, sweet human readable entities...You do not need to handle punctuation; all of the inputs will only consist of the letters a through z, separated by a delimiter, all of a uniform case.
In other words, you don't need to worry about punctuation "breaking" your code and can just safely go for[^ ]
;)[^ ]
should be[^[:space:]]
which brings it to 67 chars.sed, 34 bytes
And presumably the pattern idea will work with most RE tools (and I do know there are differences between standard RE and extended RE).
Try it online!
la source
\b
from the match: Try it online!\b
will lead to 30 bytes..
for the swapped chars and you can lose another two chars. This brings yours down to 26 bytes; one of the smallest readable solutions.s,\b(.)(\w*)(.)\b,\3\2\1,g
\w
s at the ends.s,\b(\w)(\w*)(\w)\b,\3\2\1,g
28 chars.Ruby, 53 bytes
I tried it without regex. The output prints each word on a new line. If that's against the rules, let me know and I'll fix it.
Ungolfed:
la source
p
was no good because that added quotes to the output. You could always useputs
instead since that one auto-appends the newline and is shorter thanprint
! Also, if you callsplit
with no arguments it automatically splits on spaces.8088 Assembly, IBM PC DOS,
3938 bytesUnassembled:
Standalone PC DOS executable. Input via command line args, output to screen.
Download and test PWAS.COM.
la source
Perl 5
-p
, 24 bytesTry it online!
la source
Batch, 141 bytes
Takes input as command-line parameters. String manipulation is dire in Batch at best, and having to special-case single-letter words doesn't help.
la source
C# (Visual C# Interactive Compiler), 90 bytes
Uses newline as delimiter, though really any whitespace can be used.
Try it online!
la source
Icon, 76 bytes
Try it online!
la source
Java,
110109 bytes-1 bytes by using a newline for a delimeter
TIO
la source
Haskell,
7574 bytesFixed a bug pointed at by Cubic and also golfed down 1 byte.
Try it online!
la source
map g
is shorter than(g<$>)
a
intoaa
Scala, 100 bytes
la source
T-SQL, 126 bytes
Input is via a pre-existing table t with varchar field v, per our IO standards.
Reading from back to front,
STRING_SPLIT
breaks a string into individual rows via a delimiter,STUFF
modifies the characters at the specified positions, thenSTRING_AGG
mashes them back together again.la source