Supprimer des espaces, maintenir la capitalisation

27

Votre entrée sera une phrase, une expression ou un mot en anglais. Il contiendra seulement a-zA-Z' -,.!?. Votre tâche consiste à prendre l'entrée, à supprimer des espaces, puis à redistribuer les majuscules de sorte que les lettres des index qui ont été capitalisées auparavant (et uniquement les lettres des index qui ont été capitalisées auparavant) soient capitalisées.

Par exemple, si l'entrée est A Quick Brown Fox Jumped Over The Lazy Dog, les index (basés sur 0) des lettres majuscules le sont 0, 2, 8, 14, 18, 25, 30, 34, 39. Ensuite, supprimer les espaces de l'entrée: AQuickBrownFoxJumpedOverTheLazyDog. Ensuite, toutes les lettres minuscules, majuscules , mais ceux à 0, 2, 8, 14, 18, 25, 30, 34, 39: AqUickbrOwnfoxJumpEdovertHelazYdogqui est votre sortie.

Contribution

Votre entrée sera une phrase, une expression ou un mot en anglais. Il ne peut contenir que des lettres minuscules, des lettres majuscules, des tirets, des apostrophes, des virgules, des points, des points d'interrogation, des points d'exclamation et des espaces.

Sortie

L'entrée avec les espaces supprimés, minuscule-d, avec des lettres à l'index des lettres majuscules dans l'entrée majuscule-d.

Remarque: votre programme ne peut pas planter (erreur telle exécution se termine) avec un IndexOutOfRange ou une erreur similaire.

Cas de test

Hi! Test!
Hi!tEst!

A Quick Brown Fox Jumped Over The Lazy Dog
AqUickbrOwnfoxJumpEdovertHelazYdog

testing TESTing TeStING testing testing TESTING
testingtESTIngteStInGTEstingtestingtestiNG

TESTING... ... ... success! EUREKA???!!! maybe, don't, NOOOOO
TESTING.........success!eureKA???!!!maybe,don't,nooooo

Enter        PASSWORD ---------
Enterpassword---------

A a B b C c D d E e F f G g H h I i J j K k L l M m N n O o P p Q q R r S s T t U u V v W w X x Z z
AabbCcddEeffGghhIijjKkllMmnnOoppQqrrSsttUuvvWwxxZz

  TEST
teST
Stephen
la source
Sandbox
Stephen
'Par exemple, si l'entrée est "Un renard brun rapide sauté par-dessus le chien paresseux", les index (basés sur 0) des majuscules sont 0, 2, 8, 14, 18, 23, 27, 32' Ils le sont0, 2, 8, 14, 18, 25, 30, 34, 39
Luke Sawczak
@LukeSawczak merci, ma mauvaise
Stephen
Les espaces d'essai ne sont pas autorisés, je suppose?
Luis Mendo
@LuisMendo votre hypothèse est correcte. C'est du code-golf, non? : P
Stephen

Réponses:

7

Gelée , 14 13 octets

nŒlTɓḲFŒlŒuṛ¦

Essayez-le en ligne!

Comment ça marche

nŒlTɓḲFŒlŒuṛ¦  Main link. Argument: s (string)

 Œl            Convert s to lowercase.
n              Perform character-wise "not equal" comparison.
   T           Get the indices of all truthy elements, i.e., the indices of all
               uppercase letters in s. Let's call the resulting array J.
    ɓ          Begin a dyadic chain with left argument s and right argument J.
     ḲF        Split s at spaces and flatten, removing the spaces.
       Œl      Convert s to lowercase.
            ¦  Sparse application:
         Œu        Convert s to uppercase.
           ṛ       Take the resulting items of the uppercased string at all indices
                   in J, the items of the lowercased string at all others.
Dennis
la source
14

C (gcc) , 82 79 74 72 69 67 66 octets

f(c){for(char*s=c,*p=c;c=*s++;c&&putchar(c^(*p++|~c/2)&32))c&=95;}

Essayez-le en ligne!

Dennis
la source
7

Python 2 , 114 octets

x=input()
X=x.replace(' ','')
print''.join([X[i].upper()if x[i].isupper()else X[i].lower()for i in range(len(X))])

Essayez-le en ligne!

De manière équivalente:

Python 2 , 114 octets

lambda x:''.join([[str.lower,str.upper][x[i].isupper()](x.replace(' ','')[i])for i in range(len(x)-x.count(' '))])

Essayez-le en ligne!

HyperNeutrino
la source
''.join([(X[i].lower,X[i].upper)[x[i].isupper()]()for i in range(len(X))])pour -5 octets.
2017 à 12h08
5

Python 3 , 78 75 72 octets

s=input()
for c in s:s=s[c>' '!=print(end=(c+c).title()[s<'@'or'['<s]):]

Merci à @xnor d'avoir joué au golf sur 6 octets!

Essayez-le en ligne!

Dennis
la source
Pouvez-vous comparer sau lieu de s[0]?
xnor
Oui bien sûr. Merci!
Dennis
1
(c*2).title()peut vous obtenir les deux cas, bien que commutés.
xnor
Encore 3 octets. Merci encore!
Dennis
Rusé! Il m'a fallu un certain temps pour comprendre que cela c>' '!=f()équivaut à (c>' ') and (' '!=f()).
Chas Brown
5

05AB1E , 15 14 octets

-1 octet grâce à Emigna

ðKuvy¹Nè.lil}?

Essayez-le en ligne!

ðK             # Remove spaces
  u            # Convert to uppercase
   vy          # For each character...
     ¹Nè       #   Get the character at the same index from the original input
        .lil}  #   If it was a lowercase letter change this one to lowercase
             ? # Print without a newline
Riley
la source
Vous enregistrez un octet si vous mettez en majuscule la chaîne supprimée et la minuscule dans la condition.
Emigna
5

Haskell , 98 95 89 88 81 octets

Merci à @name, @nimi, @Zgarb et @Laikoni pour avoir aidé à raser 14 octets au total

import Data.Char
\s->zipWith(\p->last$toLower:[toUpper|isUpper p])s$filter(>' ')s

Non golfé:

import Data.Char
\sentence -> zipWith (\oldChar newChar ->
                        if isUpper oldChar
                        then toUpper newChar
                        else toLower newChar)
                     sentence
                     (filter (/= ' ') sentence)
Julian Wolf
la source
Sur mobile, mais il semble que vous pouvez enregistrer quelques octets avec le filtre (/ = '')
Henry
Oui, certainement. Vous avez manqué la partie de la spécification en notant que les espaces étaient le seul espace blanc à supprimer.
Julian Wolf
1
filter(>' ')pour un octet de moins
nimi
2
Je pense que le corps de la lambda peut être raccourci àlast(toLower:[toUpper|isUpper p])c
Zgarb
Commutant les arguments de zipWithdoit enregistrer un octet: f s=zipWith(\p->last$toLower:[toUpper|isUpper p])s$filter(>' ')s.
Laikoni
4

V , 24 octets

ÄVuÓó
ejlDò/¥2lõ
vuk~òGd

Essayez-le en ligne!

Ce genre de défis est exactement ce pour quoi V a été conçu. :)

Explication:

Ä           " Duplicate this line
 Vu         " Convert it to lowercase
   Óó       " Remove all spaces
e           " Move to the end of this line
 j          " Move down a line (to the original)
  l         " Move one char to the right
   D        " And delete the end of this line
    ò       " Recursively:
     /      "   Search for:
         õ  "     An uppercase character
      ¥2l   "     On line 2
            "     (This will break the loop when there are no uppercase characters left)
vu          "   Convert it to lowercase
  k         "   Move up a line
   ~        "   Convert this to uppercase also
    ò       " Endwhile
     G      " Move to the last line
      d     " And delete it
DJMcMayhem
la source
@DLosc Bonnes questions! Les sauts de ligne signalent la fin d'une commande regex, telle qu'une commande de remplacement (suppression) ou de recherche. Plus de détails sur cette page: github.com/DJMcMayhem/V/wiki/Regexes
DJMcMayhem
4

Python 2, 100 octets

s=input()
print"".join([c.lower(),c.upper()][s[i].isupper()]for i,c in enumerate(s.replace(" ","")))
erik
la source
3
Bienvenue chez PPCG, et très bonne première réponse!
ETHproductions
3

Alice , 32 octets

/..- ~l+u~mSloy
\ia''-y.'Qa.+a@/

Essayez-le en ligne!

Explication

Il s'agit d'un modèle standard pour les programmes qui fonctionnent entièrement en mode ordinal. Déballé, le programme est le suivant:

i.' -l.uQm.lay.a-'~y+'~aS+o@

i       take input as string
.       duplicate
' -     remove spaces from copy
l.u     create all-lowercase and all-uppercase versions
Q       reverse stack, so original string is on top
m       truncate original string to length of spaces-removed string
.lay    convert everything except uppercase characters to \n
.a-'~y  convert everything except \n (i.e., convert uppercase characters) to ~
+       superimpose with lowercase string
        \n becomes the corresponding lowercase character, and ~ remains as is
'~aS    convert ~ to \n
+       superimpose with uppercase string
        lowercase in existing string stays as is because it has a higher code point
        \n becomes corresponding uppercase character
o       output
@       terminate
Nitrodon
la source
3

JavaScript (ES6), 94 91 85 octets

s=>s.replace(/./g,c=>c==" "?"":c[`to${"@"<s[x]&s[x++]<"["?"Upp":"Low"}erCase`](),x=0)
  • 6 octets enregistrés avec l'aide d'ETHproductions & Arnauld.

Essayez-le

o.innerText=(f=

s=>s.replace(/./g,c=>c==" "?"":c[`to${"@"<s[x]&s[x++]<"["?"Upp":"Low"}erCase`](),x=0)

)(i.value="Hi! Test!");oninput=_=>o.innerText=f(i.value)
<input id=i><pre id=o>

Hirsute
la source
Pourriez-vous faire '@'<s[i]&s[i]<'['??
ETHproductions
@StepHen: Aw, mec, je n'ai pas vu ça hier soir pendant que je travaillais dessus.
Shaggy
@ETHproductions: Je me demandais si cela pourrait être plus court, mais j'étais trop paresseux pour rechercher les caractères que je devrais utiliser: D Il s'avère que cela permet d'économiser un octet; Merci.
Shaggy
3

Rétine , 77 71 octets

.+
$&¶$&
T`L `l_`.+$
+`((.)*)[A-Z].*(¶(?<-2>.)*)
$1$3 
.+¶

T`l `L_` .?

Essayez-le en ligne! Le lien inclut une suite de tests. Explication: La première étape duplique la ligne tandis que la deuxième étape minuscule le doublon et supprime ses espaces. La troisième étape parcourt ensuite chaque lettre majuscule de droite à gauche et tente de placer un espace avant le caractère correspondant sur la deuxième ligne. La première ligne est supprimée et les espaces sont utilisés pour mettre en majuscule les caractères pertinents du résultat. Edit: sauvé 6 octets grâce à @Kobi.

Neil
la source
Petite question: les pièces (.?)et sont- $4elles nécessaires? On dirait qu'avoir un groupe optionnel à la fin ne fait rien.
Kobi
@Kobi Rien de petit sur cette question! Cela faisait à l'origine partie d'une tentative d'utilisation de contournements pour faire correspondre directement les caractères à mettre en majuscule au lieu de devoir les traduire comme une étape distincte.
Neil
3

Perl, 95 94 + 1 = 95 octets

Pénalité de +1 octet pour -n

Enregistrer un octet en remplaçant de s/\s//gàs/ //g

$s=$_;s/ //g;$_=lc($_);while(/(.)/gs){$p=$&;$p=uc($p)if(substr($s,$-[0],1)=~/[A-Z]/);print$p;}

Essayez-le en ligne!

Explication:

  1. Faites une copie de la chaîne d'entrée.

  2. Supprimez tous les espaces et transformez la chaîne en minuscules.

  3. Ensuite, démarrez la boucle sur chaque lettre. Testez la lettre dans la même position dans la chaîne enregistrée pour les majuscules. S'il est supérieur - rendre la lettre actuelle sous-titrée. Imprimer la lettre.

Notez que perl doit être exécuté avec le commutateur de ligne de commande "-n"

Veitcel
la source
Bienvenue chez PPCG! Si vous le souhaitez, vous pouvez ajouter un lien vers Try It Online: tio.run/# (je l'ajouterais, mais je ne sais pas si c'est Perl 5 ou Perl 6)
Stephen
1
Je pense que vous devez compter l' +1octet pour le -ndrapeau. A part ça, ça a l'air bien! Bienvenue sur le site! :)
DJMcMayhem
@StepHen c'est Perl 5, colud vous ajoutez un lien? Je n'ai pas réussi à y exécuter mon code de manière appropriée.
Veitcel
Heureux de voir un nouveau golfeur Perl! J'ai ajouté le lien TIO à votre réponse et amélioré la mise en forme.
Dada
2

Python 3 , 117 octets

s=input()
y=list(s.replace(' ','').lower())
i=0
for c in y:
 if s[i].isupper():y[i]=c.upper()
 i+=1
print(''.join(y))

Essayez-le en ligne!

C'est à peu près mon premier code de golf, donc c'est probablement mauvais, sans l'aide des commentaires ci-dessous!

PS Oui, il est stupide que la définition et l'incrémentation iéconomise des octets sur la plage (len (y)). Tant pis.

Luke Sawczak
la source
1
Bienvenue chez PPCG! Belle première soumission! Cependant, conformément aux normes d'E / S de notre site, votre soumission doit soit être fonction d'une chaîne, soit prendre une entrée; vous ne pouvez pas supposer que l'entrée se trouve dans une variable. J'espère que vous apprécierez votre séjour! :)
HyperNeutrino
Merci; a édité une fonction dans, mais a également enregistré 5 octets dans le corps: D
Luke Sawczak
1
@LukeSawczak économisez une tonne d'octets en passant à un espace pour l'indentation, et peut-être ajoutez un essai en ligne! lien si vous voulez
Stephen
1
Vous pouvez supprimer l'espace après return.
CalculatorFeline
@LukeSawczak comment ça? tio.run/…
Stephen
2

C # (.NET Core) , 108101 octets

using System.Linq;s=>s.Replace(" ","").Select((c,i)=>s[i]>64&s[i]<91?char.ToUpper(c):char.ToLower(c))

Essayez-le en ligne!

  • 7 octets enregistrés après avoir réalisé que la charclasse a des méthodes ToUpper()et des statiques ToLower().
Charlie
la source
2

Fusain , 33 octets

A⁰χFLθ¿⁼§θι A⁺¹χχ¿№α§θ⁻ιχ↥§θι↧§θι

Essayez-le en ligne!

Comme je ne sais toujours pas comment passer une chaîne avec des espaces en tant que paramètre d'entrée unique dans le code Charcoal, j'assigne simplement dans l'en-tête la chaîne de test à la variable Charcoal qui représente ce qui serait la première entrée ( θ):

AA Quick Brown Fox Jumped Over The Lazy Dogθ

Ainsi, le code a le même nombre d'octets que si la chaîne était passée en première entrée.

Vous pouvez voir ici la version détaillée du code.

Charlie
la source
1
Je l'ai dit dans une autre réponse, mais juste au cas où vous oublieriez, entrez simplement un tableau python avec un élément
ASCII uniquement
J'ai juste besoin de l'entrée pour avoir une nouvelle ligne de fin.
Neil
2

PHP, 181 octets

J'essaye d'obtenir les nombres mineurs d'octets, voici mon code:

<?php
$s=readline();
preg_match_all('/[A-Z]/',$s,$m,PREG_OFFSET_CAPTURE);
$s=strtolower(str_replace(' ','',$s));
while($d=each($m[0]))$s[$d[1][1]]=strtoupper($s[$d[1][1]]);
echo $s;

Essayez-le en ligne!

kip
la source
Au lieu d'une constante, PREG_OFFSET_CAPTUREvous pouvez utiliser la valeur 256, $argnest une variable plus courte que readline()pour une entrée et je pense ctype_upperet utiliser lcfirstet ucfirstéconomisera beaucoup d'octets avec une boucle et l'utilisation de l' $$iopérateur ternaire
Jörg Hülsermann
2

Java 8, 184 177 161 octets

s->{String r="";for(int i=0,j=i,t,u;i<s.length;){t=s[i++];if(t>32){u=s[j++];r+=(char)(t<65|t>90&t<97|t>122?t:u>64&u<91?t&~32:u>96&u<123|u<33?t|32:t);}}return r;}

Peut certainement être joué un peu plus ..
- 16 octets grâce à @ OlivierGrégoire en prenant l'entrée comme char[]au lieu de String.

Explication:

Essayez-le ici.

s->{                           // Method with char-array parameter and String return-type
  String r="";                 //  Result-String
  for(int i=0,j=i,t,u;         //  Some temp integers and indices
      i<s.length;){            //  Loop over the String
    t=s[i++];                  //   Take the next character and save it in `t` (as integer)
                               //   and raise index `i` by 1
    if(t>32){                  //   If `t` is not a space:
     u=s[j++];                 //   Take `u` and raise index `j` by 1
     r+=                       //   Append the result-String with:
      (char)                   //    Integer to char conversion of:
       (t<65|t>90&t<97|t>122?  //     If `t` is not a letter:
        t                      //      Simply use `t` as is
       :u>64&u<91?             //     Else if `u` is uppercase:
        t&~32                  //      Take `t` as uppercase
       :u>96&u<123|u<33?       //     Else if `u` is lowercase or a space:
        t|32                   //      Take `t` as lowercase
       :                       //     Else:
        t);                    //      Take `t` as is
    }
  }                            //  End of loop
  return r;                    //  Return result-String
}                              // End of method
Kevin Cruijssen
la source
1
Prenez un char[]au lieu d'une chaîne pour celui-ci, vous économiserez beaucoup d'octets!
Olivier Grégoire
D'un autre côté, j'ai aussi répondu avec un autre algorithme. Et là, je prends les arguments opposés: in = String, out = char[]:-)
Olivier Grégoire
2

Lisp commun, 104 octets

(defun f(s)(map'string(lambda(x y)(if(upper-case-p x)(char-upcase y)(char-downcase y)))s(remove #\  s)))

Essayez-le en ligne!

Exceptionnellement court pour le verbeux Common Lisp!

Code simple:

(defun f (s)                     ; receive the string as parameter
  (map 'string                   ; map the following function of two arguments
       (lambda (x y)             ; x from the original string, y from the string with removed spaces
         (if (upper-case-p x)    ; if x is uppercase
             (char-upcase y)     ; get y uppercase
             (char-downcase y))) ; else get y lowercase
       s
       (remove #\  s)))
Renzo
la source
2

Java (OpenJDK 8) , 150 117 113 97 bytes

s->{for(int i=0,j=0,c;i<s.length;)if((c=s[i++]&95)>0)System.out.printf("%c",c^(s[j++]|~c/2)&32);}

Essayez-le en ligne!

En jouant plus, je suis arrivé à 102 octets:

s->{for(int i=0,j=0,c;i<s.length;)if((c=s[i++]&95)>0)System.out.printf("%c",c<64?c|32:c|s[j]&32,j++);}

Essayez-le en ligne!

Mais je me souvenais que cela commençait à ressembler à la réponse de Dennis 'C, alors j'ai simplement porté son peu de twiddling et ... la magie s'est produite. Le gros gain du port est la suppression des branches et des répétitions à l'intérieur.

Olivier Grégoire
la source
@ceilingcat qui ne fonctionne pas: Hi! Test!devrait devenir Hi!tEst!, mais avec votre solution cela devient Hi!Test.
Olivier Grégoire
2

Google Sheets, 213 octets

=ArrayFormula(JOIN("",IF(REGEXMATCH(MID(A1,ROW(OFFSET(A1,0,0,LEN(A1))),1),"[A-Z]"),MID(UPPER(SUBSTITUTE(A1," ","")),ROW(OFFSET(A1,0,0,LEN(A1))),1),MID(LOWER(SUBSTITUTE(A1," ","")),ROW(OFFSET(A1,0,0,LEN(A1))),1))))

L'entrée est dans la cellule A1et la formule se décompose comme suit:

  • ArrayFormula()nous permet d'évaluer chaque terme de manière ROW()indépendante
  • JOIN() concatène tous ces résultats indépendants en une seule chaîne
  • IF(REGEXMATCH(),UPPER(),LOWER() est ce qui le rend alternatif en utilisant des majuscules ou des minuscules selon ce que le boîtier était à cette position dans l'entrée
  • ROW(OFFSET())retourne un tableau de valeurs 1à A1.lengthqui peut être introduit dans la MID()fonction afin que nous puissions évaluer chaque personnage à son tour

Résultats des cas de test: (Il est plus facile à lire si vous cliquez sur la version plus grande.)

TestCases

Ingénieur Toast
la source
2

Ruby , 80 octets

->a{n=a.downcase.delete' '
n.size.times{|i|(?A..?Z)===a[i]&&n[i]=n[i].upcase}
n}

Essayez-le en ligne!

Alex
la source
Vous pouvez économiser quelques octets en utilisant au n.gsub(/./){}lieu de n.size.times{};n: n.gsub(/./){(?A..?Z)===a[i]?$&.upcase: $&}.
Jordan
2

Perl, 92 octets

$p[$i++]=$-[0]while s/[A-Z]/lc($&)/e;s/\s//g;for$c(@p){substr($_,$c,1)=~tr[a-z][A-Z]};print;

Explication:

$p[$i++]=$-[0]while s/[A-Z]/lc($&)/e;   #get locations of caps into an array at the same time converting letters to lowercase

s/\s//g;   #delete all spaces

for$c(@p){substr($_,$c,1)=~tr[a-z][A-Z]};   #convert lowercase letters to uppercase where uppercase letters were present

print;   # print (of course) :)
jmatix
la source
1
Bienvenue chez PPCG! :)
Stephen
Vous devez ajouter un -nindicateur pour valider votre réponse. Quelques choses au golf: cela s/ //gsuffit (pas besoin \s), y/a-z/A-Z/c'est la même chose que tr[a-z][A-Z], vous pouvez utiliser le -pdrapeau pour que vous n'ayez pas besoin du dernier print, vous n'avez pas besoin des parenthèses lc$&.
Dada
1

C, 103 octets

i,j,c;f(char*s){for(i=j=0;c=tolower(s[j++]);)c-32&&putchar(c-32*(s[i]>64&&s[i]<91&&c>96&&c<123))&&++i;}

Essayez-le en ligne!

Steadybox
la source
1

Python 3 , 125 , 124 octets

lambda s:''.join(c.upper()if i in(s.find(q)for q in s if q.isupper())else c for i,c in enumerate(s.replace(' ','').lower()))

Essayez-le en ligne!

Christian Dean
la source
1

Python 2, 106 105 octets

s=input()
print''.join(map(lambda(c,u):[c.lower,c.upper][u](),zip(s.replace(' ',''),map(str.isupper,s))))

Modifier: enregistrez un octet via print ''.join=> print''.join.

Forme lambda, 99 octets

lambda s:''.join(map(lambda(c,u):[c.lower,c.upper][u](),zip(s.replace(' ',''),map(str.isupper,s))))
Chas Brown
la source
1

SCALA, 128 caractères, 128 octets

var l=s.toLowerCase().filter(x=>x!=32)
for(i<-0 to l.size-1){if(s(i).isUpper)l=l.substring(0,i)+l(i).toUpper+l.substring(i+1)}
l

Merci pour ce défi. Essayez-le en ligne!

V. Courtois
la source
1

q / kdb +, 49 octets

Solution:

{@[a;(&)#:[a:lower x except" "]#x in .Q.A;upper]}

Exemples:

q){@[a;(&)#:[a:lower x except" "]#x in .Q.A;upper]}"Hi! Test!"
"Hi!tEst!"

q){@[a;(&)#:[a:lower x except" "]#x in .Q.A;upper]}"A Quick Brown Fox Jumped Over The Lazy Dog"
"AqUickbrOwnfoxJumpEdovertHelazYdog"

q){@[a;(&)#:[a:lower x except" "]#x in .Q.A;upper]}"testing TESTing TeStING testing testing TESTING"
"testingtESTIngteStInGTEstingtestingtestiNG"

q){@[a;(&)#:[a:lower x except" "]#x in .Q.A;upper]}"TESTING... ... ... success! EUREKA???!!! maybe, don't, NOOOOO"
"TESTING.........success!eureKA???!!!maybe,don't,nooooo"

q){@[a;(&)#:[a:lower x except" "]#x in .Q.A;upper]}"Enter        PASSWORD ---------"
"Enterpassword---------"

q){@[a;(&)(#:[a:lower x except" "]#x)in .Q.A;upper]}"A a B b C c D d E e F f G g H h I i J j K k L l M m N n O o P p Q q R r S s T t U u V v W w X x Z z"
"AabbCcddEeffGghhIijjKkllMmnnOoppQqrrSsttUuvvWwxxZz"

q){@[a;(&)#:[a:lower x except" "]#x in .Q.A;upper]}"  TEST"
"teST"

Explication:

Recherchez les index dans lesquels l'entrée est en majuscules, puis appliquez la fonction upperà ces index sur une version en minuscules et sans espace de la chaîne d'entrée. Notez que nous ne pouvons pas appliquer la fonction au-delà de la longueur de la chaîne, utilisez donc take ( #) pour tronquer la chaîne d'entrée à la longueur de la version en minuscule et à espace supprimé.

{@[a;where count[a:lower x except " "]#x in .Q.A;upper]} / ungolfed
{                                                      } / lambda function
 @[ ;                                           ;     ]  / apply FUNC to VAR at INDICES: @[VAR;INDICES;FUNC]
                                                 upper   / uppercase, upper["abc"] -> "ABC"
                                       x in .Q.A         / boolean list where input is in uppercase alphabet ABC..XYZ
                                      #                  / take this many elements from list on the right (ie truncate)
           count[                    ]                   / returns length of the stuff inside the brackets, count["ABC"] -> 3                                        
                         x except " "                    / remove " " from string
                   lower                                 / lowercase, lower["ABC"] -> "abc"
                 a:                                      / save in variable a
     where                                               / returns indices where true where[101b] -> 0 2
   a                                                     / our lowercased, space-stripped input

Prime:

Après avoir lu les réponses, j'ai pensé essayer une solution où j'itérerais sur l'entrée, jusqu'à présent, je n'ai géré qu'une solution de 53 octets:

{a{$[y in .Q.A;upper x;x]}'#:[a:lower x except" "]#x}
streetster
la source
1

Swift 3.0, 199 octets

var s="AS Ff",i=[String](),p=[Int](),j=0;for c in s.characters{if c>="A"&&c<="Z"{p.append(j)};if c != " "{i.append(String(c).lowercased())};j=j+1};for c in p{i[c]=i[c].uppercased()};print(i.joined())

Essayez-le en ligne!

A. Pooja
la source
1

Perl 5 , 40 octets

37 octets de code + -Findicateur. (notez que sur les anciennes versions de Perl, vous devrez peut-être ajouter des -anindicateurs)

print$F[$i++]=~/[A-Z]/?uc:lc for/\S/g

Essayez-le en ligne!

Explications:
Merci à -F, @Fcontient une liste de tous les caractères de l'entrée.
for/\S/gitère sur chaque caractère non espace de l'entrée. Nous utilisons $ipour compter à quelle itération nous sommes. Si $F[$i++]est un caractère majuscule ( /[A-Z]/), alors nous imprimons le caractère courant majuscule ( uc), sinon, nous l'imprimons en minuscule ( lc). Notez cela ucet lcrenvoyez leur argument inchangé s'il ne s'agit pas d'une lettre.


Version précédente (moins golfée: 47 octets):

 s/ //g;s%.%$_=$&;$F[$i++]=~/[A-Z]/?uc:lc%ge

Essayez-le en ligne!

Dada
la source