Pour "imbriquer" une chaîne, vous devez:
Traitez le premier caractère comme une fonction et les caractères suivants comme les arguments de cette fonction. Par exemple, si la chaîne d'entrée était
Hello
, alors la première étape serait:H(ello)
Ensuite, répétez cette même étape pour chaque sous-chaîne. Nous obtenons donc:
H(ello) H(e(llo)) H(e(l(lo))) H(e(l(l(o))))
Votre tâche consiste à écrire un programme ou une fonction qui "imbrique" une chaîne. Par exemple, si la chaîne d'entrée était Hello world!
, vous devriez alors générer:
H(e(l(l(o( (w(o(r(l(d(!)))))))))))
L'entrée ne contiendra jamais que l' ASCII imprimable , et vous pouvez prendre l'entrée et la sortie dans n'importe quel format raisonnable. Par exemple, STDIN / STDOUT, arguments de fonction et valeur de retour, lecture et écriture dans un fichier, etc.
Par souci de simplicité, vous pouvez également supposer que l'entrée ne contiendra pas de parenthèses et ne sera pas vide.
Input:
Nest a string
Output:
N(e(s(t( (a( (s(t(r(i(n(g))))))))))))
Input:
foobar
Output:
f(o(o(b(a(r)))))
Input:
1234567890
Output:
1(2(3(4(5(6(7(8(9(0)))))))))
Input:
code-golf
Output:
c(o(d(e(-(g(o(l(f))))))))
Input:
a
Output:
a
Input:
42
Output:
4(2)
Comme d'habitude, toutes nos règles et échappements par défaut s'appliquent, et la réponse la plus courte notée en octets est gagnante!
la source
You may take the input and the output in any reasonable format.
Une liste de personnages me semble parfaitement raisonnable.Réponses:
Python,
413934 octetsIdeone
Assez explicite.
Il met une parenthèse entre tous les autres caractères puis en ajoute un de moins que la longueur des parenthèses à la fin.
la source
-
rend le nombre négatif et le~
retourne. Vous pouvez en lire un peu plus à ce sujet sur la page de conseils .Fichier .com MS-DOS, 30 octets
La chaîne est transmise à l'exécutable à l'aide de la ligne de commande. (Un espace entre le nom du fichier .COM et la chaîne).
Le résultat est écrit sur la sortie standard.
Le démontage est ici:
Remarque: vous pouvez quitter un fichier .COM DOS (contrairement aux fichiers avec en-tête EXE) à l’aide d’une instruction "RET".
la source
call 0xfoff
? Le programme est chargé en mémoire à l'adresse0
, autant que je sache (ou0x100
sur CP / M-DOS mais il semble que ce soient des instructions x86), pourquoirecursiveFunction
se trouve- t-il soudainement à0xffof
? Il semble commencer 9 octets après le début du programme et il n'y a pas de virtualisation ni de métadonnées dans l'exécutable.0x100
mais ce programme pourrait même s’exécuter sur n’importe quelle adresse:e8 f0 ff
c’est une instruction d’appel relative : il saute à l’adresse de l’instruction qui suit l’call
instruction moins 0x10.JavaScript (ES6),
403433 octets6 octets sauvés, grâce à ETHproductions
Une fonction récursive.
Essayez-le en ligne!
la source
1/s
.([c,...s])
vous devriez écrire un conseilBrainfuck,
42 à40 octetsEssayez-le en ligne!
Ungolfed:
la source
05AB1E , 11 octets
Essayez-le en ligne!
Explication:
la source
Brainfuck, 44 bytes
Lit un octet à la fois, met un parent ouvert avant chacun sauf le premier, met le même nombre de parents proches à la fin.
la source
+++++[->++++++++<],.,[>.>+<<.,]>+>[-<.>]
est légèrement plus court.Haskell, 30 octets
Exemple d'utilisation:
f "Nest a string"
->"N(e(s(t( (a( (s(t(r(i(n(g))))))))))))"
.Prenez le caractère suivant, suivi de a
(
, suivi d'un appel récursif avec tous les caractères sauf le premier, suivi de a)
.la source
f=Data.List.intersperse '$'
! Cela nous donnef "Nest a string"
->"N$e$s$t$ $a$ $s$t$r$i$n$g"
.f[]=[]
comme base de votre casf[x]=[x]
. Je ne connais pas Haskell, donc je ne sais pas si c'est légitime ou non, je vous laisse juger.()
derrière la dernière lettre, par exemplef "abc"
->"a(b(c()))"
.f=(++).intersperse '('<*>drop 1.map(\_->')')
.intersperse
nécessiteimport Data.List
17 autres octets.Gelée ,
9 à8 octets-1 octet grâce à @Dennis (utilisez moule,
ṁ
au lieu de longueurL
, et répétezx
)TryItOnline
Comment?
la source
³
provoque en fait Jelly pour imprimer la valeur de retour de courant, de sorte que vous n'avez deux listes de caractères.Retina ,
2217 octetsEssayez-le en ligne!
Alternativement:
Explication
J'oublie toujours qu'il est possible d'imprimer des choses en cours de route au lieu de tout transformer en résultat final et de le sortir en une fois ...
Ici, il
\
demande à Retina d’imprimer le résultat de cette étape sans saut de ligne. Le1>
est une limite qui signifie que la première correspondance de l'expression régulière doit être ignorée. Quant à la scène elle-même, elle remplace simplement chaque caractère (.
) sauf le premier(
suivi de ce caractère. En d'autres termes, il insère(
entre chaque paire de caractères. Pour l’entréeabc
, cela le transforme en (et l’imprime)Il ne reste plus qu'à imprimer les parenthèses fermantes:
Cela se fait avec une translittération qui remplace
(
avec)
et supprime tous les autres caractères ASCII imprimables de la chaîne.la source
> <> ,
1918 octetsEssayez-le en ligne!
Explication
La première ligne est une boucle d’entrée qui affiche tout jusqu’au dernier caractère de l’entrée (y compris tous les
(
) et laisse la quantité appropriée de)
sur la pile:Une fois que nous atteignons EOF, le pointeur d’instruction se termine sur la deuxième ligne et nous exécuterons simplement
o
en boucle, en imprimant tout le)
, jusqu’à ce que la pile soit vide et que le programme soit erroné.la source
J, 13 octets
J s’exécute de droite à gauche. Ainsi, en utilisant l’adverbe inséré
/
, un verbe peut être utilisé pour réduire les lettres de la chaîne de saisie.Usage
Vous pouvez observer les sorties partielles entre chaque réduction.
Explication
la source
C #, 32 octets
Ce lambda doit être une méthode statique. Aurais-je besoin de compter des octets supplémentaires pour cette exigence? Normalement, je n'utiliserais pas un lambda pour la récursion en C #, mais je pense qu'il serait plus court de ne pas utiliser la récursivité.
la source
R, 61 octets
Regex trouve et remplace les espaces entre les caractères par "(". Ensuite,
cat
etrep
ajoute ")" n-1 fois à la fin.la source
Java 7,
8179 octetsSauvegardé
1
byte.Merci à Kevin.la source
l!=a.length
l<a.length
b=b+'('+a[l],++l)+')'
b+="("+a[l],++l)+")"
b+="("+a[l],++l)+")"
vous donne 144141148))), et BTWb+"("+a[l],++l)+")"
est correct. et ce fut une erreur très stupide de ma part (!=
).b+='('+a[l],++l)+')'
donne144141148
, maisb+="("+a[l],++l)+")"
pas. Les parenthèses sont entourées de guillemets au lieu de guillemets.PowerShell v2 +, 46 octets
Prend la chaîne d'entrée,
char
-array's it,-join
le tableau avec les parenthèses ouvertes(
, puis concatène sur le nombre approprié de parenthèses fermées)
.la source
APL, 19 octets
Explication:
Solution alternative, également 19 octets:
Explication:
la source
MATL , 16 octets
Essayez-le en ligne!
Explication
la source
Acc !! , 129 octets
Pas mal pour un tarpit assez bavard de Turing ...
(Oui, tout cet espace est obligatoire.)
Note: à cause des limitations d'entrée de Acc !! , il est impossible de lire une chaîne de caractères arbitraire sans un délimiteur de fin. Par conséquent, ce programme attend une entrée (sur stdin) sous la forme d'une chaîne suivie d'un caractère de tabulation.
Acc !! ?
C'est un langage que j'ai créé et qui semble seulement être inutilisable . Les seuls types de données sont des entiers, la seule construction de flux de contrôle est la
Count x while y
boucle et le seul moyen de stocker des données est un seul accumulateur_
. L'entrée et la sortie sont effectuées caractère par caractère, à l'aide de la valeur spécialeN
et de l'Write
instruction. Malgré ces limitations, je suis à peu près sûr que Acc !! est Turing-complet.Explication
La stratégie de base dans Acc !! la programmation consiste à utiliser la
%
division mod et integer/
pour partitionner conceptuellement l'accumulateur, ce qui lui permet de stocker plusieurs valeurs à la fois. Dans ce programme, nous utilisons trois de ces sections: les sept bits les plus faibles (_%128
) stockent un code ASCII à partir d’une entrée; le bit suivant (_/128%2
) stocke une valeur de drapeau; et les bits restants (_/256
) comptent le nombre de parents proches dont nous aurons besoin.Entrée dans Acc !! provient de la valeur spéciale
N
, qui lit un seul caractère et s’évalue en code ASCII. Toute instruction composée uniquement d'une expression affecte le résultat de cette expression à l'accumulateur. Nous commençons donc par stocker le code du premier caractère dans l'accumulateur._%128
stockera le dernier caractère lu. Ainsi, la première boucle s'exécute avec une valeur autre que_%128-9
zéro, c'est-à-dire jusqu'à ce que le caractère actuel soit un onglet.À l'intérieur de la boucle, nous voulons imprimer
(
sauf si nous en sommes à la première itération. Depuis Acc !! n'a pas de déclaration if, nous devons utiliser des boucles pour les conditions. Nous utilisons le bit 128 de l'accumulateur_/128%2
, comme valeur d'indicateur. Lors du premier passage, la seule chose dans l'accumulateur est une valeur ASCII <128, donc le drapeau est 0 et la boucle est ignorée. Lors de chaque passage ultérieur, nous nous assurerons que le drapeau est à 1.Dans la
Count x
boucle (chaque fois que le drapeau est à 1), nous écrivons un code ouvert (ASCII40
) et ajoutons 128 à l'accumulateur, ce qui met le drapeau à 0 et quitte la boucle. Cela arrive également à incrémenter la valeur de_/256
, que nous utiliserons comme notre décompte de parents proches à afficher.Indépendamment de la valeur du drapeau, nous écrivons le dernier caractère en entrée, qui est simplement
_%128
.La prochaine affectation (
_+128-_%128+N
) fait deux choses. Tout d'abord, en ajoutant 128, il active l'indicateur pour la prochaine fois dans la boucle. Deuxièmement, il met la_%128
fente à zéro, lit un autre caractère et le stocke à cet endroit. Puis on boucle.Lorsque la
Count i
boucle se termine, nous venons de lire un caractère de tabulation, et la valeur de l'accumulateur se décompose comme suit:_%128
:9
(le caractère de tabulation)_/128%2
:1
(le drapeau)_/256
: nombre de caractères lus, moins 1(Le moins 1 est dû au fait que nous n’ajoutons que 128 à l’accumulateur une fois lors du premier passage dans la boucle principale.)
Count j while _/256-j
effectue des boucles en_/256
écrivant un ASCII proche41
chaque fois. Voila!la source
Perl, 25 octets
Merci à @Ton Hospel pour avoir joué 4 octets.
24 octets de code +
-F
.Besoins
-F
et-E
drapeaux:Notez que si vous essayez ceci sur une ancienne version de perl, vous devrez peut-être ajouter un
-a
indicateur.Un autre moyen intéressant (un peu plus long cependant: 28 octets):
Merci encore à Ton Hospel de m'avoir aidé à réussir celui-ci.
(Pour l'utiliser, placez le code dans un fichier et appelez-le avec
echo -n "Hello" | perl nest.pl
)la source
""
après-F
. Vous n'avez pas non plus besoin de la-l
si vous exigez que la chaîne d'entrée soit entrée sansecho -n Hello | program
-F
, merci. (Je me demandais comment obtenir l'entrée sans la nouvelle ligne finale, merci pour cela aussi)perl -F -E '$"="(";say"@F".")"x$#F'
s/.(?=.)/s%$'%($&)%/reg
, mais elle ne prend bien sûr pas en charge les chaînes contenant des métacaractères regex\Q
pour supporter les métacaractères regex) :-)Ruby, 27 octets
Explication
la source
Perl,
2423 octetsInclut +1 pour
-p
Donne une chaîne sur STDIN sans nouvelle ligne (ou ajoute une
-l
option au programme)nest.pl
:la source
PHP, 63 octets
Version précédente 64 octets
la source
<?=
place deecho
et un autre si vous définissez $ s comme résultat de l'str_split
appel à la place de$argv[1]
, puis à lacount($s)
place destrlen($s)
<?=str_pad(join("(",$s=str_split($argv[1])),count($s)*3-2,")");
-wordwrap
vaincrait la combinaison scission / jointure, mais échouera malheureusement si l'entrée contient des espaces.GNU sed,
373531 octets (30 +1 pour l'-r
argument)Solution linux sed pure
:
; puis en l'appelant récursivement avect
\1 ( \2 )
Edit : Merci à @manatwork pour avoir aidé à supprimer 4 caractères!
Testeur en ligne
la source
-e
de passer le code à l'interprète est gratuit. (Ok,sed
est heureux sans elle aussi.) Donc poursed -re '…'
vous comptez +1.Méduse ,
19 à18 octetsLe caractère
␁
est le caractère de contrôle non imprimable avec une valeur d'octet0x1
. Essayez-le en ligne!Explication
Il s'agit d'un programme Jellyfish assez complexe, car de nombreuses valeurs sont utilisées à plusieurs endroits.
I
est une entrée brute, lue à partir de STDIN en tant que chaîne.'(
est le caractère littéral(
.{
(identité de gauche) prend'(
etI
comme entrées, et retourne'(
. La valeur de retour n'est jamais réellement utilisée.`
est le fil. Il modifie{
pour retourner le caractère(
pour chaque caractère deI
, résultant en une chaîne de(
s avec la même longueur queI
.>
est la queue; il prend la chaîne de(
s en entrée et coupe le premier caractère.+
prend comme arguments la chaîne de(
s et l'octet non imprimable, et ajoute la valeur d'octet (1) à chaque caractère. Cela donne une chaîne d'égale longueur de)
s. L'utilisation du caractère␁
garantit que la valeur renvoyée est une chaîne et non une liste d'entiers./
prend l'octet non imprimable, retourne une fonction qui prend deux arguments et joint le deuxième argument au premier une fois (puisque la valeur de l'octet est 1)._
prend cette fonction, saisit les arguments du plus bas{
(qui étaient'(
etI
) et appelle la fonction avec eux. Cela insère le caractère(
entre chaque paire de caractères dansI
.,
concatène cette chaîne avec la chaîne de)
s etP
affiche le résultat.la source
05AB1E ,
22211918 octetsEssayez-le en ligne!
Explication:
la source
Vim, 17 octets
$qqha(<Esc>A)<Esc>%h@qq@q
Va de bout en bout, sinon vous trébuchez sur ce que
)
vous avez déjà écrit. Utiliseha
au lieu d'i
échouer quand on arrive au début.Habituellement, vous ne feriez pas deux insertions distinctes comme celle-ci; vous feriez quelque chose comme
C()<Esc>P
sauver un coup. Mais le positionnement ne fonctionne pas aussi bien cette fois-ci.la source
<End>
touche en mode insertion au lieu de quitter le mode insertion et de le faireA
Convexe , 10 octets
Essayez-le en ligne!
la source
> <> , 37 octets
Rangée par rangée
Essayez-le en ligne!
la source
Brain-Flak
10397 BytesComprend +3 pour -c
Essayez-le en ligne!
Explication:
la source
{({}<><(((((()()){}()){}){}){})>)<>}<>({}<(({})<>())><>)([]){({}[()()]<(<>({})<>)>)}{}{}{({}<>)<>}<>{}
c'est de deux octets de plus ...-a
dans Brain-Flak quand même?+3
octets sont standard pour les indicateurs de ligne de commande spéciaux . Ce qui est regrettable, mais que je peux supporter. En fait, j'ai réfléchi aux moyens de réduire cela, mais je ne sais pas encore comment.-
et un pour le drapeau? Vous pouvez avoir un drapeau pour une exécution normale, comme le fait Perl-e
. De cette façon, il ne s'agirait que d'un octet supplémentaire.Facteur, 81 octets
la source