Kapitalisasi nilai tukar

35

Diberikan dua string surat, transfer pola kapitalisasi setiap string ke yang lain. Bytes paling sedikit menang.

Input:   CodeGolf xxPPCGxx  
Output:  coDEGOlf XxppCgxx
  • Kedua string akan memiliki panjang yang sama dan kosong, dengan hanya huruf a..zdan A..Z.
  • Anda dapat menampilkan dua string yang dihasilkan dalam urutan mana pun relatif terhadap input.
  • Anda dapat mewakili sepasang string sebagai satu string dengan pemisah satu karakter non-huruf untuk input dan / atau output.
  • Anda dapat mewakili string sebagai daftar karakter atau string satu karakter, tetapi tidak sebagai urutan nilai titik kode kecuali ini hanya string dalam bahasa Anda.
  • Input dan output Anda mungkin mewakili string yang berbeda.

Kasus uji:

CodeGolf xxPPCGxx -> coDEGOlf XxppCgxx
lower UPPER -> LOWER upper
MiXeD lower -> mixed LoWeR
A A -> A A
ABcd EfGh -> AbCd EFgh
Tidak
sumber

Jawaban:

14

Java (JDK 10) , 66 byte

a->b->{for(int i=a.length,t;i-->0;b[i]^=t)a[i]^=t=(a[i]^b[i])&32;}

Cobalah online!

Penjelasan

a->b->{                           // Curried lambda
 for(int i=a.length,t;i-->0;      //  Descending loop on i,
                                  //  Declare t
     b[i]^=t                      //   Apply the case difference to b[i]
   )
  a[i]^=t=(a[i]^b[i])&32;         //   Assign the case difference of the two letters to t, and apply it to a[i].
}
Olivier Grégoire
sumber
9
Sama sekali tidak terkait dengan jawaban Anda ini, tetapi lebih mudah daripada membuat obrolan. ; p Apakah Anda melihat Java-10 TIO memiliki bug saat menggunakan array[i++%n]+=...;? array[t=i++%n]=array[t]+...;bekerja dengan baik; dan array[i%n]+=...;i++;berfungsi dengan baik juga, tetapi menggunakan i++atau ++idengan modulo dan +=untuk menambahkan ke baris dalam array tidak berfungsi .. Berikut Java 10 TIO sebagai contoh untuk melihat masalahnya. Apakah ini bug (atau fitur: S) di Java 10 JDK atau di compiler Java 10 TIO?
Kevin Cruijssen
1
@KevinCruijssen Saya melihat masalah ini, tapi sepertinya aneh. Saya melihat bahwa versi yang digunakan pada TIO adalah 10.0.0_46 (dari 20-03-2018). Versi terbaru adalah 10.0.1. Kita mungkin harus meminta TIO untuk memperbarui versi Java mereka.
Olivier Grégoire
3
@KevinCruijssen Dennis memperbarui versi menjadi 10.0.1 dan masalah ini masih terjadi (saya belum menginstal Java 10, jadi saya mengandalkan TIO, sama seperti Anda). Saya sudah bertanya tentang Stack Overflow karena saya tidak tahu apa yang terjadi di sini ... Sangat membingungkan!
Olivier Grégoire
5
@KevinCruijssen Tidak apa-apa, jawabannya tidak seperti ini menarik banyak upvotes: P Pokoknya ... Masalahnya adalah bahwa Anda benar-benar menemukan bug . Karena spek mengatakan itu harus bertindak seperti yang Anda pikirkan, terus tulis jawaban Anda seperti itu, dioptimalkan untuk Java 10 jika Anda memerlukannya. Dengan begitu, Anda memiliki jawaban Java 10 yang valid, tetapi tidak dapat diuji karena bug itu. Cukup tulis dan uji di Java 8, lalu buat Java 10 perubahan yang tepat seperti berubah Stringmenjadi var.
Olivier Grégoire
6
Saya pikir itu sangat rapi bahwa Anda menemukan bug di JDK 10. Kerja bagus:]
Poke
13

C (gcc) , 86 58 55 53 byte

c(a,s,e)char*a,*s;{for(;*s++^=e=(*s^*a)&32;)*a++^=e;}

Cobalah online!

Jonathan Frech
sumber
Manipulasi bit memberif(S,Z)char*S,*Z;{for(int d;d=(*Z^*S)&32,*Z++^=d;)*S++^=d;}
Kritixi Lithos
@Cowsquack Wow; Terima kasih banyak.
Jonathan Frech
@ OlivierGrégoire Terima kasih.
Jonathan Frech
8

Jelly , 9 byte

O&32^/^OỌ

Cobalah online!

Bagaimana itu bekerja

O&32^/^OỌ  Main link. Argument: [s, t] (pair of strings)

O          Ordinal; replace each character with its code point.
 &32       Perform bitwise AND with 32, yielding 32 for lowercase letters, 0 for
           uppercase ones.
    ^/     Reduce by XOR, yielding 32 for letter pairs with different 
           capitalizations, 0 for letter pair with matching capitalizations.
      ^O   XOR the result with each of the code points.
        Ọ  Unordinal; replace each code point with its character.
Dennis
sumber
1
... kami tahu itu akan terjadi: D
Jonathan Allan
7

APL (Dyalog Classic) , 13 12 byte

⊖⊖819⌶¨⍨∊∘⎕a

Cobalah online!

input dan output adalah matriks karakter 2 × N

⎕a adalah alfabet bahasa Inggris huruf besar 'ABC...Z'

∊∘⎕a mengembalikan matriks boolean yang menunjukkan huruf mana dalam input huruf besar

819⌶ mengonversi argumen kanan menjadi huruf besar atau kecil bergantung pada argumen kiri boolean ("819" adalah leetspeak untuk "BIG")

819⌶¨⍨apakah itu untuk setiap ¨karakter ( ), menukar ( ) argumen

berarti membalikkan secara vertikal; yang satu bertindak sebagai argumen kiri 819⌶dan yang lain adalah tindakan terakhir

ngn
sumber
1
"819" is leetspeak for "BIG"... Serius? Itulah penjelasan sebenarnya mengapa 819? 0_o
DLosc
@Docosc ya :) lihat obrolan
ngn
5

Pyth , 10 byte

rVV_mmrIk1

Coba di sini!

Penjelasan & Trik Pyth rapi digunakan

  • rVV_mmrIk1- Program lengkap. Input diambil dari STDIN sebagai daftar dua string, dan output ditulis ke STDOUT sebagai daftar dua daftar karakter.

  • mm - Untuk setiap karakter di setiap string:

    • Ik - Periksa apakah itu invarian di bawah ...
    • r...1- ... Mengubah ke huruf besar. Menghasilkan Benar untuk karakter huruf besar dan Salah untuk huruf kecil.
  • _ - Balikkan daftar itu.

  • VV - Dan double-vectorize fungsi berikut pada dua daftar:

    • r- Konversikan ke huruf besar jika nilainya True(alias 1), atau dikonversi ke huruf kecil

Kiriman ini menyalahgunakan fakta bahwa r0dan r1adalah fungsi huruf kecil dan huruf besar dalam Pyth, dan kami menggunakan nilai kebenaran (nilai yang diperoleh dengan memeriksa jika setiap karakter huruf besar, terbalik) menghasilkan Trueuntuk huruf besar dan Falseuntuk huruf kecil. Fakta bahwa boolean adalah subclass dari bilangan bulat di Python sangat berguna untuk pendekatan yang digunakan jawaban ini. Porting pendekatan Dennis dan Jonathan's Jelly menghasilkan lebih dari 18 byte, jadi saya cukup senang dengan trik khusus Pyth yang digunakan di sini.

Tuan Xcoder
sumber
4

MATL , 11 byte

kG91<P32*-c

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

k      % Implicit input: 2-row char matrix. Convert to lower-case
G      % Push input again 
91<    % Less than 91?, element-wise. Gives 1 for upper-case
P      % Flip vertically
32*    % Multiply by 32, element-wise
-      % Subtract, element-wise
c      % Convert to char. Implicit display
Luis Mendo
sumber
4

Haskell , 78 byte

import Data.Char
c x|isUpper x=toUpper|1<2=toLower
(!)=zipWith c
x#y=(y!x,x!y)

Cobalah online!

pengguna28667
sumber
4
isUpper xbisa x<'a'.
Lynn
3

J , 36 31 27 byte

-9 byte berkat FrownyFrog!

(XOR"$32*[:~:/97>])&.(3&u:)

Cobalah online!

Solusi sebelumnya adalah:

J , 36 31 byte

-5 byte terima kasih kepada FrownyFrog!

|:@(XOR 32*0~:/@|:97>])&.(3&u:)

Cobalah online!

Bagaimana itu bekerja:

                          (3&u:)  converts the strings to code points
   (                    )&.       then do the following and convert back to chars
                    97>]          check if they are uppercase letters 
             0~:/@|:              transpose and check if the two values are different
          32*                     multiply by 32 (32 if different, 0 otherwise)
      XOR                         xor the code point values with 32 or 0
 |:@                              and transpose
Galen Ivanov
sumber
The [:dapat 0 dan (22 b.)dapat XOR. &.(3&u:)menghemat 1 byte.
FrownyFrog
@FrownyFrog Golf yang sangat bagus, terima kasih! Kamu sangat bagus!
Galen Ivanov
27
FrownyFrog
@FrownyFrog Wow! Bisakah Anda menjelaskan penggunaan "dan $? Terima kasih!
Galen Ivanov
Input selesai dengan ,:, ada 2 baris di sisi kiri. Kami membutuhkan "(1)tetapi "$bekerja juga, karena itu singkatan "1 _. $ b.0memberikan peringkat $ (monadik, kiri diad, kanan diad).
FrownyFrog
3

R , 118 94 75 72 byte

m=sapply(scan(,""),utf8ToInt);w=m>96;apply(m-32*(w-w[,2:1]),2,intToUtf8)

Cobalah online!

Pasti ada cara yang jauh lebih golf. -43 byte terima kasih kepada Giuseppe yang menunjuk saya ke solusi MATL oleh Luis Mendo. TIO link berisi solusi fungsi untuk jumlah byte yang sama.

m=sapply(a<-scan(,""),utf8ToInt)    # Turns input into a matrix of bytecode (2 columns)
w=m>96                              # Predicate : which chars are lower?
apply(m-32*(w-w[,2:1]),2,intToUtf8) # -32*w turns the string to UPPER
                                    # +32*w[,2:1] swaps capitalization
                                    # intToUtf8 turns bytecode to strings

Bonus: Outputnya adalah vektor bernama yang namanya adalah string input asli!

JayCe
sumber
Anda harus bisa turun a<-karena tidak menggunakan atempat lain.
Giuseppe
@ Giuseppe Apakah Anda membaca pikiranku? ;)
JayCe
3

kode mesin x86-64, 14 byte

Callable from C (konvensi pemanggilan SysV x86-64) dengan prototipe ini:

void casexchg(char *rdi, char *rsi);  // modify both strings in place

Versi eksplisit-panjang dengan panjang dalam rcxadalah ukuran yang sama. void casexchg(char *rdi, char *rsi, int dummy, size_t len);


Ini menggunakan bit-exchange algo yang sama dengan jawaban C dan Java: Jika kedua huruf sama, tidak perlu diubah. Jika mereka bertolak belakang, mereka berdua perlu berubah.

Gunakan XOR untuk membedakan bit case dari dua string. mask = (a XOR b) AND 0x20adalah 0 untuk sama atau 0x20 untuk berbeda. a ^= mask; b ^= maskcaseflip kedua huruf jika mereka kasus sebaliknya. (Karena kode huruf ASCII untuk atas dan bawah hanya berbeda dalam bit 5.)

Daftar NASM (dari nasm -felf64 -l/dev/stdout). Gunakan cut -b 26- <casexchg.lst >casexchg.lstuntuk mengubah ini kembali menjadi sesuatu yang dapat Anda kumpulkan.

   addr    machine
 6         code          global casexchg
 7         bytes         casexchg:
 8                       .loop:
 9 00000000 AC               lodsb                ; al=[rsi] ; rsi++
10 00000001 3207             xor   al, [rdi]
11 00000003 2420             and   al, 0x20       ; 0 if their cases were the same: no flipping needed
12                       
13 00000005 3007             xor   [rdi], al      ; caseflip both iff their cases were opposite
14 00000007 3046FF           xor   [rsi-1], al
15                       
16 0000000A AE               scasb                ; cmp al,[rdi] / inc rdi
17                           ; AL=0 or 0x20.
18                           ; At the terminating 0 in both strings, AL will be 0 so JNE will fall through.
19                           ; 0x20 is ASCII space, which isn't allowed, so AL=0x20 won't cause early exit
20 0000000B 75F3             jne  .loop
21                       ;    loop  .loop            ; caller passes explict length in RCX
22                       
23 0000000D C3               ret

  size = 0xe bytes = 14
24 0000000E 0E           db $ - casexchg_bitdiff

loopInstruksi lambat juga 2 byte, sama dengan pendek jcc. scasbmasih merupakan cara terbaik untuk meningkatkan rdiinstruksi satu byte. Saya kira kita bisa xor al, [rdi]/ stosb. Itu akan menjadi ukuran yang sama tetapi mungkin lebih cepat untuk loopkasus ini (memory src + store lebih murah daripada memory dst + reload). Dan masih akan mengatur ZF dengan tepat untuk kasus panjang implisit!

Cobalah online! dengan _start yang memanggilnya pada argv [1], argv [2] dan menggunakan sys_write pada hasilnya

Peter Cordes
sumber
2

Python 3 , 83 byte

lambda a,b:(g(a,b),g(b,a))
g=lambda*a:[chr(ord(x)&95|(y>'Z')<<5)for x,y in zip(*a)]

Cobalah online!

-3 byte terima kasih kepada Tn. Xcoder
-3 byte terima kasih kepada Chas Brown

HyperNeutrino
sumber
83 byte dengan sedikit twiddling.
Chas Brown
@ ChasBrown Oh keren, bagus. Terima kasih!
HyperNeutrino
2

QBasic, 133 byte

INPUT a$,b$
FOR i=1TO LEN(a$)
c=ASC(MID$(a$,i,1))
d=ASC(MID$(b$,i,1))
s=32AND(c XOR d)
?CHR$(c XOR s);
r$=r$+CHR$(d XOR s)
NEXT
?
?r$

Mengambil dua string yang dipisahkan koma dan mengeluarkan hasil yang dipisahkan baris baru. Menggunakan algoritma bit-fiddling dari jawaban Dennis's Jelly . Selain itu, trik golf utama di sini adalah string hasil pertama dicetak secara langsung, satu karakter pada satu waktu, yang sedikit lebih pendek daripada menyimpan kedua string hasil dalam variabel dan mencetaknya di luar loop.

DLosc
sumber
2

JavaScript, 77 74 73 byte

W=>W.map((w,x)=>w.map((c,i)=>W[+!x][i][`to${c>{}?'Low':'Upp'}erCase`]()))

Mengambil array array char, menghasilkan array array char.

-1 byte ( @Arnauld ): c>'Z'c>{}

Darrylyeo
sumber
1
Anda dapat menyimpan byte dengan c>{}.
Arnauld
1

Retina , 75 byte

^
¶
+`¶(([A-Z])|(.))(.*)¶(([A-Z])|(.))
$#6*$u$1$#7*$l$1¶$4$#2*$u$5$#3*$l$5¶

Cobalah online! Penjelasan: Baris baru digunakan sebagai penanda untuk menentukan berapa banyak string yang telah diproses. Regex mencoba mencocokkan dengan huruf besar atau gagal karakter apa pun. Jika huruf besar dicocokkan maka karakter lainnya menggunakan huruf besar atau sebaliknya, sedangkan baris baru akan dilanjutkan ke karakter berikutnya.

Neil
sumber
1

Python 3 , 76 75 byte

lambda a,b:''.join(chr(ord(x)&95|ord(y)&32)for x,y in zip(a+' '+b,b+'a'+a))

Cobalah online!

Keluarkan hasilnya sebagai satu string dengan pemisah satu karakter.

Terima kasih kepada Jonathon Allan selama 1 byte.

Chas Brown
sumber
(y>'Z')*32->ord(y)&32
Jonathan Allan
1

Majelis (nasm, x64, Linux) , 25 byte (sumber 123 byte)

Hex byte:

0x88, 0xE6, 0x30, 0xC6, 0x80, 0xE6, 0x20, 0x88
0xF2, 0x66, 0x31, 0xD0, 0x88, 0x26, 0xAA, 0xAC
0x8A, 0x26, 0x8A, 0x07, 0x08, 0xE4, 0x75, 0xE8, 0xC3

Titik masuk fungsi adalah di a, dengan string diteruskan menggunakan RDIdan RSI.

b:MOV DH,AH
XOR DH,AL
AND DH,32
MOV DL,DH
XOR AX,DX
MOV [RSI],AH
STOSB
LODSB
a:MOV AH,[RSI]
MOV AL,[RDI]
OR AH,AH
JNZ b
RET

Cobalah online!

ErikF
sumber
Saya baru sadar Anda sedang bermain sumber asm, bukan ukuran kode mesin. Itu biasanya lebih menyenangkan, karena kadang-kadang berguna dalam kehidupan nyata. (Semua yang dianggap sama, lebih kecil biasanya lebih baik untuk front-end dan kepadatan cache uop.) Tips untuk bermain golf di kode mesin x86 / x64 .
Peter Cordes
@PeterCordes Terima kasih atas tipnya. Saya telah menambahkan byte hex. Perakitan saya agak berkarat (saya terakhir harus menulis driver perangkat kecil untuk DOS 3.3!) Tapi saya pikir saya mendapatkan sebagian besar optimasi di.
ErikF
Ya, ini terlihat cukup bagus. Retensi pendaftaran parsial yang menarik. and al,32hanya 2 byte, menggunakan pengkodean AL8 khusus, imm8 yang dimiliki sebagian besar instruksi ALU. Anda bisa membutuhkan panjang string dalam RCX dan menggunakannya loop. Saya akan mengatakan Anda harus test ah,ahkarena itu lebih efisien daripadaor panjangnya sama, tetapi lebih lama dalam asm source sehingga idiom tua yang keras sebenarnya memiliki manfaat untuk asm-source code golf: P
Peter Cordes
Menggunakan memori-tujuan xor dan struktur loop yang lebih ketat, versi saya masuk pada 14 byte kode mesin x86-64 . Sama untuk menghitung string implisit-panjang atau eksplisit-panjang. Sumber NASM-nya mungkin bisa diturunkan lebih pendek dari 123 byte juga. Saya tidak yakin mana yang akan berjalan lebih cepat pada CPU modern seperti Skylake atau Ryzen (Ryzen tidak akan memiliki biaya tambahan untuk menggabungkan DH saat membaca DX, tetapi SKL akan membutuhkan siklus tambahan untuk memasukkan penggabungan.)
Peter Cordes
0

Arang , 17 byte

Eθ⭆ι⎇№α§§θ¬κμ↥λ↧λ

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Mengambil input sebagai array dari dua string. Penjelasan:

 θ                  Input array
E                   Map over strings
   ι                Current string
  ⭆                 Map over characters
         θ          Input array
           κ        Outer loop index
          ¬         Logical Not
        §           Index into array
            μ       Inner loop index
       §            Index into array
      α             Uppercase characters
     №              Count number of matches
              λ λ   Current character
             ↥      Uppercase
               ↧    Lowercase
    ⎇               Ternary
                    Implicitly print
Neil
sumber
0

F #, 120 byte

Bersetubuh.

open System
let g=Seq.fold2(fun a x y->a+string(x|>if y>'Z'then Char.ToLower else Char.ToUpper))""
let b f s=g f s,g s f

Cobalah online!

Fungsi gini menggunakan dua string sebagai parameter. Seq.fold2menerapkan fungsi dengan akumulator ( a) ke setiap elemen ( xdan y) di string. Awalnya aadalah string kosong, dan itu menambahkan karakter yang dikonversi untuk itu di setiap iterasi.

badalah fungsi utama. Pertama bertobat fdengan hormat s, dan kemudian bertobat sdengan hormat f. Kemudian mengembalikan tupel dengan kedua nilai.

Ciaran_McCarthy
sumber
0

Prolog (SWI) , 121 byte

[H|T]-[I|U]-[J|V]-[K|W]:-((H>96,I>96;H<92,I<92),J=H,K=I;H>96,J is H-32,K is I+32;J is H+32,K is I-32),T-U-V-W.
_-_-[]-[].

Cobalah online!

Khusus ASCII
sumber
0

Ruby , 74 69 byte

->a,b{a.zip(b).map{|x|x.one?{|y|y>?_}?x.map(&:swapcase):x}.transpose}

Cobalah online!

Input dan output adalah array karakter, sehingga footer melakukan transformasi bolak-balik dari string.

Saya belum yakin apakah ini merupakan pendekatan yang baik untuk masalah ini, tetapi tantangan ini jelas terlihat seperti skenario penggunaan yang bagus untuk swapcasemetode.

Kirill L.
sumber
0

PHP 4.1.2 , 40 byte

Ganti pasangan tanda kutip dengan byte A0 (dalam ISO-8859-1 atau Windows-1252, ini adalah NBSP) untuk mendapatkan jumlah byte yang ditampilkan, kemudian jalankan dari browser web (atau dari baris perintah), berikan string sebagai argumen string kueri (atau variabel lingkungan) adan b.

<?=$a^$c=($a^$b)&str_pad("",2e5),_,$b^$c;

Dalam versi PHP ini, register_globals aktif secara default, sehingga string akan secara otomatis ditugaskan ke variabel $adan $b. Tambah nilainya 2e5(200000) jika perlu.

PHP 7.1+, 58 byte

Jalankan di baris perintah, gunakan php -r 'code here' string1 string2 :

[,$a,$b]=$argv;echo("$b $a"^$a.=" $b")&str_pad("",3e5)^$a;

Nilai 3e5(300000) dipilih untuk melebihi (MAX_ARG_STRLEN * 2 + 1) pada sebagian besar sistem Linux (khususnya, x86 dan arsitektur lain yang PAGE_SIZE 4096, dan MAX_ARG_STRLEN dengan demikian 131072), untuk menghindari masalah dengan kemungkinan string input. Tambah jika perlu.

Cobalah online!

Mohon berdiri
sumber
0

Stax , 10 byte

▌Ö↑o╓→ì]yç

Jalankan dan debug itu

Berikut ini adalah representasi tanpa tanda dari program yang sama untuk menunjukkan cara kerjanya.

        Example
        ["Ab", "cd"]                    
:)      [["Ab", "cd"], ["cd", "Ab"]]    Get all rotations of input
m       ["cd", "Ab"]                    For each, run the rest of program; print result
  M     ["cA", "db"]                    Transpose matrix
  {     "cA"                            Begin block for mapping to result
    B   "A" 99                          "Pop" first element from string array; leave the rest
    96> "A" 1                           Is the character code > 96?
    :c  "a"                             Set case of string; 0 -> upper,  1 -> lower
  m     "ab"                            Perform the map using the block

Jalankan yang ini

rekursif
sumber
0

Crystal , 108 byte

def f(a,b)r=s=""
a.zip(b){|x,y|r+="`"<x<"{"?y.downcase: y.upcase
s+="`"<y<"{"?x.downcase: x.upcase}
{s,r}end

Cobalah online!

Bagaimana itu bekerja?

def f(a, b)                       # Strings as list of characters
r = s = ""                        # Strings buffers initialization
a.zip(b) do |x, y|                # Join two arrays to paired tuples and iterate
r+="`"<x<"{"?y.downcase: y.upcase # Check if character is downcase using triple
s+="`"<y<"{"?x.downcase: x.upcase # comparison and ascii table. Then apply it to
end                               # the other character using String methods
{s, r}                            # Return two new strings using a tuple
end                               # PS: Tuples are inmutable structures in Crystal
pengguna80978
sumber