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.