Dans la pièce absurde Rosencrantz et Guildenstern are Dead , les deux personnages principaux Rosencrantz et Guildenstern (ou sont-ils?) Mélangent toujours lequel d'entre eux est qui - ou parfois lequel de leurs propres parties du corps est lequel - en raison d'un manque perçu de identité individuelle. Ne serait-il pas absurde qu'ils remuent même leurs noms?
Votre tâche consiste à écrire une fonction qui prend une chaîne de longueur paire (et par conception, un multiple de 4) supérieure à 7 caractères, la diviser et la mélanger.
Le fractionnement doit être le suivant : la chaîne sera de format "abscd"
, avec s agissant comme un caractère séparateur. La première section et le séparateur abs
seront la première moitié de la chaîne, tandis que la seconde moitié seracd
La durée de a
sera(string length / 4) - 1
La durée de b
sera(string length / 4)
La durée de s
sera1
La durée de c
sera(string length / 4) + 1
La durée de d
sera(string length / 4) - 1
Cela peut être très déroutant, alors laissez-moi vous montrer quelques exemples
("a" + "bb" + "s" + "ccc" + "d").length //8
1 2 1 3 1
|-------4--------| |----4-----| <--- (4 is half of 8)
("rosen" + "crantz" + "&" + "guilden" + "stern").length //24
5 6 1 7 5
("foo" + "barr" + "?" + "barry" + "foo").length
3 4 1 5 3
Finalement:
Vous mélangez ensuite les pièces autour, en sortant adscb
ex. "rosencrantz&guildenstern" --> "rosenstern&guildencrantz"
"foobarr?barryfoo" --> "foofoo?barrybarr"
Rulez:
- Les échappatoires standard sont interdites
- Réponses acceptables: une fonction qui prend une entrée via une chaîne d'entrée et renvoie une chaîne de sortie
- Si la chaîne d'entrée ne correspond pas aux exigences fournies ci-dessus, votre code DOIT faire une erreur (peu importe le type de
Exception
ouError
) - C'est
code-golf
, donc la réponse la plus courte (valide) (dans chaque langue) gagne! - Points bonus pour un one-liner :-) (Pas vraiment, mais des points sympas)
Réponses:
K (oK) ,
353433 octetsEssayez-le en ligne!
Sans validation d'entrée (pour la prime de ngn),
252423 octetsEssayez-le en ligne!
J'ai rapidement appris un peu de K et, en regardant la liste des verbes, j'ai pensé qu'une approche alternative ( sans utiliser cut) pourrait fonctionner ici. Et cela a parfaitement fonctionné.
Comment ça fonctionne
la source
Perl 6 ,
6058 octets-2 octets grâce à Jo King
Essayez-le en ligne!
Lance "Rotorizing sublist length is out of range" en cas d'erreur.
Explication
la source
J ,
3635 octetsEssayez-le en ligne!
-1 octet par
{.
+ longueurs négatives et;.2
qui les coupe comme marqueurs de "fin" à la place.Réponse originale, 36 octets
Essayez-le en ligne!
ngn a mentionné "couper" dans un commentaire à une réponse précédente de K , et cela m'a fait essayer J qui a le même "coupé" (je n'ai aucune idée de la façon dont K fonctionne).
Comment ça fonctionne
Notez que cette fonction gère automatiquement les entrées non valides:
{.
lancedomain error
puisque son argument de longueur doit être des entiers.5 A.
lanceindex error
.length error
est levé.la source
Python 3 ,
10310210197888684 octetsEssayez-le en ligne!
Pas vraiment une ligne, mais
;
c'est un octet de moins par ligne que le saut de ligne et le retrait.Lance
ZeroDivisionError
si la longueur de la chaîne d'entrée est inférieure à 8 ou non un multiple entier de 4.Fonctionne également en Python 2.
-4 octets grâce à Jo King
-9 octets grâce aux ovs
-2 octets grâce à Jonathan Frech
-2 octets grâce à Bubbler
la source
//=
la paire la plus externe devenue redondante. Merci beaucoup!-l+1
<->1-l
?Perl 6 , 78 octets
Essayez-le en ligne!
Bloc de code anonyme qui prend une chaîne et renvoie la chaîne modifiée si elle est valide, sinon renvoie une division par zéro erreur. Je sais que je peux modifier un tableau directement, donc je pourrais échanger les deux sections de la chaîne, mais je ne peux pas vraiment le comprendre.
la source
K (NGN / k) ,
1201131039995 octetsAvec un peu de chance, il est possible de jouer plus bas, inclus une fonction supplémentaire pour tester si la longueur de la chaîne est divisible par quatre, génère une erreur en référence à une variable non déclarée si l'entrée n'est pas valide
EDIT: état manquant sur une longueur supérieure à 7, inclus
EDIT: combiné en une fonction, suppression des déclarations de variables redondantes
Essayez-le en ligne!
la source
indices_string
)? me cingler dans le verger si je devais l'expliquerRetina 0.8.2 , 58 ou 73 ou 83 ou 93 octets
Essayez-le en ligne! Explication:
Capture
a
dans$1
, et de le rendre aussi courte que possible*?
.$#2
,$#3
et$#4
finir comme la longueur dea
.Capturer
b
dans$4
. Le(?<-2>.)+
capture jusqu'à la longueur dea
, tandis que l'autre.
ajoute 1 à sa longueur selon les besoins.Capturez
s
etc
dans$6
. Leur longueur combinée est trois de plus que la longueur dea
.Capturer
d
dans$7
. Sa longueur ne dépasse pas la longueur dea
.Nous avons fait le
a
plus court possible, mais nous voulons toujours atteindre la fin de l'entrée.Échange
b
etd
.L'étape ci-dessus ne valide pas son entrée. Comme Retina ne présente aucune erreur d'exécution, il existe un certain nombre d'options pour la validation des entrées:
N'affiche rien si la longueur est inférieure à 8 ou non un multiple de 4. (+15 octets)
Sorties
Error
si la longueur est inférieure à 8 ou non multiple de 4. (+25 octets)Se bloque si la longueur est inférieure à 8 ou non un multiple de 4. (+35 octets)
la source
C (gcc) avec
-Dx=memcpy
et-DL=(l-1)
,154158160 octetsRenvoie NULL si la longueur de la chaîne d'entrée n'est pas divisible par 4 ou inférieure à 8 caractères.
Merci à Rogem et Jonathan Frech pour les suggestions.
EDIT: le préprocesseur déplacé définit la ligne de commande et a fait l'allocation dynamique de la chaîne pour se conformer strictement au puzzle.
Essayez-le en ligne!
la source
t[80]
? Il ne semble pas y avoir de limite supérieure concernant la longueur d'entrée.malloc()
place.NULL
pour une sortie non valide, utilise les valeurs de retour dememcpy()
, une macro de type fonction pour ignorer les types et les tableaux de longueur variable C99 à ignorermalloc()
.//
ou le-w
?-w
est juste une commodité pour supprimer les avertissements (donc les erreurs sont plus faciles à trouver). J'ajoute généralement des arguments de ligne de commande après a//
pour que TIO compte leurs octets pour moi, puis je déduis 1 du total pour tenir compte du caractère supplémentaire nécessaire pour le faire.Gelée , 28 octets
(Si un programme complet est autorisé, nous pouvons supprimer la fin
F
)Si la longueur est inférieure à 8 ou non divisible par quatre, un
ValueError
est augmenté pendant la division entière deinf
(un flottant) par4
- la division donneNaN
(également un flottant) qui ne peut alors pas être jeté à unint
.Essayez-le en ligne!
Comment?
la source
Gelée , 25 octets
Essayez-le en ligne!
Le
Ẏ
peut être supprimé pour en faire un programme complet.la source
Ruby , 64 octets
Essayez-le en ligne!
la source
JavaScript (ES6),
9789 octets8 octets enregistrés grâce à @ l4m2
Essayez-le en ligne!
la source
JavaScript (Node.js) , 80 octets
Essayez-le en ligne!
JavaScript (Node.js) , 84 octets
Essayez-le en ligne!
JavaScript (Node.js) , 87 octets
Essayez-le en ligne!
Plus court que RegExp
la source
Java 8, 135 octets
Lance
ArithmeticException
(divise par zéro) si la chaîne d'entrée ne correspond pas aux exigences. Essayez-le en ligne ici .Non golfé:
la source
l/=l>7&l%4<1?4:0;
place del=l>7&l%4<1?l/4:l/0;
C (gcc) , 129 octets
Renvoie par modification. Compiler avec:
Fichier source:
Essayez-le en ligne!
Degolf
la source