Écrivez un programme pour remplacer toutes les occurrences de "force" par "premier" et toutes les occurrences de "premier" par "force", en conservant la casse d'origine pour toutes les positions de caractères:
"ForcefoRcefOrcE" -> "FirstfiRstfIrsT"
"FirstfiRstfIrsT" -> "ForcefoRcefOrcE"
Le reste de la chaîne doit rester inchangé, et donc exécuter votre programme deux fois retournera la chaîne d'origine:
"thirst of forces" -> "thirst of firsts" -> "thirst of forces"
Votre programme devrait fonctionner sur n'importe quelle chaîne initiale. Donc, à titre indicatif, vous feriez mieux d'éviter d'utiliser des caractères magiques comme représentation intermédiaire, car si vous essayez un remplacement en trois passes ( "force" -> "zzzzz", "first" -> "force", "zzzzz" -> "first"
), il échouera sur les chaînes contenant "zzzzz"
.
Vous devez prendre en charge la plage complète de caractères autorisée dans une définition d'une chaîne par votre langage de programmation (dans la plupart des cas, c'est Unicode). Exemple, utilisation d'une représentation de style JSON pour les caractères non imprimables (\ u + 4 chiffres):
"\u0000\u0001\u0002\u0003the Force of the firsT"
|
V
"\u0000\u0001\u0002\u0003the First of the forcE"
[Ff]
n'est pas là, vous ne devez pas remplacer le mot.Réponses:
Rétine , 33 octets
Essayez-le en ligne!
Edit: 5 octets enregistrés grâce à @MartinEnder pour avoir souligné ce qui se
Ro
passe.la source
Ro
.R
l'effet sur les plages; par exemple, je n'aurais jamais réalisé que celaRE
équivaut à86420
si vous ne l'aviez pas souligné.JavaScript (ES6),
9388 octetsEdit: économisé 5 octets en optimisant la casse des lettres inchangée.
la source
APL (Dyalog) , 61 octets
Requiert
⎕IO←0
ce qui est par défaut sur de nombreux systèmes. Peut être quatre caractères plus court en utilisant le symbole Unicode⍠
au lieu de⎕OPT
.Essayez-le en ligne!
la source
PHP, 88 octets
Versions en ligne
PHP, 110 octets
la source
$t[0]^first^force
au lieu destrtr()
.Perl 5 , 52 octets
51 octets de code +
-p
indicateur.Essayez-le en ligne!
Rien de trop fou. Recherchez les occurrences de
force
etfirst
non sensibles à la casse (s%force|first%%gi
), puis translittérez les caractères pour les convertir l'un en l'autre.la source
CJam, 66 octets
Parcourt chaque variation de cas de "premier" et "force" et essaie de se diviser dessus. S'il le peut, il le rejoint ensuite avec les mots inverses.
Pseudocode:
la source
f
est-il pertinent d'éviter de changerthirst
enthorce
oudivorce
endivirst
?Java 7,
318310 octetsOk, c'était assez dur en Java ..
Explication:
Code de test:
Essayez-le ici.
Production:
la source
c(c("..."))
!Gelée ,
3736 octetsExiste-t-il un moyen d'utiliser une réduction sur des tranches de longueur 5 à la place?
Essayez-le en ligne!
Comment?
la source
MATL , 47 octets
Essayez-le en ligne!
Cela utilise des valeurs négatives comme étape intermédiaire et après les deux passes, il prend la valeur absolue.
la source
Pyth ,
3635 octetsEssayez-le en ligne!
Pyth n'est pas particulièrement bon pour les manipulations de chaînes.
la source
Flex (lexer), 72 octets
Pour compiler et exécuter:
la source
first.l:3: EOF encountered inside an action
(oh, peu importe: il faut une nouvelle ligne à la fin)ld: library not found for -lfl
(oh tant pis, la commande estgcc lex.yy.c -ll
sur macOS)Python 2, 171 octets
Je voulais essayer de le faire en utilisant des intégrés, mais cela ne peut pas battre la méthode désordonnée avec tous les fractionnements et zips.
Je pense que c'est assez clair ce que je fais ici. Fractionnez la chaîne sur les instances de first et force (insensible à la casse), remplacez ces instances par des versions traduites à l'aide de str.translate et joignez-la à nouveau dans une chaîne.
Essayez-le en ligne!
la source
Python 2.7,
173165 octets8 octets enregistrés par quintopia
Celui-ci est devenu grossier:
Essayez-le en ligne
Décomposer étape par étape:
S.lower().split("force")
: prendre la chaîne, unifier en minuscules, diviser en sous-chaînes séparées par"force"
s.replace("first","force")for s in <STEP 1>
: Remplacez tous"first"
par"force"
_`.join("first".join(<STEP 2>)`[2::5]`_
: remplacez tous"force"
les éléments"first"
par en recombinant les"force"
sous-chaînes délimitées avec"first"
et rejoignez-les en une seule chaîne (les traits de soulignement sont ajoutés pour obtenir des graduations correctes)zip(<STEP 3>,[(2,1)[l.isupper()]for l in S])
: compresser chaque caractère de la phrase remplacée avec l'encodage en casse de la chaîne d'origine (2 pour les minuscules, 1 pour les majuscules)_`[(t[0],t[0].upper())[t[1]==1]for t in <STEP 4>]`[2::5]`_
: Restaurer le boîtier d'origine, convertit la liste en chaîne (soulignements ajoutés pour obtenir des graduations correctes)la source
C (bruit) ,
201183226214 octetsEu quelques bugs ... Il faut encore beaucoup de golf
(sauvé 12 grâce au plafond)
Essayez-le en ligne!
la source
C # 273 octets
Essayez-le en ligne!
Le port direct de la réponse Java de Kevin Cruijssen , s'avère quand il s'agit d'obtenir le caractère dans une chaîne à un index donné, C # est beaucoup plus golfique que java (
s[i++]
au lieu des.charAt(i++)
)la source
Japt , 41 octets
Essayez-le en ligne!
Cela serait considérablement plus court si Japt avait une fonction de translittération saine ...
Version alternative:
Essayez-le en ligne!
la source
C #, 235 caractères
la source
Ruby , 55 octets
Essayez-le en ligne!
la source
Java, 382 octets non-comptent
Essayez en ligne
la source
"The first, force,|first'forced!"
? De plus, vous pouvez jouer un peu à votre code actuel:if(w.equalsIgnoreCase("force")|w.equalsIgnoreCase("first"))
->,z
aprèsString s=""
etz=w.toLowerCase();if(z.equals("force")|z.equals("first"))
. Aussi,'O'
peut être79
,'C'
peut être67
et'E'
peut être69
. Et leif
else
peut être remplacé par un grand if-else ternaire, car les deux le fonts+=
.non competent
dans le titreC # (269 octets)
encore une autre solution c #, seulement la deuxième plus petite parce que j'ai déclaré deux variables et que je ne peux donc pas utiliser la syntaxe lambda. eh bien, je me suis amusé. :)
explication:
augmenter la chaîne d'origine, puis diviser sur "FORCE" et "FIRST".
agréger les résultats et à chaque fractionnement, recherchez la sous-chaîne de cinq caractères qui a été utilisée pour fractionner la chaîne d'origine en utilisant la longueur jusqu'à présent de la chaîne agrégée. si c'était "force", faites-le "en premier" et vice versa
la source