Objectif
C'est un défi simple. Votre but est de déchiffrer une chaîne en échangeant chaque lettre avec la lettre suivante du même cas, tout en laissant les caractères non-lettre inchangés.
Explication pas à pas
Le premier caractère est un
E
. Nous cherchons la lettre suivante en majuscule: c’est aC
. Nous échangeons ces caractères, ce qui conduit àCdoE!
.Nous passons au caractère suivant: c’est un
d
. Nous cherchons la lettre suivante en minuscule: c’est ao
. Nous échangeons ces caractères, ce qui conduit àCodE!
.Nous passons au caractère suivant: il s’agit de celui
d
que nous venons de déplacer ici. Nous l'ignorons car il a déjà été traité.Nous passons au caractère suivant: il s’agit de celui
E
qui a été déplacé ici à l’étape 1. Nous l'ignorons car il a déjà été traité.Nous passons au caractère suivant: c’est un
!
. Nous l'ignorons, car ce n'est pas une lettre.
Règles
Vous pouvez supposer que la chaîne d'entrée est composée exclusivement de caractères ASCII imprimables, compris entre 32 et 126.
Vous pouvez écrire un programme complet ou une fonction qui imprime ou renvoie le résultat.
Si la chaîne d'entrée contient un nombre impair de lettres, la dernière lettre restante ne peut pas être remplacée par une autre et doit rester en place, quelle que soit sa casse. La même logique s'applique si la chaîne contient un nombre pair de lettres, mais un nombre impair de lettres majuscules et un nombre impair de lettres minuscules.
C'est du code-golf, donc la réponse la plus courte en octets est gagnante. Les échappatoires standard sont interdites.
Cas de test
Input : lLEhW OroLd!
Output: hELlO WorLd!
Input : rpGOZmaimgn uplRzse naC DEoO LdGf
Output: prOGRamming puzZles anD COdE GoLf
Input : eIt uqHKC RBWOO xNf ujPMO SzRE HTL EOvd yAg
Output: tHe quICK BROWN fOx juMPS OvER THE LAzy dOg
Input : NraWgCi: Nsas-eNEiTIsev rNsiTG!!
Output: WarNiNg: Case-sENsITive sTriNG!!
Cas de test pas si aléatoires:
Input : (^_^)
Output: (^_^)
Input : AWCTY HUOS RETP
Output: WATCH YOUR STEP
Input : hwn oeesd acsp nawyya
Output: who needs caps anyway
Input : SpMycaeIesKyBorekn
Output: MySpaceKeyIsBroken
Input : D's mroyr, Ivam. I'e faardi I act'n od htta.
Output: I'm sorry, Dave. I'm afraid I can't do that.
Réponses:
Gelée ,
21201918 octetsEssayez-le en ligne!
Comment ça fonctionne
la source
Retina , 53 octets
Pas vraiment intelligent, mais une solution propre et assez lisible
Essayez-le en ligne!
la source
MATL , 22 octets
Essayez-le en ligne! Ou vérifiez tous les cas de test .
Comment ça fonctionne
la source
Utilitaires Bash + Unix,
7762575654 octetsEntrée en stdin. Sortie en stdout.
(Dans cette dernière version, stderr est également écrit, mais le consensus du PPCG semble être que c'est OK - stderr est simplement ignoré. )
Edit 1: Merci à @Dennis pour 15 octets! Améliorations: (a) Prise d’entrée via stdin; (b) combiner 2 scripts sed en un seul; et (c) remplacer tr par substitution par expansion du paramètre bash; (b) et (c) ont disparu dans Edit 2.
Edit 2: Plus court de 5 octets supplémentaires. Utilisé un appel de fonction pour remplacer (b) et (c) dans l’édition 1.
Edit 3: Un octet supplémentaire - passé] dans les arguments de la fonction.
Edit 4: Remplacement des deux appels de fonction par des appels au programme même s’il n’a pas d’argument.
Banc d'essai et sortie d'échantillon:
la source
ES6,
18595 octetsSolution sévèrement raccourcie à l'aide de @Neil, @Arnauld et @ edc65
Explication
la source
/[a-z]/i.test(c)?o[e=c>"Z"]=1/(b=o[e])?[o[b],o[j]]=[c,o[b]]:j:0
[o[b],o[j]]=[c,o[b]]
pourrait êtreo[o[j]=o[b],b]=c
Python , 82 octets
Essayez-le en ligne!
la source
QBasic, 229 octets
Stratégie
Nous parcourons la chaîne d'entrée. Lorsque nous rencontrons une lettre majuscule, nous la stockons et sa position. La deuxième fois que nous rencontrons une lettre majuscule, nous utilisons ces valeurs stockées pour l'échanger avec la précédente. Même chose pour les minuscules.
(J'étais sur le point de publier une version un peu plus longue qui utilisait un tableau, car je pensais que les chaînes QBasic étaient immuables. Puis, je suis tombé sur le fait que
MID$(strng$, index, length) = replacement$
fonctionne parfaitement. Vivez et apprenez.)Ungolfed + a commenté
la source
C ++ 11 (GCC),
154149 octetsla source
#include<string>
soit passer à C ++ 14 et déclarer un lambda générique[](auto s)
et supposers
être destd::string
. En outre, la déclaration[](auto&s)
vous évite de renvoyer la chaîne, car il est permis de modifier les arguments d'entrée afin qu'ils servent de sortie.Qbasic,
436408 octetsSauvegardé d'un octet grâce à DLosc. En a sauvé plusieurs autres en modifiant le traitement des caractères autres que des lettres.
Cela consiste essentiellement en trois parties:
Une explication plus détaillée (notez qu'il s'agit d'une version antérieure du code, mais le principe s'applique toujours):
la source
PHP,
1089383 octetsVersion précédente (93 octets)
Merci à @ user59178 de me rappeler que les
preg_replace()
tableaux de chaînes peuvent être utilisés comme arguments.La réponse originale (108 octets)
Le code est emballé ici pour s'adapter à l'espace disponible.
Il peut être exécuté à partir de la ligne de commande:
Une version plus courte de 1 octet est possible sur PHP 7 en compressant l'attribution de l'
$f
intérieur de son premier appel:Les deux solutions, avec des cas de test et des versions non golfées, sont disponibles sur Github .
la source
preg_replace
peut prendre toute une série de remplacements pour que vous n’ayez besoin que d’un seul appel. De plus, il est plus court à utiliser<?=
queecho
. Avec ceux-ci, il est simple d'obtenir votre réponse à 93 octets.preg_replace()
. Je l'ai oublié. Je n'aime pas<?=
(à mon avis, cela<?
ne fait pas partie du langage, ce n'est qu'un marqueur) et j'aime écrire de courts programmes d'une ligne pouvant être exécutés à partir de la ligne de commandephp -r
. Mais pour les besoins du code golf, vous avez encore raison. Je peux économiser 1 octet en utilisant<?=
.Mathematica, 96 octets
Une réponse de Leo's Retina , qui utilise des expressions régulières.
la source
Python 2 , 124 octets
Pas aussi court que ma solution basée sur regex , mais je pense que c'est toujours intéressant.
Essayez-le en ligne!
la source
Haricot , 83 octets
Hexdump:
JavaScript équivalent:
Explication:
Prenant implicitement la première ligne d'entrée non formatée comme
a
(car les nouvelles lignes ne peuvent pas faire partie d'une chaîne embrouillée), et génère implicitement une chaîne non embrouillée en remplaçant séquentiellement les paires majuscules, puis minuscules.Essayez la démo ici.
Essayez la suite de tests ici.
la source
Ruby, 81 octets
la source
JavaScript (ES6), 80 octets
Basé sur la réponse de Leo à la rétine .
Cela fonctionne car les seuls caractères majuscules du code
.replace(/([A-Z])([^A-Z]*)([A-Z])/g,'$3$2$1')
sontA
etZ
, utilisés pour décrire les plages de caractères. C’est précisément ce que nous devons transformer en minuscules pour pouvoir traiter le second passage.Cas de test
Afficher l'extrait de code
la source
ES6 155 - 195 octets
Je sais qu'il y a déjà une meilleure réponse, mais je voulais essayer sans regex. Celui-ci fonctionne également sur la ponctuation, mais cela semble violer le
(^_^)
test. Dans ce cas, j'ai une autrec()
fonction, donnée ci-dessous.Explication
la source
Perl 6 , 56 octets
Prend une variable de chaîne en tant qu'argument et la modifie sur place de sorte que, après avoir appelé le lambda, la variable contienne le résultat.
Plus long que ce serait en Perl, parce que:
<[A..Z]>
de[A-Z]
.EVAL
, ce qui permettrait plus de flexibilité, nécessite leuse MONKEY-SEE-NO-EVAL;
pragma hostile au golf .Du côté positif, un tableau dans une
@
variable peut être référencé directement dans une expression rationnelle et est traité comme une alternance.Perl 6 , 65 octets
Version fonctionnelle (renvoie le résultat comme valeur de retour du lambda).
la source
R, 343 octets
Terriblement maladroite solution R:
la source
Python 2, 181 octets
Beaucoup plus long que prévu, mais quand même:
Cette première crée deux listes: l’un des index des majuscules et l’autre pour les minuscules. Chacune de ces listes est bouclée par paires d'index et les caractères de ces index sont permutés.
Je vais jouer au golf demain
, mais pour le moment, il est temps de dormir.la source
Pip , 28 octets
Prend l'entrée en tant qu'argument de ligne de commande. Essayez-le en ligne!
Explication
C'est une solution de regex, utilisant les variables de regex intégrées
XL
(lettres minuscules`[a-z]`
) etXU
(lettres majuscules`[A-Z]`
).Lorsque le deuxième argument de
R
est une liste, les remplacements sont effectués en série; ainsi, le remplacement minuscule et le remplacement majuscule n'interfèrent pas l'un avec l'autre.la source
Perl 5 , 48 + 1 (-p) = 49 octets
Essayez-le en ligne!
la source
AWK ,
121129 octetsEssayez-le en ligne! Remarque: La liaison a 8 octets supplémentaires pour permettre une entrée multiligne.
L'utilisation est assez typique, mais nécessite une version
AWK
acceptant une chaîne vide comme séparateur de champs (la plupart des versions degawk
mais je suis à peu près sûr que l'originalAWK
échouerait :()C'est très simple car il suffit d'itérer chaque caractère et de vérifier s'il a déjà été trouvé. Si tel est le cas, il permute les caractères et réinitialise l'index vérifié. Pour ce qui est de l’apprentissage, je n’avais jamais utilisé une déclaration de mission dans une déclaration de mission dans
AWK
auparavant. Pour une raison quelconque, cela ne s'était jamais produit. :)Je pourrais peut-être raser quelques octets en disant d'affecter OFS et FS en dehors d'un
BEGIN
bloc via une affectation de ligne de commande ou similaire, mais c'est "plus propre" de cette façon.L'ajout du lien TIO m'a montré que j'avais une erreur de transcription nécessitant 8 octets de réparation :( (j'ai omis
0*(U=a):
)la source
C (gcc) ,
212206 octetsEssayez-le en ligne!
la source
Stax , 18 octets
Exécuter et déboguer
L'approche générale est basée sur les regex.
[a-z].*?[a-z]
.la source
R ,
223163 octets148 octetsEDIT: -60 octets en implémentant une boucle for
EDIT: -15 octets de Giuseppe
Essayez-le en ligne!
Fonctionne en testant si le caractère est en minuscule ou en majuscule, les place dans une matrice, inverse la matrice pour extraire les valeurs dans un format échangé. Puis sortie avec
cat
. Essayez-le en lignescan(,'')
si le code comporte plus d'une ligne, d'où les points-virgules de la ligne de code.la source
x
violon est un peu malin, mais il fallait aussim=matrix
4 octets pour s'en débarrasser .scan(,'')
problème? Et en réduisant le "lLEhW OroLd!" dans TIOscan(,'')
ou un autre moyen d'obtenir une contribution?Java 7, 117 octets
EDIT: Je viens de remarquer que j'ai une réponse similaire à celle de Retina de @Leo , même si j'y ai réfléchi indépendamment.
Ungolfed:
Code de test:
Essayez ici.
Sortie:
la source