Borsa büyük harf kullanımı


35

İki harf dizisi göz önüne alındığında, her bir dizinin büyük harf yapısını diğerine aktarın. En az bayt kazanır.

Input:   CodeGolf xxPPCGxx  
Output:  coDEGOlf XxppCgxx
  • Her iki dize de eşit uzunlukta ve boş olacaktır, yalnızca harfler a..zve A..Z.
  • Sonuçta ortaya çıkan iki dizeyi girdilere göre sırayla çıkartabilirsiniz.
  • Girdi ve / veya çıktı için harf olmayan tek karakterli ayırıcı içeren bir dize olarak bir çift dizeyi temsil edebilirsiniz.
  • Bir dize karakter listesi veya tek karakterli dizeler olarak temsil edebilirsiniz, ancak bunlar yalnızca sizin dilinizde dizeler olmadıkça kod noktası değerleri dizisi olarak gösterilemez.
  • Giriş ve çıkışlarınız dizeleri farklı şekilde gösterebilir.

Test durumları:

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

Yanıtlar:


14

Java (JDK 10) , 66 bayt

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

Çevrimiçi deneyin!

açıklamalar

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].
}

9
Tamamen sizin cevaplarınızla ilgisiz, ancak bir sohbet oluşturmaktan daha kolay. ; p Kullanırken Java-10 TIO’da bir hata olduğunu fark ettiniz array[i++%n]+=...;mi? array[t=i++%n]=array[t]+...;iyi çalışıyor; ve array[i%n]+=...;i++;aynı zamanda iyi çalışır, ancak bir modulo kullanarak i++veya bir dizi kullanarak bir satır eklemek veya çalışmak değildir .. Burada bir Java 10 TIO problemi görmek için bir örnek. Bu Java 10 JDK'daki veya Java 10 TIO derleyicisindeki bir hata mı (veya özellik: S)? ++i+=
Kevin Cruijssen

1
@KevinCruijssen Ben sorunu görüyorum, ama garip görünüyor. TIO'da kullanılan sürümün 10.0.0_46 (20-03-2018) olduğunu görüyorum. En son sürüm 10.0.1'dir. Muhtemelen TIO'dan Java sürümlerini güncellemesini istemeliyiz.
Olivier Grégoire

3
@KevinCruijssen Dennis sürümü 10.0.1'e güncelledi ve sorun hala devam ediyor (Java 10 yüklü değil, bu yüzden tıpkı senin gibi TIO'ya güveniyorum). Burada ne olduğunu bilmediğim için Stack Overflow'a sordum .
Olivier Grégoire

5
@KevinCruijssen Tamam, bu cevabın pek çok olumlu ilgiyi çekmesi gibi bir şey değil: P Her neyse ... Mesele şu ki bir hata buldunuz . Teknik özellik, düşündüğünüz gibi davranması gerektiğini söylediğinden, cevabınızı bu şekilde yazmaya devam edin, gerekirse 10 Java için optimize edilmiştir. Bu şekilde, geçerli bir Java 10 cevabınız var ancak bu hata nedeniyle denenemez. Sadece yazın ve Java 8'de test edin, sonra değiştirmek gibi uygun Java 10 değişikliklerini Stringyapın var.
Olivier Grégoire

6
Ben bunu JDK 10. İyi iş bir hata buldum gerçekten düzgün olduğunu düşünüyorum:]
Poke

13

C (gcc) , 86 58 55 53 bayt

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

Çevrimiçi deneyin!



@Cowsquack Wow; çok teşekkürler.
Jonathan Frech


@ OlivierGrégoire Teşekkürler.
Jonathan Frech

8

Jöle , 9 bayt

O&32^/^OỌ

Çevrimiçi deneyin!

Nasıl çalışır

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.

1
... bunun olacağını biliyorduk: D
Jonathan Allan,

7

APL (Dyalog Klasik) , 13 12 bayt

⊖⊖819⌶¨⍨∊∘⎕a

Çevrimiçi deneyin!

giriş ve çıkış 2 × N karakter matrisidir

⎕a Büyük harf İngilizce alfabedir 'ABC...Z'

∊∘⎕a girdideki hangi harflerin büyük harf olduğunu gösteren bir boolean matrisini döndürür

819⌶ boolean sol argümanına bağlı olarak sağ argümanını büyük veya küçük harfe dönüştürür ("819", "BIG" için leetspeak'dir)

819⌶¨⍨Bunu her ( ¨) karakter için yapar , değişkenleri değiştirerek ( )

dikey olarak ters anlamına gelir; biri sol argüman gibi davranır 819⌶, diğeri ise son eylemdir


1
"819" is leetspeak for "BIG"... Ciddi anlamda? 819'un neden gerçek açıklaması bu mu? 0_o
DLosc

@DLosc yes :) sohbete bak
ngn

5

Pyth , 10 bayt

rVV_mmrIk1

Burada dene!

Açıklama ve düzgün Pyth kullanılan hileler

  • rVV_mmrIk1- Tam program. Girdi, iki dizginin listesi olarak STDIN'den alınır ve çıktı iki karakter listesinin listesi olarak STDOUT'a yazılır.

  • mm - Dizelerin her birindeki her karakter için:

    • Ik - Altında değişmeyen olup olmadığını kontrol et ...
    • r...1- ... Büyük harfe dönüştürme. Verim Gerçek büyük harfli karakterler için ve yanlış küçük olanlar için.
  • _ - Listeyi tersine çevir.

  • VV - Ve aşağıdaki fonksiyonu iki liste üzerinde çift-lineize edin:

    • r- Değer True(aka 1) ise büyük harfe dönüştür, aksi takdirde küçük harfe dönüştürülür.

Bu gönderim kötüye gerçeği r0ve r1Pyth içinde Küçük ve büyük harf fonksiyonları vardır ve biz gerçeği değerleri (her karakter büyük harfli ise kontrol ederek elde edilen değerlerin tersine) kullanan verimli Trueharfe ve Falseküçük harf için. Booleanların Python'daki bir tamsayı alt sınıfı olması, bu cevabın kullandığı yaklaşım için çok kullanışlıdır. Dennis ve Jonathan'ın Jelly yaklaşımlarının her ikisi de 18 bayttan fazla sonuç verdi, bu yüzden burada kullanılan Pyth'e özgü numaralardan çok memnunum.




3

J , 36 31 27 bayt

FrownyFrog sayesinde -9 bayt!

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

Çevrimiçi deneyin!

Önceki çözüm şuydu:

J , 36 31 bayt

FrownyFrog sayesinde -5 bayt!

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

Çevrimiçi deneyin!

Nasıl çalışır:

                          (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

[:0 olabilir ve (22 b.)olabilir XOR. &.(3&u:)1 bayt kaydeder.
FrownyFrog

@ FrownyFrog Çok güzel golf, teşekkür ederim! Sen gerçekten iyisin!
Galen Ivanov


@ FrownyFrog Vay! Eğer kullanımını açıklayabilir "ve $? Teşekkürler!
Galen Ivanov

Giriş yapılır ,:, sol tarafta 2 satır vardır. İhtiyacımız var "(1)ama "$işe yarıyor, çünkü bunun anlamı "1 _. $ b.0$ (monadic, dyadic left, dyadic right) rütbesini verir.
FrownyFrog

3

R , 118 94 75 72 bayt

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

Çevrimiçi deneyin!

Çok daha golfçü bir yol olmalı. -43 bayt, beni Luis Mendo'nun MATL çözümüne yönlendiren Giuseppe sayesinde . TIO bağlantısı aynı bayt sayısı için bir fonksiyon çözümü içerir.

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: Çıktı, isimleri orijinal girdi dizeleri olan isimlendirilmiş bir vektördür!


Sen düşmesi gerekir a<-Kullanmadığınız beri abaşka bir yerde.
Giuseppe

@Giuseppe Aklımı okuyor musun? ;)
JayCe

3

x86-64 makine kodu, 14 bayt

Bu prototip ile C'den (x86-64 SysV arama sözleşmesi) aranabilir:

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

Uzunluğu olan açık uzunluklu bir sürüm rcxaynı boyuttadır. void casexchg(char *rdi, char *rsi, int dummy, size_t len);


Bu, C ve Java cevaplarıyla aynı bit değişimi algo kullanır: Her iki harf aynı ise, her ikisinin de değişmesi gerekmez. Karşı dava ise ikisinin de değişmesi gerekiyor.

İki dizenin büyük / küçük harfini farklılaştırmak için XOR kullanın. mask = (a XOR b) AND 0x20Aynı için 0, farklı için 0x20. a ^= mask; b ^= maskher iki harften farklı olsa da caseflip. (Çünkü ASCII üst ve alt harflerin kodları sadece 5 bitinde değişir.)

NASM listelemesi (den nasm -felf64 -l/dev/stdout). cut -b 26- <casexchg.lst >casexchg.lstBunu tekrar monte edebileceğiniz bir şeye dönüştürmek için kullanın .

   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

Yavaş loopkomut, kısa olarak aynı 2 bayttır jcc. scasbhala rdibir tek baytlık komut ile artmanın en iyi yoludur . Ben yapabiliriz sanırım xor al, [rdi]/ stosb. Bu aynı boyutta olacaktır ancak loopdurum için muhtemelen daha hızlıdır (memory src + store, hafıza dst + yeniden yüklemesinden daha ucuzdur). Ve yine ZF'yi örtük uzunlukta davaya uygun şekilde ayarlayabilir!

Çevrimiçi deneyin! argv [1] üzerinde çağıran bir _start ile, argv [2] ve sonuçta sys_write kullanılır





2

QBasic, 133 bayt

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$

İki dizgiyi virgülle ayrılmış olarak alır ve yeni satırla ayrılmış sonuçları çıkarır. Dennis'in Jelly cevabındaki bit toplama algoritmasını kullanır . Bunun dışında, buradaki ana golf numarası, ilk sonuç dizgisinin doğrudan basıldığı, bir seferde bir karakter olduğu, bu sonuçların hem sonuç dizgilerini değişkenlere kaydetmekten hem de döngü dışına yazdırmaktan biraz daha kısa olmasıdır.


2

JavaScript, 77 74 73 bayt

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

Bir dizi char dizisi alır, bir dizi char dizisi çıkarır.

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


1
İle bir bayt kaydedebilirsiniz c>{}.
Arnauld

1

Retina , 75 bayt

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

Çevrimiçi deneyin! Açıklama: Yeni satırlar, dizenin ne kadarının işlendiğini belirlemek için işaretçiler olarak kullanılır. Düzenli ifade, büyük harflerle eşleşmeye veya herhangi bir karakterde başarısızlığa uğramaya çalışır. Eğer bir büyük harfle eşleştirilirse, diğer karakter büyük harfe dönüştürülür, aksi halde küçük harfe dönüştürülür, aksi halde yeni satırlar bir sonraki karaktere ilerletilir.



1

Montaj (nasm, x64, Linux) , 25 bayt (123 bayt kaynak)

Hex bayt:

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

Fonksiyon giriş noktası olan adizeleri kullanılarak geçilen ile, RDIve 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

Çevrimiçi deneyin!


Makine kodunda değil asm kaynağında golf oynadığını anladım. Bu genellikle daha eğlenceli, çünkü zaman zaman gerçek hayatta faydalı oluyor. (Diğer her şey eşit, daha küçük ön uç ve uop önbellek yoğunluğu için daha iyidir.) X86 / x64 makine kodunda golf oynamak için ipuçları .
Peter Cordes,

@PeterCordes Tahmininiz için teşekkürler. Onaltılık bayt ekledim. Benim derlemem biraz paslanmış (son olarak DOS 3.3 için küçük bir aygıt sürücüsü yazmak zorunda kaldım!) Ama optimizasyonların çoğunu aldığımı düşünüyorum.
ErikF

Evet, bu oldukça iyi görünüyor. İlginç kısmi sicil hackleri. and al,32ALU komutlarının çoğunda bulunan özel AL, imm8 kodlamasını kullanan yalnızca 2 bayttır. Dize uzunluğu RCX'te gerekebilir ve kullanabilirsiniz loop. Söylemeliydim, test ah,ahçünkü aynı uzunlukta olmaktan daha verimlior , ama asm kaynağında daha uzun, bu yüzden huysuz eski deyim aslında asm-kaynak kodlu golf oynamak için haklı: P
Peter Cordes

Bellek hedefi xor ve daha sıkı bir döngü yapısı kullanarak sürümüm 14 byte x86-64 makine kodunda geldi . Örtülü uzunluk veya açık uzunluktaki dize sayısı için aynıdır. NASM kaynağı da muhtemelen 123 byte'tan daha kısa sürede golf oynayabilir. Skylake veya Ryzen gibi modern bir işlemcide daha hızlı çalışacağından emin değilim (Ryzen'in DX okurken DH'i birleştirmek için ekstra bir maliyeti olmayacaktı, ancak SKL'nin bir birleşme eki eklemek için fazladan bir döngüye ihtiyacı olacak.)
Peter Cordes


0

Kömür , 17 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Girdiyi iki karakter dizisi olarak alır. Açıklama:

 θ                  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

0

F #, 120 bayt

Kahretsin.

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

Çevrimiçi deneyin!

İşlev giki dizgiyi parametre olarak alır. dizgilerdeki her bir öğeye ( ve ) Seq.fold2bir toplayıcı ( a) içeren bir işlev uygular . Başlangıçta boş bir dizedir ve dönüştürülen karakteri her yinelemede ekler.xya

bana işlevidir. İlk önce fona göre s, sonra sona göre değişir f. Daha sonra her iki değerle birlikte bir tuple döndürür.



0

Ruby , 74 69 bayt

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

Çevrimiçi deneyin!

Girdi ve çıktı, karakter dizileridir, bu nedenle altbilgi dizgilerden ileri geri dönüşümler yapar.

Bunun soruna iyi bir yaklaşım olup olmadığından henüz emin değilim, ancak bu zorluk kesinlikle swapcaseyöntem için iyi bir kullanım senaryosuna benziyor .


0

PHP 4.1.2 , 40 bayt

Gösterilen bayt sayısını almak için bayt A0 ile (ISO-8859-1 veya Windows-1252'de, bu NBSP'dir) çift tırnak işaretini değiştirin, ardından bir web tarayıcıdan çalıştırın (veya komut satırından). sorgu dizesi argümanları (veya ortam değişkenleri) ave b.

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

PHP'nin bu sürümünde, register_globals varsayılan olarak açıktır, dolayısıyla dizgeler otomatik olarak değişkenlere atanır $ave $b. 2e5Gerekirse değerini (200000) arttırın .

PHP 7.1+, 58 bayt

Komut satırında çalıştırın php -r 'code here' string1 string2:

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

Değer 3e5(300000), Linux sistemlerinde (özellikle, PAGE_SIZE'ın 4096 ve MAX_ARG_STRLEN'in bu nedenle 131072 olduğu diğer x86 ve diğer mimarilerde 131072) aşılması (MAX_ARG_STRLEN * 2 + 1) olarak seçilmiştir. Gerekirse arttırın.

Çevrimiçi deneyin!


0

Stax , 10 bayt

▌Ö↑o╓→ì]yç

Koş ve hata ayıkla

İşte nasıl çalıştığını göstermek için aynı programın asılsız bir gösterimi.

        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

Bunu çalıştır


0

Kristal , 108 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır?

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.