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.


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.

17

Python, 56 54 byte

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

Uji di Ideone .


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.


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}

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.


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

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

Haha, itu sangat cepat: D
— nicael


5

Haskell, 73 byte

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

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


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.


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

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'

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

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

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'

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.


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

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!


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

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

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

3

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

s/[a-z]/$&.$&^$"/ige

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.

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



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^' ':'';


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"
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.