Duplikat i obudowa przełącznika

34

Celem jest, po przyjęciu ciągu jako danych wejściowych, powielenie każdej litery łacińskiej i „przełączanie” jej wielkości (tzn. Wielkie litery stają się małymi literami i odwrotnie).

Przykładowe wejścia i wyjścia:

Input      Output
bad        bBaAdD
Nice       NniIcCeE
T e S t    Tt eE Ss tT
s E t      sS Ee tT
1!1!1st!   1!1!1sStT!
n00b       nN00bB     
(e.g.)     (eE.gG.)
H3l|@!     Hh3lL|@!

Dane wejściowe składają się z drukowanych symboli ASCII.

Nie powielaj niełacińskich liter, cyfr, znaków specjalnych.

Nicość
źródło
17
To bardzo miłe, proste, ale nie trywialne wyzwanie.
Mego

Odpowiedzi:

10

Galaretka, 5 bajtów

żŒsQ€

Wypróbuj online!

Jak to działa

żŒsQ€  Main link. Argument: s (string)

 Œs    Yield s with swapped case.
ż      Zip s with the result.
   Q€  Unique each; deduplicate each pair of characters.
Dennis
źródło
17

Python, 56 54 bajtów

lambda s:''.join(c+c.swapcase()*c.isalpha()for c in s)

Przetestuj na Ideone .

Dennis
źródło
Dang! Na zewnątrz grałem o 4 bajty ...
R. Kap
Jak to utrzymuje znaki nieliterowe? Myślałem, że pojawią się jako puste łańcuchy.
atlasolog
@atlasologist Jak widać na Ideone, nie robią tego. *ma wyższy priorytet niż +, więc wpływa tylko na czmienioną wielkość liter.
Dennis
Och, dobra, nie myślałem o tym w ten sposób. Miły.
atlasolog
16

JavaScript ES6, 70 68 66 64 bajtów

Zaoszczędź 2 bajty dzięki @Kevin Lau - nie Kenny

Zaoszczędzono 2 bajty dzięki @ Cᴏɴᴏʀ O'Bʀɪᴇɴ

s=>s.replace(/[A-Z]/gi,l=>l+l[`to${l<"a"?"Low":"Upp"}erCase`]())

Wyjaśnienie

To używa naprawdę hacky:

l[`to${l<"a"?"Low":"Upp"}erCase`]()

który nie jest golfistą to:

l[`to${
   l < "a" ?
   "Low" : 
   "Upp"
}erCase`]()

Zasadniczo l < "a"sprawdza, czy punkt kodowy litery jest mniejszy niż punkt kodowy a(dlatego jest wielką literą). Jeśli tak, zrobi to, to + Low + erCaseco się stało l['toLowerCase']()i sprawi, że postać będzie pisana małymi literami. `cudzysłowy umożliwiają formatowanie ciągów, więc zasadniczo możesz pomyśleć o:

`to${l < "a" ?"Low" : "Upp"}erCase`

as: "to" + (l<"a" ? "Low" : "Upp") + "erCase"która generuje funkcję do wywołania (ustaw ciąg na wielkie lub małe litery). Umieszczamy to w nawiasach kwadratowych, [ ... ]co pozwala nam uzyskać dostęp do właściwości, biorąc pod uwagę jej nazwę jako ciąg. Zwraca odpowiednią funkcję, a następnie po prostu ją wywołujemy.

Downgoat
źródło
3
/[A-Z]/gijest krótszym wyrażeniem regularnym: 3
Wartość tuszu
@ KevinLau-notKenny oh nice catch, dzięki!
Downgoat
1
to${l<"a"?"Lower":"Upper"}Casedoto${l<"a"?"Low":"Upp"}erCase
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ oh nice, dzięki!
Downgoat
4
l[`to${l<"a"?"Low":"Upp"}erCase`]()Myślę, że mamy nową definicję zła.
gcampbell
10

Rubinowy, 37 33 (30 + -pflaga) bajtów

swapcasena pomoc! Raczej. -4 bajty od @ Lynn.

gsub(/[a-z]/i){$&+$&.swapcase}
Wartość tuszu
źródło
gsub(/[a-z]/i){$&+$&.swapcase}plus pflaga ma 31 bajtów.
Lynn,
1
@ Lynn Uważam, że potrzebna była różnica w edytowaniu od domyślnego skryptu, więc pflaga ma (space)-p3 bajty.
Wartość tuszu
8

C, 63 60 bajtów

f(char*s){for(;*s;s++)isalpha(putchar(*s))&&putchar(32^*s);}

Wykorzystuje fakt, że 'a' XOR 32 == 'A'itp.

Trzy bajty zapisane dzięki FryAmTheEggman.

Lynn
źródło
możesz przesunąć s++ostatni putchar( &&putchar(32^*s++)), aby zapisać jeden bajt
Giacomo Garabello,
Myślę, że można zastąpić &&z *, nie można?
aloisdg mówi Przywróć Monikę
1
Jestem pewien, że oba nie działają, jeśli pomyślę o tym &&, jak działa zachowanie zwarciowe.
Lynn
f(char*s){isalpha(putchar(*s))&&putchar(32^*s);*s&&f(1+s);}rekurencyjny?
l4m2
1
f(char*s){*s&&f(1+s,isalpha(putchar(*s))&&putchar(32^*s));}rekurencyjny?
l4m2
6

CJam, 11 bajtów

l_el_eu.+.|

Sprawdź to tutaj.

Wyjaśnienie

l      e# Read input.
_el    e# Duplicate, convert to lower case.
_eu    e# Duplicate, convert to upper case.
.+     e# Concatenate the two characters in matching positions from those two
       e# strings. E.g. "ab!" "AB!" would give ["aA" "bB" "!!"].
       e# For each character from the original string and the corresponding 
.|     e# string from this list, take the set union (which eliminates duplicates
       e# and keeps the order the values appear in from left to right, so that
       e# the original case of each letter comes first).
Martin Ender
źródło
5

Pyth , 7 bajtów

sm{+dr2

Zestaw testowy .

sm{+dr2    input: Q
sm{+dr2dQ  implicit arguments

        Q  input
 m         for each character as d:
     r2d       swapcase
   +d          prepend d
  {            deduplicate
s          join as string
Leaky Nun
źródło
Haha, to jest naprawdę szybkie: D
nicael
5

Python 3.5, 60 56 bajtów:

for i in input():print(end=i+i.swapcase()[:i.isalpha()])

Pełny program. Spróbuje więcej golfa.

Wypróbuj online! (Ideone)

R. Kap
źródło
5

Haskell, 73 bajty

l=['a'..'z']
u=['A'..]
(>>= \c->c:maybe""pure(lookup c$zip l u++zip u l))
Lynn
źródło
5

Cheddar , 118 104 bajtów

(s)->s.chars.map((i)->{if String.letters has i.lower{if i<"a"{i+i.lower}else{i+i.upper}}else{i}}).join()

Pierwsza prawdziwa odpowiedź na Cheddar !!! Jest to o wiele mniej klimatyczne niż myślałem, że byłoby ...; _;

Działa z wersją 1.0.0-beta.9 , niekonkurującą.


Jak widać, nie zaprojektowałem cheddaru do gry w golfa: /

Nie golfowany:

(str) -> str.chars.map(
    (i) -> {
        if String.letters has i {
            if i < "a" { // Check char code, meaning it's upper case if true
                i+i.lower
            }
            else {
                i+i.upper
            }
        } else {
            i
        }
    }
).join()

Stosowanie:

var doThing = <code here>;
doThing("input...");

Aktualizacja: 14.07.2016 Skończyłem trójskładniki, dzięki czemu sprowadziłem to do 84 bajtów

Cheddar, 84 bajtów

(s)->s.chars.map((i)->String.letters has i.lower?i<"a"?i+i.lower:i+i.upper:i).join()

działa od wersji v1.0.0-beta.14

Downgoat
źródło
4
Tak! Długo czekaliśmy na ten moment!
DJMcMayhem
Przy jednej lub dwóch zmianach nazw metod obowiązuje również Sidef
cat
@cat o_o podobieństwo jest niepokojące
Downgoat
Cóż, oba są pod wpływem Perla, Perla 6, Ruby, Pythona itp., Więc nie jest to takie zaskakujące: P
cat
1
@cat oh nie nie nie nie nie, na cheddar python nie miał wpływu
Downgoat
4

Retina, 28 27 21 bajtów

To są tabulatory, a nie spacje.

.
$&  $&
T`lL    p`Ll_`  .

Wypróbuj online

Dziękuję wszystkim za sugestie.

mbomb007
źródło
Miejsca są zjadane przez SE.
Conor O'Brien
[A-Za-z]->i`[A-Z]
Downgoat
Martin i ja rozmawialiśmy na czacie i wymyśliliśmy
FryAmTheEggman
@FryAmTheEggman Ach, zapomniałem o _. Zamierzam jednak użyć kart, aby przetestować wszystkie przypadki testowe jednocześnie.
mbomb007
1
Ale zestaw testowy nie musi być golfowany: P Samo zostawienie notatki „pierwsza linia sprawia, że ​​działa ona osobno na każdej linii” jest zwykle wystarczające. Tutaj zaoszczędziłbyś szaleństwa znaków tabulacji.
FryAmTheEggman
4

C, 87 80

Przekaż ciąg jako dane wejściowe, f()a dane wyjściowe zostaną zapisane w STDOUT. Ciąg nie jest modyfikowany.

f(char*v){for(;*v;++v)putchar(*v),isalpha(*v)?putchar(*v-32+64*!islower(*v)):0;}
owacoder
źródło
Czy możesz podać sposób wypróbowania online?
aloisdg mówi Przywróć Monikę
@aloisdg Wypróbuj ideone.com
cat
4

sed, 30 bajtów

Kod 29 bajtów + parametr 1-bajtowy -r

s/([a-z])|([A-Z])/&\u\1\l\2/g

Stosowanie:

echo -e 'bad\nNice\nT e S t\ns E t\n1!1!1st!\nn00b\n(e.g.)\nH3l|@!' |\
sed -r 's/([a-z])|([A-Z])/&\u\1\l\2/g'
Marco
źródło
4

J, 31 29 bajtów

[:;]<@~."1@,.tolower,.toupper

Wyjaśnienie

[:;]<@~."1@,.tolower,.toupper  Input: s
                      toupper  Convert s to all uppercase
             tolower           Convert s to all lowercase
                    ,.         Join them as columns in a 2d array
   ]                           Identity function, get s
           ,.                  Prepend s as a column to the 2d array
      ~."1@                    Take the unique chars on each row
    <@                         Box them
[:;                            Unbox the list of boxes and join their contents and return
mile
źródło
4

Haskell, 121, 101, 85, 82

import Data.Char
g n|isLower n=toUpper n|1<2=toLower n
(>>= \x->x:[g x|isAlpha x])
Zylviij
źródło
3
Zastępując if-then-else strażnikami, możesz zaoszczędzić około 15 bajtów. I isLowerjest krótszy niż konstrukcja z elem, dla 5 bajtów więcej.
arjanen
1
>>=jest concatMap(lub concat.map) z argumentami przerzucony: f n = n >>= (\x->if isAlpha x then[x,r x]else[x]). Możesz przejść bez celu i pominąć nazwę funkcji i zastąpić definicję fz (>>= \x->if isAlpha x then[x,r x]else[x]).
nimi
1
Zamiast tego otherwisemożesz użyć dowolnego wyrażenia, które ocenia True, np 1<2. Można wymienić if .. then .. elselistę zrozumieniem: \x->[x]++[g x|isAlpha x]. Aha, i jest błąd: drugie toUpperwejście gmusi być toLower.
nimi
1
Och, jeszcze jedno: [x]++jest x:.
nimi
4

Perl, 36 bajtów (35 + -nflaga)

s/[a-z]/$&.(ord$&<97?lc$&:uc$&)/ige

( -ppotrzebny tag)

(-2 bajty dzięki @Dom Hasting)

Krótkie wyjaśnienie:
ordzwraca wartość liczbową znaku. ord(any lower case) >= 97I ord(any upper case) <= 90).

Biegnij z :

perl -pe 's/[a-z]/$&.(ord$&<97?lc$&:uc$&)/ige'
Dada
źródło
Nadal musisz użyć /ilub wyrażenie regularne dopasuje kilka współrzędnych kodowych między literami.
Oleg V. Volkov
@ OlegV.Volkov o tak, dzięki, odpowiedź zredagowana.
Dada,
Znalazłem jeszcze jeden bajt, używając swojej metody: Wypróbuj online!
Xcali,
4

Rubinowy, 31 + 1 = 32 30 + 1 = 31 bajtów

Uruchom -pflagę

gsub(/(?<=(.))/){$1.swapcase!}

Wykorzystuje fakt, że swapcase!zwróci nildowolną literę ASCII, która po zwrocie z gsubbloku przekłada się na pusty ciąg znaków . @Jordan uratował bajt, chwytając poprzednią postać z tyłu.

histocrat
źródło
Dopasowywanie, //a następnie używanie $`[-1]jest sprytne.
Jordan,
1
Udało mi się ogolił sześć bajtów z lookbehind: gsub(/(?<=(.))/){$1.swapcase!}. Jednak ta sama podstawowa koncepcja, więc skorzystaj z niej.
Jordan,
Fajne! Dla mnie wygląda to o jeden bajt krócej.
histocrat
Er, tak, jeden bajt. Myślę, że miałem tam dodatkowy kod do przetestowania, który przypadkowo policzyłem.
Jordan,
Nie ma potrzeby korzystania z samomodyfikującej się wersji .swapcase!. (Mam na myśli, usuń !.)
manatwork
4

R, 191 187 168 156 98 99 bajtów

99 bajtów dzięki ulepszeniom Giuseppe i MickyT .

paste0(x<-unlist(strsplit(readline(),"")),gsub("[^A-Za-z]","",chartr("a-zA-Z","A-Za-z",x)),collapse="")
rturnbull
źródło
98 bajtów - może kiedyś w przyszłym roku znajdziemy tego golfa, hahaha.
Giuseppe
1
Nienawidzę być nosicielem złych nowości, ale nie udaje się to w przypadkach testowych ze spacjami. readline()można użyć, ale będzie to kosztować bajt
MickyT,
@MickyT dzięki, naprawione teraz.
rturnbull
@MickyT scanbędzie działać z danymi wejściowymi zawartymi w cudzysłów (jak to często bywa w przypadku argumentów wiersza poleceń w innych językach)
Giuseppe,
@Giuseppe Przepraszamy, nie zdawałem sobie z tego sprawy. Pomyślałem, że automatycznie dzieli się na białe znaki, chyba że podasz znak inny niż biały. Przepraszamy rturnbull
MickyT,
3

05AB1E , 7 bajtów

Kod:

vyyš«Ù?

Wyjaśnienie:

v       # For each in input.
 yyš    # Push y and y swapcased.
    «Ù  # Concatentate and uniquify.
      ? # Print without a newline.

Wykorzystuje kodowanie CP-1252 . Wypróbuj online!

Adnan
źródło
Może mógłbyś podać link do tłumacza?
nicael
2
@nicael Jest połączony ... Jest tam na github.
mbomb007
Więc nie ma tłumacza online? :(
nicael
@nicael Następnie pobierz i uruchom. Nie musi istnieć tłumacz online , tylko tłumacz.
mbomb007
1
@nicael Tak, jeszcze nie ma dostępnego tłumacza online :(. Wersja offline powinna jednak działać.
Adnan
3

Właściwie 8 bajtów

`;Öo╔`MΣ

Wypróbuj online!

Wyjaśnienie:

`;Öo╔`MΣ
`;Öo╔`M   for each character in input:
 ;          duplicate the character
  Ö         swap case
   o        append to original character
    ╔       remove duplicated characters
       Σ  concatenate
Mego
źródło
3

MATL, 11 9 bajtów

tYov"@uv!

Wypróbuj online

Wyjaśnienie

        % Implicitly grab input as string
t       % Duplicate the input
Yo      % Swap case of all characters
v       % Vertically concatenate the original and swap-cased versions
"       % For each column (letter in the original)
  @u    % Compute the unique values (without sorting)
  v!    % Vertically concatenate with the existing output and transpose
        % Implicit end of for loop and implicit display
Suever
źródło
3

Perl, 28 22 21 bajtów (20 + -pflaga)

s/[a-z]/$&.$&^$"/ige
Oleg V. Volkov
źródło
Wyobrażam sobie, że możesz zapisać bajt, używając $"zamiast ' ', ale nie testowałem.
msh210
@ msh210, miło! Jak mogłem zapomnieć sprawdzić Perlvar pod kątem domyślnych ciągów? Dzięki!
Oleg V. Volkov
3

Stax , 7 6 bajtów

Dzięki @recursive za bajt zapisany!

┤§ÆP♦■

Uruchom i debuguj na staxlang.xyz! (link jest do rozpakowanej wersji)

Rozpakowane (7 bajtów):

c:~\{um

Wyjaśnienie:

c:~\{um
c          Copy the top element of the stack (the input, in this case).
 :~        Switch case of each letter in the copy.
   \       Zip. This produces an array of two-character strings.
    { m    Map a block over this array of two-character strings.
     u       Get all unique elements.
           Implicit concatenate and print.
Khuldraeseth na'Barya
źródło
Dzięki za wypróbowanie stax. Jednym z łatwych ulepszeń, które możesz wprowadzić, jest użycie uzamiast :g. Otrzyma wszystkie unikalne elementy w tablicy, co jest dokładnie tym, czego chcesz w tym przypadku. Poza tym wygląda to dobrze w golfa.
rekurencyjny
@recursive Thanks! Zapomniałem o tym: / Wkrótce dokonam edycji.
Khuldraeseth na'Barya
Nie działa dla 123. Konieczna może być zmiana formatu wszystkich danych wejściowych (tj. Ich zacytowanie). Link również jest zepsuty. Trzeba wymienić m=11z m=2. Na stronie staxlang.xyz znajduje się przycisk generowania postu PPCG, więc możesz z niego skorzystać.
Weijun Zhou,
@WeijunZhou Dzięki, naprawiono!
Khuldraeseth na'Barya
2

Python, 59 bajtów

lambda s:''.join((x,x+x.swapcase())[x.isalpha()]for x in s)

Edytowane, aby naprawić powtarzające się znaki niealfabetyczne

atlasolog
źródło
2

Julia, 40 bajtów

!s=[print(c,isalpha(c)?c$' ':"")for c=s]

Wypróbuj online!

Dennis
źródło
not s is (list comprehension)ok, Julia ...
kot
2

PHP 4.1, 57 bajtów

Ten kod zakłada dostęp przez serwer WWW (na przykład Apache) przy użyciu domyślnej konfiguracji.

Można przekazać ciąg wysyłając kluczyk Sza pomocą jakichkolwiek środków ( POST, GET, COOKIE, SESSION...).

<?for($i=0;$c=$S[$i++];)echo$c,ctype_alpha($c)?$c^' ':'';
Ismael Miguel
źródło
2

C #, 82 71 bajtów

s=>string.Concat(s.Select(c=>c+(char.IsLetter(c)?(char)(c^32)+"":"")));

C # lambda, gdzie znajdują się dane wejściowe i wyjściowe string. Wypróbuj online .

11 bajtów dzięki sztuczce @Lynn.

aloisdg mówi Przywróć Monikę
źródło
2

Common Lisp (Lispworks), 262 bajtów

(defun f(s)(let((b""))(dotimes(i(length s))(if(lower-case-p(elt s i))(progn #1=(setf b(concatenate 'string b(string #2=(elt s i))))(setf b(concatenate 'string b(string(char-upcase #2#)))))(progn #1#(setf b(concatenate 'string b(string(char-downcase #2#)))))))b))

bez golfa:

(defun f (s)
  (let ((b ""))
    (dotimes (i (length s))
      (if (lower-case-p (elt s i))
          (progn
           #1=(setf b (concatenate 'string b (string #2=(elt s i))))
           (setf b (concatenate 'string b (string (char-upcase #2#)))))
        (progn
          #1#
          (setf b (concatenate 'string b (string (char-downcase #2#)))))))
    b))

Stosowanie:

CL-USER 1 > (f "abc")
"aAbBcC"

CL-USER 2 > (f "bad")
"bBaAdD"
sadfaf
źródło