Usuń spacje, zachowując wielkie litery

27

Wprowadzony tekst będzie zdaniem w języku angielskim, frazą lub słowem. Będzie zawierać tylko a-zA-Z' -,.!?. Twoim zadaniem jest pobranie danych wejściowych, usunięcie spacji, a następnie redystrybucja wielkich liter w taki sposób, aby litery w indeksach pisanych wcześniej dużymi literami (i tylko litery w indeksach, które były wcześniej pisane wielkimi literami) były pisane wielkimi literami.

Na przykład, jeśli dane wejściowe to A Quick Brown Fox Jumped Over The Lazy Dog, indeksy (oparte na 0) wielkich liter to 0, 2, 8, 14, 18, 25, 30, 34, 39. Następnie usuń spacje z wejścia: AQuickBrownFoxJumpedOverTheLazyDog. Następnie wszystkie litery małe litery, wielkie litery, ale tych na 0, 2, 8, 14, 18, 25, 30, 34, 39: AqUickbrOwnfoxJumpEdovertHelazYdog, która jest Twój wyjściowego.

Wkład

Wprowadzony tekst będzie zdaniem w języku angielskim, frazą lub słowem. Może zawierać tylko małe litery, wielkie litery, łączniki, apostrofy, przecinki, kropki, znaki zapytania, wykrzykniki i spacje.

Wydajność

Dane wejściowe z usuniętymi spacjami, małe litery-d, z literami na indeksie wielkich liter w danych wejściowych dużymi literami-d.

UWAGA: Twój program nie może ulec awarii (błąd takiego wykonania kończy się) z błędem IndexOutOfRange lub podobnym.

Przypadki testowe

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
źródło
Piaskownica
Stephen
„Na przykład, jeśli dane wejściowe to„ Szybki brązowy lis przeskoczył nad leniwym psem ”, indeksy wielkich liter (oparte na 0) to 0, 2, 8, 14, 18, 23, 27, 32„ Są0, 2, 8, 14, 18, 25, 30, 34, 39
Łukasz Sawczak,
@LukeSawczak dziękuję, mój zły
Stephen
Zakładam, że spacje nie są dozwolone, zakładam?
Luis Mendo
@LuisMendo twoje założenie jest prawidłowe. To jest golf golfowy, prawda? : P
Stephen

Odpowiedzi:

7

Galaretka , 14 13 bajtów

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

Wypróbuj online!

Jak to działa

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
źródło
14

C (gcc) , 82 79 74 72 69 67 66 bajtów

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

Wypróbuj online!

Dennis
źródło
7

Python 2 , 114 bajtów

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

Wypróbuj online!

Odpowiednio:

Python 2 , 114 bajtów

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

Wypróbuj online!

HyperNeutrino
źródło
''.join([(X[i].lower,X[i].upper)[x[i].isupper()]()for i in range(len(X))])dla -5 bajtów.
ovs
5

Python 3 , 78 75 72 bajtów

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

Dzięki @xnor za grę w golfa z 6 bajtów!

Wypróbuj online!

Dennis
źródło
Czy możesz po prostu porównać szamiast s[0]?
xnor
Tak oczywiście. Dzięki!
Dennis
1
(c*2).title()może dostać oba przypadki, choć zamienione.
xnor
Kolejne 3 bajty. Dzięki jeszcze raz!
Dennis
Zdradliwy! Zajęło mi trochę czasu, aby dowiedzieć się, że c>' '!=f()to jest równoważne (c>' ') and (' '!=f()).
Chas Brown,
5

05AB1E , 15 14 bajtów

-1 bajt dzięki Emignie

ðKuvy¹Nè.lil}?

Wypróbuj online!

ð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
źródło
Zapisujesz bajt, jeśli ciąg znaków usunięty spacją jest pisany wielkimi literami, a warunek jest pisany małymi literami.
Emigna
5

Haskell , 98 95 89 88 81 bajtów

Dzięki @name, @nimi, @Zgarb i @Laikoni za pomoc w goleniu 14 bajtów

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

Nie golfowany:

import Data.Char
\sentence -> zipWith (\oldChar newChar ->
                        if isUpper oldChar
                        then toUpper newChar
                        else toLower newChar)
                     sentence
                     (filter (/= ' ') sentence)
Julian Wolf
źródło
Na telefonie komórkowym, ale wygląda na to, że można zapisać niektóre bajty z filtrem (/ = '')
Henry
Tak, na pewno mogę. Pominięto część specyfikacji, zauważając, że spacje były jedynymi białymi spacjami, które wymagały usunięcia.
Julian Wolf,
1
filter(>' ')za jeden bajt mniej
nimi
2
Myślę, że ciało lambda można skrócić dolast(toLower:[toUpper|isUpper p])c
Zgarb,
Przełączanie argumenty zipWithnależy zapisać jeszcze jeden bajt: f s=zipWith(\p->last$toLower:[toUpper|isUpper p])s$filter(>' ')s.
Laikoni
4

V , 24 bajty

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

Wypróbuj online!

Tego rodzaju wyzwania są dokładnie tym, dla czego stworzono V. :)

Wyjaśnienie:

Ä           " 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
źródło
@DLosc Dobre pytania! Nowe linie sygnalizują koniec polecenia wyrażenia regularnego, takiego jak polecenie zastępowania (usuwania) lub wyszukiwania. Więcej szczegółów na tej stronie: github.com/DJMcMayhem/V/wiki/Regexes
DJMcMayhem
4

Python 2, 100 bajtów

s=input()
print"".join([c.lower(),c.upper()][s[i].isupper()]for i,c in enumerate(s.replace(" ","")))
erik
źródło
3
Witamy w PPCG i bardzo dobra pierwsza odpowiedź!
ETHproductions
3

Alice , 32 bajty

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

Wypróbuj online!

Wyjaśnienie

Jest to standardowy szablon dla programów, które działają całkowicie w trybie porządkowym. Program jest rozpakowany w następujący sposób:

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
źródło
3

JavaScript (ES6), 94 91 85 bajtów

s=>s.replace(/./g,c=>c==" "?"":c[`to${"@"<s[x]&s[x++]<"["?"Upp":"Low"}erCase`](),x=0)
  • 6 bajtów zapisanych przy pomocy ETHproductions & Arnauld.

Spróbuj

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>

Kudłaty
źródło
Można zrobić '@'<s[i]&s[i]<'['??
ETHproductions
@StepHen: Aw, stary, nie widziałem ostatniej nocy, kiedy nad tym pracowałem.
Shaggy
@ETHproductions: Zastanawiałem się, czy to może być krótsze, ale byłem zbyt leniwy, by sprawdzić, jakich znaków muszę użyć: D Okazuje się, że doea zapisuje bajt; dzięki.
Kudłaty
3

Retina , 77 71 bajtów

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

T`l `L_` .?

Wypróbuj online! Link zawiera pakiet testowy. Objaśnienie: Pierwszy etap powiela linię, podczas gdy drugi etap obniża wielkość kopii i usuwa spacje. Trzeci etap następnie przechodzi przez każdą wielką literę od prawej do lewej i próbuje umieścić spację przed odpowiednim znakiem w drugim wierszu. Pierwszy wiersz jest usuwany, a spacje są używane do wielkich liter odpowiednich znaków wyniku. Edycja: Zapisano 6 bajtów dzięki @Kobi.

Neil
źródło
Małe pytanie: czy potrzebne są części (.?)i $4? Wygląda na to, że opcjonalna grupa na końcu nic nie robi.
Kobi
@Kobi Nic małego na temat tego pytania! Pierwotnie była to część próby użycia odnośników, aby dopasować znaki do wielkich liter bezpośrednio, zamiast konieczności tłumaczenia ich jako osobnego kroku.
Neil
3

Perl, 95 94 + 1 = 95 bajtów

+1 kara bajtowa za -n

Zapisz jeden bajt, zastępując od s/\s//gdos/ //g

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

Wypróbuj online!

Wyjaśnienie:

  1. Wykonaj kopię ciągu wejściowego.

  2. Usuń wszystkie spacje i przekształć ciąg znaków na małe litery.

  3. Następnie zacznij pętlę nad każdą literą. Testuj literę w tej samej pozycji w zapisanym ciągu dla wielkich liter. Jeśli jest górny - uczyń bieżącą literę kapitalizowaną. Wydrukuj list.

Zauważ, że perl musi być uruchomiony z przełącznikiem wiersza poleceń „-n”

Veitcel
źródło
Witamy w PPCG! Jeśli chcesz, możesz dodać link do Try It Online: tio.run/# (Dodałbym to, ale nie wiem, czy to jest Perl 5 czy Perl 6)
Stephen
1
Myślę, że musisz liczyć +1bajt na -nflagę. Poza tym wygląda dobrze! Witamy na stronie! :)
DJMcMayhem
@StepHen to Perl 5, czy dodałeś link? Nie udało mi się uruchomić tam mojego kodu we właściwy sposób.
Veitcel
Cieszę się, że widzę nowego golfisty Perla! Dodałem link TIO do twojej odpowiedzi i poprawiłem formatowanie.
Dada
2

Python 3 , 117 bajtów

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))

Wypróbuj online!

To właściwie mój pierwszy golfowy kod, więc prawdopodobnie będzie źle, pomijając pomoc z poniższych komentarzy!

PS Tak, to głupie, że definiowanie i zwiększanie ioszczędza bajty poza zakresem (len (y)). No cóż.

Łukasz Sawczak
źródło
1
Witamy w PPCG! Ładne pierwsze zgłoszenie! Jednakże, zgodnie ze standardami I / O naszej witryny, przesłanie musi być funkcją ciągu znaków lub mieć dane wejściowe; nie można zakładać, że dane wejściowe są w zmiennej. Mam nadzieję, że ci się spodoba! :)
HyperNeutrino
Dzięki; edytował funkcję w, ale zapisał również 5 bajtów w ciele: D
Łukasz Sawczak
1
@LukeSawczak zaoszczędź mnóstwo bajtów, zmieniając na jedno miejsce na wcięcie, i może dodaj Try It Online! link, jeśli chcesz
Stephen
1
Możesz usunąć spację później return.
CalculatorFeline
@LukeSawczak jak to jest? tio.run/…
Stephen
2

C # (.NET Core) , 108 101 bajtów

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

Wypróbuj online!

  • 7 bajtów zapisanych po uświadomieniu sobie, że charklasa ma statyczne ToUpper()i ToLower()metody.
Charlie
źródło
2

Węgiel drzewny , 33 bajty

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

Wypróbuj online!

Ponieważ nadal nie wiem, jak przekazać ciąg znaków z białymi spacjami jako pojedynczy parametr wejściowy do kodu Charcoal, po prostu przypisuję w nagłówku ciąg testowy do zmiennej Charcoal, która reprezentuje pierwsze wejście ( θ):

AA Quick Brown Fox Jumped Over The Lazy Dogθ

Zatem kod ma taką samą liczbę bajtów, jak gdyby ciąg został przekazany jako pierwsze wejście.

Możesz zobaczyć tutaj pełną wersję kodu.

Charlie
źródło
1
Powiedziałem w innej odpowiedzi, ale na wszelki wypadek zapomnij, po prostu wprowadź jako tablicę python z jednym elementem
tylko ASCII
Potrzebuję tylko danych wejściowych, aby mieć końcowy znak nowej linii.
Neil,
2

PHP, 181 bajtów

Próbuję uzyskać mniejsze liczby bajtów, to jest mój kod:

<?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;

Wypróbuj online!

wyrko
źródło
Zamiast stałej PREG_OFFSET_CAPTUREmożna użyć tej wartości 256, $argnjest ona krótszą zmienną jak readline()na dane wejściowe i myślę, że ctype_upperużycie lcfirsti ucfirstzapisanie wielu bajtów za pomocą jednej pętli i użycie $$ioperatora trójskładnikowego
Jörg Hülsermann
2

Java 8, 184 177 161 bajtów

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;}

Można zdecydowanie zagrać w golfa więcej ...
- 16 bajtów dzięki @ OlivierGrégoire , przyjmując dane wejściowe char[]zamiast String.

Wyjaśnienie:

Wypróbuj tutaj.

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
źródło
1
Weź char[]zamiast łańcucha dla tego, zaoszczędzisz mnóstwo bajtów!
Olivier Grégoire
Z drugiej strony odpowiedziałem też innym algorytmem. I tutaj biorę przeciwne argumenty: in = String, out = char[]:-)
Olivier Grégoire
2

Common Lisp, 104 bajty

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

Wypróbuj online!

Niezwykle skrótowe od niechlujnego Common Lisp!

Prosty kod:

(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
źródło
2

Java (OpenJDK 8) , 150 117 113 97 bajtów

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);}

Wypróbuj online!

Podczas gry w golfa doszedłem do 102 bajtów:

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++);}

Wypróbuj online!

Ale przypomniałem sobie, że zaczynało to wyglądać jak odpowiedź C Dennisa, więc po prostu przeniosłem jego nieco kręcące się i ... magia się wydarzyła. Dużym zyskiem z portu jest usunięcie gałęzi i powtórzeń w nich.

Olivier Grégoire
źródło
@ceilingcat, który nie działa: Hi! Test!powinien się stać Hi!tEst!, ale wraz z rozwiązaniem staje się Hi!Test.
Olivier Grégoire,
2

Arkusze Google, 213 bajtów

=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))))

Dane wejściowe są w komórce, A1a formuła rozkłada się w następujący sposób:

  • ArrayFormula()pozwala nam ocenić każdy termin ROW()niezależnie
  • JOIN() łączy wszystkie te niezależne wyniki w jeden ciąg
  • IF(REGEXMATCH(),UPPER(),LOWER() jest to, co sprawia, że ​​jest naprzemiennie, używając dużej lub małej litery, w zależności od tego, co było w tej pozycji na wejściu
  • ROW(OFFSET())Zwraca tablicę wartości 1produktu A1.length, który może być podawany do MID()funkcji, dzięki czemu możemy ocenić każdy znak z kolei

Wyniki przypadków testowych: (Łatwiej jest przeczytać, jeśli klikniesz na większą wersję).

Przypadki testowe

Inżynier Toast
źródło
2

Rubinowy , 80 bajtów

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

Wypróbuj online!

Alex
źródło
Można zaoszczędzić kilka bajtów używając n.gsub(/./){}zamiast n.size.times{};n: n.gsub(/./){(?A..?Z)===a[i]?$&.upcase: $&}.
Jordan
2

Perl, 92 bajty

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

Wyjaśnienie:

$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
źródło
1
Witamy w PPCG! :)
Stephen
Musisz dodać -nflagę, aby twoja odpowiedź była ważna. Kilka rzeczy do gry w golfa: s/ //gwystarczy (nie trzeba \s), y/a-z/A-Z/to samo tr[a-z][A-Z], możesz użyć -pflagi, więc nie potrzebujesz ostatniej print, nie potrzebujesz nawiasu w środku lc$&.
Dada
1

C, 103 bajty

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;}

Wypróbuj online!

Steadybox
źródło
1

Python 3 , 125 , 124 bajtów

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()))

Wypróbuj online!

Christian Dean
źródło
1

Python 2, 106 105 bajtów

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

Edycja: zapisz jeden bajt za pomocą print ''.join=> print''.join.

Forma lambda, 99 bajtów

lambda s:''.join(map(lambda(c,u):[c.lower,c.upper][u](),zip(s.replace(' ',''),map(str.isupper,s))))
Chas Brown
źródło
1

SCALA, 128 znaków, 128 bajtów

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

Dzięki za to wyzwanie. Wypróbuj online!

V. Courtois
źródło
1

q / kdb +, 49 bajtów

Rozwiązanie:

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

Przykłady:

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"

Wyjaśnienie:

Znajdź indeksy, w których dane wejściowe są pisane wielkimi literami, a następnie zastosuj funkcję upperdo tych indeksów w zapisanej małymi literami wersji łańcucha wejściowego bez spacji. Zauważ, że nie możemy zastosować funkcji poza długością łańcucha, więc użyj take ( #), aby skrócić łańcuch wejściowy do długości małej, pozbawionej spacji wersji.

{@[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

Premia:

Po przeczytaniu odpowiedzi pomyślałem, że wypróbuję rozwiązanie, w którym powtarzam dane wejściowe, do tej pory udało mi się rozwiązać tylko 53 bajty:

{a{$[y in .Q.A;upper x;x]}'#:[a:lower x except" "]#x}
streetster
źródło
1

Swift 3.0, 199 bajtów

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())

Wypróbuj online!

A. Pooja
źródło
1

Perl 5 , 40 bajtów

37 bajtów kodu + -Fflaga. (zwróć uwagę, że w starszych wersjach Perla może być konieczne dodanie -anflag)

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

Wypróbuj online!

Objaśnienia:
Dzięki -F, @Fzawiera listę wszystkich znaków wejściowych.
for/\S/giteruje każdy znak spacji na wejściu. Używamy $iliczyć na której iteracji jesteśmy. Jeśli $F[$i++]jest wielką literą ( ) /[A-Z]/, wówczas drukujemy wielką literę bieżącego znaku ( uc), w przeciwnym razie drukujemy ją małymi literami ( lc). Zauważ, że uci lczwróć argument bez zmian, jeśli nie jest to litera.


Poprzednia wersja (mniej golfowa: 47 bajtów):

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

Wypróbuj online!

Dada
źródło