Gandakan & sakelar kasing

34

Tujuannya adalah, setelah mengambil string sebagai input, menduplikasi setiap huruf latin dan "beralih" kasusnya (yaitu huruf besar menjadi huruf kecil dan sebaliknya).

Contoh input & output:

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|@!

Input terdiri dari simbol ASCII yang dapat dicetak.

Anda tidak boleh menduplikasi huruf, angka, karakter non-latin.

nicael
sumber
17
Ini adalah tantangan yang sangat bagus, sederhana namun tidak sepele.
Mego

Jawaban:

10

Jelly, 5 byte

żŒsQ€

Cobalah online!

Bagaimana itu bekerja

żŒ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
sumber
17

Python, 56 54 byte

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

Uji di Ideone .

Dennis
sumber
Dang! Keluar main golf saya dengan 4 byte ...
R. Kap
Bagaimana cara mempertahankan karakter non-huruf? Saya pikir mereka akan muncul sebagai string kosong.
atlasologist
@atlasologist Seperti yang Anda lihat di Ideone, mereka tidak. *memiliki prioritas lebih tinggi daripada +, sehingga hanya mempengaruhi ckasus bertukar.
Dennis
Ohh, oke, saya tidak memikirkannya seperti itu. Bagus.
atlasologist
16

JavaScript ES6, 70 68 66 64 byte

Disimpan 2 byte berkat @Kevin Lau - bukan Kenny

Disimpan 2 byte berkat @ Cᴏɴᴏʀ O'Bʀɪᴇɴ

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

Penjelasan

Ini menggunakan benar-benar hacky:

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

yang ungolfed adalah:

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

Pada dasarnya l < "a"memeriksa apakah titik kode huruf kurang dari titik kode a(oleh karena itu menjadi huruf besar). Jika itu akan dilakukan to + Low + erCaseyang menjadi l['toLowerCase']()dan membuat karakter huruf kecil. `kutipan memungkinkan pemformatan string sehingga pada dasarnya Anda dapat memikirkan:

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

sebagai: "to" + (l<"a" ? "Low" : "Upp") + "erCase"yang menghasilkan fungsi untuk memanggil (membuat string huruf besar atau kecil). Kami menempatkan ini dalam tanda kurung siku [ ... ]yang memungkinkan kami mengakses properti yang diberi namanya sebagai string. Ini mengembalikan fungsi yang sesuai dan kemudian kita sebut saja.

Downgoat
sumber
3
/[A-Z]/giadalah regex yang lebih pendek: 3
Nilai Tinta
@ KevinLau-notKenny oh tangkapan bagus, terima kasih!
Turun
1
to${l<"a"?"Lower":"Upper"}Caseketo${l<"a"?"Low":"Upp"}erCase
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ oh bagus, terima kasih!
Downgoat
4
l[`to${l<"a"?"Low":"Upp"}erCase`]()Saya pikir kita memiliki definisi baru tentang kejahatan.
gcampbell
10

Ruby, 37 33 (30 + -pbendera) byte

swapcaseuntuk menyelamatkan! Semacam. -4 byte dari @Lynn.

gsub(/[a-z]/i){$&+$&.swapcase}
Nilai Tinta
sumber
gsub(/[a-z]/i){$&+$&.swapcase}ditambah pbendera adalah 31 byte.
Lynn
1
@ Lynn Saya percaya konsensus adalah mengedit perbedaan yang diperlukan dari skrip default, jadi pbenderanya (space)-palias 3 byte.
Nilai Tinta
8

C, 63 60 byte

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

Menggunakan fakta bahwa 'a' XOR 32 == 'A', dll.

Tiga byte disimpan berkat FryAmTheEggman.

Lynn
sumber
Anda dapat memindahkan yang s++terakhir putchar( &&putchar(32^*s++)) untuk menyimpan satu byte
Giacomo Garabello
Saya pikir Anda bisa mengganti &&dengan *, bukan?
Aloisdg mengatakan Reinstate Monica
1
Saya cukup yakin keduanya tidak bekerja, jika saya berpikir tentang bagaimana &&perilaku hubungan arus pendek bekerja.
Lynn
f(char*s){isalpha(putchar(*s))&&putchar(32^*s);*s&&f(1+s);}rekursif?
l4m2
1
f(char*s){*s&&f(1+s,isalpha(putchar(*s))&&putchar(32^*s));}rekursif?
l4m2
6

CJam, 11 byte

l_el_eu.+.|

Uji di sini.

Penjelasan

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
sumber
5

Pyth , 7 byte

sm{+dr2

Suite uji .

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
Biarawati Bocor
sumber
Haha, itu sangat cepat: D
nicael
5

Python 3.5, 60 56 byte:

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

Program lengkap. Akan mencoba bermain golf lebih banyak.

Cobalah secara Online! (Ideone)

R. Kap
sumber
5

Haskell, 73 byte

l=['a'..'z']
u=['A'..]
(>>= \c->c:maybe""pure(lookup c$zip l u++zip u l))
Lynn
sumber
5

Cheddar , 118 104 byte

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

Jawaban Cheddar asli pertama !!! Ini jauh lebih klimaks daripada yang saya kira ...; _;

Bekerja dengan rilis 1.0.0-beta.9 , non-bersaing.


Seperti yang Anda tahu saya tidak merancang cheddar menjadi golf: /

Tidak Disatukan:

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

Pemakaian:

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

Memperbarui: 7/14/16 Saya telah menyelesaikan berbagai proses pembuatan hingga 84 byte

Cheddar, 84 byte

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

bekerja pada versi v1.0.0-beta.14

Downgoat
sumber
4
Yay! Kami sudah lama menunggu saat ini!
DJMcMayhem
Dengan satu atau dua perubahan nama metode, Sidef
cat
@cat o_o kesamaannya mengganggu
Downgoat
Yah, mereka berdua dipengaruhi oleh Perl, Perl 6, Ruby, Python, dll, jadi tidak mengejutkan: P
cat
1
@cat oh tidak, tidak, tidak, tidak, cheddar tidak dipengaruhi oleh python
Downgoat
4

Retina, 28 27 21 byte

Itu adalah tab, bukan spasi.

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

Cobalah online

Terima kasih atas saran semua orang.

mbomb007
sumber
Ruang dimakan oleh SE.
Conor O'Brien
[A-Za-z]->i`[A-Z]
Downgoat
Martin dan saya berbicara dalam obrolan, dan kami datang dengan: retina.tryitonline.net/...
FryAmTheEggman
@FryAmTheEggman Ah, saya lupa _. Saya akan menggunakan tab agar saya dapat menguji semua kasus uji sekaligus.
mbomb007
1
Tetapi test suite tidak harus golf: P Hanya meninggalkan catatan yang mengatakan "baris pertama membuatnya berjalan secara terpisah pada setiap baris" biasanya cukup baik. Di sini, ini akan menghemat kegilaan karakter tab.
FryAmTheEggman
4

C, 87 80

Pass string sebagai input f()dan output ditulis ke STDOUT. String tidak dimodifikasi.

f(char*v){for(;*v;++v)putchar(*v),isalpha(*v)?putchar(*v-32+64*!islower(*v)):0;}
owacoder
sumber
Bisakah Anda memberikan cara untuk mencobanya secara online?
aloisdg mengatakan Reinstate Monica
@aloisdg Coba ideone.com
kucing
4

sed, 30 byte

Kode 29 byte + parameter 1 byte -r

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

Pemakaian:

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
sumber
4

J, 31 29 byte

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

Penjelasan

[:;]<@~."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
mil
sumber
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
sumber
3
Dengan mengganti if-then-else oleh penjaga, Anda dapat menyimpan 15 byte atau lebih. Dan isLowerlebih pendek dari konstruk dengan elem, selama 5 byte lebih.
arjanen
1
>>=adalah concatMap(atau concat.map) dengan argumen membalik: f n = n >>= (\x->if isAlpha x then[x,r x]else[x]). Anda bisa pergi pointfree dan menghilangkan nama fungsi dan mengganti definisi fdengan (>>= \x->if isAlpha x then[x,r x]else[x]).
nimi
1
Alih-alih otherwiseAnda dapat menggunakan ekspresi apa pun yang mengevaluasi True, misalnya 1<2. Anda dapat mengganti if .. then .. elsedengan daftar pemahaman: \x->[x]++[g x|isAlpha x]. Oh, dan ada bug: kedua toUpperdi gharus menjadi toLower.
nimi
1
Oh, satu lagi: [x]++adalah x:.
nimi
4

Perl, 36 byte (35 + -nbendera)

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

( -ptag dibutuhkan)

(-2 byte terima kasih kepada @Dom Hasting)

Penjelasan singkat:
ordmengembalikan nilai numerik char. ord(any lower case) >= 97, dan ord(any upper case) <= 90).

Jalankan dengan:

perl -pe 's/[a-z]/$&.(ord$&<97?lc$&:uc$&)/ige'
Dada
sumber
Anda masih perlu menggunakan /iatau regexp Anda akan cocok dengan beberapa codepoint antara huruf.
Oleg V. Volkov
@ OlegV.Volkov oh benar, terima kasih, jawabannya diedit.
Dada
Dapatkan satu byte lagi, menggunakan metode Anda: Cobalah online!
Xcali
4

Ruby, 31 + 1 = 32 30 + 1 = 31 byte

Dengan -pbendera, jalankan

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

Mengambil keuntungan dari fakta yang swapcase!akan mengembalikan nilapa pun kecuali surat ASCII, yang diterjemahkan menjadi string kosong ketika dikembalikan keluar dari gsubblok. @Jordan menyimpan byte dengan menangkap karakter sebelumnya dengan melihat ke belakang.

histokrat
sumber
Cocok dengan //dan kemudian menggunakan $`[-1]itu pintar.
Jordan
1
Saya berhasil mencukur habis enam byte dengan lookbehind: gsub(/(?<=(.))/){$1.swapcase!}. Konsep dasar yang sama, jadi jangan ragu untuk menggunakannya.
Jordan
Keren! Itu terlihat satu byte lebih pendek untuk saya.
histokrat
Eh, ya, satu byte. Saya pikir saya punya beberapa kode tambahan di sana untuk menguji bahwa saya tidak sengaja menghitung.
Jordan
Tidak perlu menggunakan versi modifikasi diri .swapcase!. (Maksudku, lepaskan !.)
manatwork
4

R, 191 187 168 156 98 99 byte

99 byte karena peningkatan dari Giuseppe dan MickyT .

paste0(x<-unlist(strsplit(readline(),"")),gsub("[^A-Za-z]","",chartr("a-zA-Z","A-Za-z",x)),collapse="")
rturnbull
sumber
98 byte - mungkin sekitar tahun depan, kita dapat menemukan golf lain ini, hahaha.
Giuseppe
1
Aku benci menjadi pembawa hal baru yang buruk, tetapi gagal pada kasus uji dengan spasi. readline()dapat digunakan, tetapi akan dikenakan biaya satu byte
MickyT
@MickyT terima kasih, perbaiki sekarang.
rturnbull
@MickyT scanakan bekerja dengan input yang diberikan terbungkus dalam tanda kutip (seperti yang sering terjadi untuk argumen baris perintah dalam bahasa lain)
Giuseppe
@ Giuseppe Maaf saya tidak menyadarinya. Saya hanya berpikir itu secara otomatis terpecah pada spasi putih kecuali jika Anda menentukan karakter non spasi putih. Maaf rturnbull
MickyT
3

05AB1E , 7 byte

Kode:

vyyš«Ù?

Penjelasan:

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

Menggunakan pengkodean CP-1252 . Cobalah online!

Adnan
sumber
Mungkin Anda bisa memberikan tautan ke penerjemah?
nicael
2
@nicael TERKAIT ... Ada di sana di github.
mbomb007
Jadi tidak ada penerjemah online? :(
nicael
@nicael Kemudian unduh, dan jalankan. Tidak harus ada juru bahasa online , hanya seorang juru bahasa.
mbomb007
1
@nicael Ya, belum ada juru bahasa online yang tersedia :(. Versi offline harusnya bekerja.
Adnan
3

Pyke, 8 6 byte

FDl4+}

Coba di sini!

Biru
sumber
3

Sebenarnya, 8 byte

`;Öo╔`MΣ

Cobalah online!

Penjelasan:

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

MATL, 11 9 byte

tYov"@uv!

Cobalah secara Online

Penjelasan

        % 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
sumber
3

Perl, 28 22 21 byte (20 + -pbendera)

s/[a-z]/$&.$&^$"/ige
Oleg V. Volkov
sumber
Saya membayangkan Anda dapat menyimpan byte dengan menggunakan $"alih-alih ' ', tapi saya belum menguji.
msh210
@ msh210, bagus! Bagaimana saya bisa lupa untuk memeriksa perlvar untuk string default? Terima kasih!
Oleg V. Volkov
3

Stax , 7 6 byte

Berkat @recursive untuk satu byte yang disimpan!

┤§ÆP♦■

Jalankan dan debug di staxlang.xyz! (tautan ke versi yang sudah dibongkar)

Dibongkar (7 byte):

c:~\{um

Penjelasan:

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
sumber
Terima kasih telah mencoba stax. Salah satu peningkatan mudah yang dapat Anda lakukan adalah menggunakan ualih-alih :g. Ini akan mendapatkan semua elemen unik dalam sebuah array, yang persis seperti yang Anda inginkan dalam kasus ini. Selain itu, ini terlihat golf dengan baik.
rekursif
@recursive Terima kasih! Lupa yang itu: / Akan segera diedit.
Khuldraeseth na'Barya
Tidak berhasil 123. Anda mungkin perlu mengubah format untuk semua input (yaitu mengutipnya). Tautannya juga rusak. Anda harus mengganti m=11dengan m=2. Ada tombol penghasil pos PPCG di staxlang.xyz sehingga Anda mungkin ingin menggunakannya.
Weijun Zhou
@ WeijunZhou Terima kasih, sudah diperbaiki!
Khuldraeseth na'Barya
2

Python, 59 byte

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

Diedit untuk memperbaiki karakter non-alfabet berulang

ahli atlasologi
sumber
2

Julia, 40 byte

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

Cobalah online!

Dennis
sumber
not s is (list comprehension)oke, Julia ...
kucing
2

PHP 4.1, 57 byte

Kode ini mengasumsikan akses melalui server web (Apache, misalnya), menggunakan konfigurasi default.

Anda dapat melewati string dengan mengirimkan kunci Sdengan cara apapun ( POST, GET, COOKIE, SESSION...).

<?for($i=0;$c=$S[$i++];)echo$c,ctype_alpha($c)?$c^' ':'';
Ismael Miguel
sumber
2

C #, 82 71 byte

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

C # lambda di mana input dan output berada string . Cobalah online .

11 byte berkat trik @ Lynn.

aloisdg kata Reinstate Monica
sumber
2

Gangguan Umum (Lispworks), 262 byte

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

ungolfed:

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

Pemakaian:

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

CL-USER 2 > (f "bad")
"bBaAdD"
sadfaf
sumber