交換資本金


35

2つの文字列を指定して、各文字列の大文字化パターンを他の文字列に転送します。最少バイトが勝ちます。

Input:   CodeGolf xxPPCGxx  
Output:  coDEGOlf XxppCgxx
  • 両方の文字列は、文字a..zとのみで、同じ長さで空ではありませんA..Z
  • 入力に対して相対的な順序で、結果の2つの文字列を出力できます。
  • 一対の文字列を、入力および/または出力用の文字以外の単一文字区切り文字を含む1つの文字列として表すことができます。
  • 文字列は、文字のリストまたは1文字の文字列として表すことができますが、コードポイント値のシーケンスとしてではなく、これらが言語の単なる文字列である場合を除きます。
  • 入力と出力では、文字列が異なる場合があります。

テストケース:

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

回答:


14

Java(JDK 10)、66バイト

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

オンラインでお試しください!

説明

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
この回答とはまったく関係ありませんが、チャットを作成するよりも簡単です。; p Java-10 TIOの使用時にバグがあることに気づきましたarray[i++%n]+=...;か?array[t=i++%n]=array[t]+...;正常に動作します; とarray[i%n]+=...;i++;同様に正常に動作しますが、モジュロを使用しi++たり、配列内の行に追加したりしても機能しませんこれは、Java 10 JDKまたはJava 10 TIOコンパイラのバグ(または機能:S)ですか?++i+=
ケビンCruijssen

1
@KevinCruijssen私は問題を見ていますが、奇妙に思えます。TIOで使用されているバージョンは10.0.0_46(2018年3月20日)です。最新バージョンは10.0.1です。おそらく、TIOにJavaのバージョンを更新するよう依頼する必要があります。
オリビエグレゴワール

3
@KevinCruijssen Dennisはバージョンを10.0.1に更新しましたが、問題は引き続き発生しています(Java 10がまだインストールされていないため、TIOに依存しています)。ここで何が起こるかわからないので、Stack Overflowで尋ねました...困惑しています!
オリビエグレゴワール

5
@KevinCruijssen大丈夫です、この回答が多くの賛成票を集めるようではありません:Pとにかく...問題は実際にバグを見つけたことです。仕様には、あなたが思うように振る舞うべきであると書かれているので、そのように答えを書き続け、必要であればJava 10向けに最適化してください。そうすれば、有効なJava 10の回答が得られますが、そのバグのためにテストできません。ちょうどそれを書いて、その後、変更のように、適切なJavaの10の変更を行い、Javaの8でそれをテストStringしますvar
オリビエグレゴワール

6
JDK 10でバグを見つけたのは本当にすてきだと思います。良い仕事:]
ポケ

13

C(gcc)86 58 55 53バイト

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

オンラインでお試しください!



@Cowsquack Wow; どうもありがとう。
ジョナサンフレッチ


@OlivierGrégoireありがとう。
ジョナサンフレッチ

8

ゼリー、9バイト

O&32^/^OỌ

オンラインでお試しください!

使い方

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
D:...我々はそれが起こるつもりだった知っていた
ジョナサン・アラン

7

APL(Dyalog Classic)13 12バイト

⊖⊖819⌶¨⍨∊∘⎕a

オンラインでお試しください!

入出力は2×N文字の行列です

⎕a は大文字の英語のアルファベットです 'ABC...Z'

∊∘⎕a 入力のどの文字が大文字かを示すブール行列を返します

819⌶ ブール型の左引数に応じて、右引数を大文字または小文字に変換します(「819」は「BIG」のリーツピークです)

819⌶¨⍨それを各(¨)文字に対して行い、引数を交換()します

は垂直方向に反転することを意味します。1つは左引数として機能し、もう1つ819⌶は最終アクションです


1
"819" is leetspeak for "BIG"...真剣に?それが819である理由の実際の説明ですか?0_o
DLosc


5

Pyth、10バイト

rVV_mmrIk1

ここで試してみてください!

説明と使用されたきちんとしたPythトリック

  • rVV_mmrIk1—完全なプログラム。入力は2つの文字列のリストとしてSTDINから取得され、出力は2つの文字リストのリストとしてSTDOUTに書き込まれます。

  • mm —各文字列の各文字に対して:

    • Ik —それが不変かどうかを確認します...
    • r...1— ...大文字に変換します。収量真の大文字とのための小文字のもののために。
  • _ —そのリストを逆にします。

  • VV —そして、2つのリストで次の関数を二重ベクトル化します。

    • r—値がTrue(別名1)の場合は大文字に変換し、そうでない場合は小文字に変換します。

このサブミッションは、r0and r1がPythの小文字と大文字の関数であるという事実を悪用し、True大文字とFalse。ブール値がPythonの整数のサブクラスであるという事実は、この答えが使用しているアプローチにとって非常に便利です。デニスとジョナサンのジェリーのアプローチを移植すると、どちらも18バイト以上になりました。そのため、ここで使用されているPyth固有のトリックに非常に満足しています。




3

J 36 31 27バイト

FrownyFrogのおかげで-9バイト!

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

オンラインでお試しください!

以前の解決策は次のとおりです。

J36 31バイト

FrownyFrogのおかげで-5バイト!

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

オンラインでお試しください!

使い方:

                          (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を、にはを指定(22 b.)できますXOR&.(3&u:)1バイト節約します。
-FrownyFrog

@FrownyFrogとても素敵なゴルフ、ありがとう!あなたは本当に良いです!
ガレンイワノフ


@FrownyFrogうわー!"and の使用方法を説明できます$か?ありがとう!
ガレンイワノフ

入力はで行わ,:れ、左側に2行あります。が必要な"(1)だけでなく、"$動作します "1 _$ b.0$(単項、二項左、二項右)のランクを与えます。
FrownyFrog

3

R118 94 75 72バイト

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

オンラインでお試しください!

もっとゴルファー的な方法があるはずです。ルイスメンドーのMATLソリューションを教えてくれたGiuseppeに-43バイト TIOリンクには、同じバイトカウントの関数ソリューションが含まれています。

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

ボーナス:出力は、名前が元の入力文字列である名前付きベクトルです!


他の場所をa<-使用しないので、ドロップできるはずaです。
ジュゼッペ

@ジュゼッペ私の心を読んでいた?;)
JayCe

3

x86-64マシンコード、14バイト

このプロトタイプでC(x86-64 SysV呼び出し規約)から呼び出し可能:

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

長さがinの明示的な長さのバージョンrcxは同じサイズです。 void casexchg(char *rdi, char *rsi, int dummy, size_t len);


これは、CおよびJavaの回答と同じビット交換アルゴリズムを使用します。 両方の文字が同じ場合、どちらも変更する必要はありません。逆の場合は、両方を変更する必要があります。

XORを使用して、2つの文字列の大文字小文字を区別します。 mask = (a XOR b) AND 0x20同じ場合は0、異なる場合は0x20です。 a ^= mask; b ^= mask大文字と小文字が逆の場合は、両方の文字を反転します。 (上位と下位のASCII文字コードはビット5のみが異なるため)

NASMリスト(から nasm -felf64 -l/dev/stdout)。これを使用cut -b 26- <casexchg.lst >casexchg.lstして、組み立て可能なものに戻します。

   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

スローloop命令も2バイトで、shortと同じjccです。 scasbそれでも、rdi1バイトの命令でインクリメントする最良の方法です。できると思うxor al, [rdi]stosbます/ 。それは同じサイズですが、おそらくloopケースの方が高速です(メモリsrc +ストアはメモリdst +リロードよりも安価です)。そして、暗黙の長さの場合にZFを適切に設定します!

オンラインでお試しください!argv [1]、argv [2]で呼び出し、結果にsys_writeを使用する_start





2

QBasic、133バイト

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$

カンマ区切りの2つの文字列を取得し、改行区切りの結果を出力します。DennisのJelly answerのビットをいじるアルゴリズムを使用します。それ以外の主要なゴルフの秘theは、最初の結果文字列を一度に1文字ずつ直接印刷することです。これは、両方の結果文字列を変数に保存してループ外で印刷するよりも少し短くなります。


2

JavaScript、77 74 73バイト

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

char配列の配列を受け取り、char配列の配列を出力します。

-1バイト(@Arnauld):c>'Z'c>{}


1
でバイトを保存できますc>{}
アーナウルド

1

網膜、75バイト

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

オンラインでお試しください!説明:改行は、処理されたストリングの量を判別するためのマーカーとして使用されます。正規表現は、大文字との一致を試みるか、その文字に失敗します。大文字が一致した場合、他の文字は大文字になり、そうでない場合は小文字になり、その逆の場合、改行は次の文字に進みます。



1

アセンブリ(nasm、x64、Linux)、25バイト(123バイトソース)

16進バイト:

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

関数のエントリーポイントはであるa使用して渡された文字列で、RDIそして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

オンラインでお試しください!


マシンコードのサイズではなく、asmソースでゴルフをしていることに気付きました。実際の生活では時々役立つので、通常はもっと楽しいです。(他のすべてが等しい場合、フロントエンドおよびuopキャッシュ密度については、一般的に小さい方が優れています。) x86 / x64マシンコードでのゴルフのヒント
ピーター

@PeterCordesヒントをありがとう。16進バイトを追加しました。私のアセンブリは少しさび(!私は最後のDOS 3.3のために少しのデバイスドライバを書かなければならなかった)ですが、私は私が最適化のほとんどを得たと思います。
ErikF

うん、これはかなりよさそうだ。興味深い部分登録ハッキング。 and al,32ほとんどのALU命令が持っている特別なAL、imm8エンコーディングを使用して、わずか2バイトです。RCXで文字列の長さを要求し、使用できますloop。同じ長さであるよりも効率的test ah,ahからあなたがすべきだと言っていましたが、asmソースでは長いので、無愛想な古いイディオムは実際にasmソースコードゴルフにメリットがあります:Por
Peter Cordes

私のバージョンでは、メモリ宛先xorとより厳密なループ構造を使用して、14バイトのx86-64マシンコードを受け取りました。暗黙の長さまたは明示的な長さの文字列をカウントする場合も同じです。NASMのソースも、おそらく123バイトよりも短くゴルフダウンできます。SkylakeやRyzenのような最新のCPUでどちらがより高速に動作するかわかりません(DXを読み込むときにRyzenがDHをマージするための追加コストはありませんが、SKLはマージuopを挿入するために余分なサイクルが必要です)
Peter Cordes


0

、17バイト

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。入力を2つの文字列の配列として受け取ります。説明:

 θ                  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バイト

バガー。

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

オンラインでお試しください!

この関数gは、2つの文字列をパラメーターとして受け取ります。文字列内の各要素(および)にSeq.fold2アキュムレータ(a)を持つ関数を適用します。最初は空の文字列で、各反復で変換された文字を追加します。xya

b主な機能です。まずfに関して変換しs、次にsに関して変換しfます。次に、両方の値を持つタプルを返します。



0

ルビー74 69バイト

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

オンラインでお試しください!

入力と出力は文字の配列であるため、フッターは文字列から前後に変換を行います。

これが問題に対する適切なアプローチであるかどうかはまだわかりませんが、この課題はswapcaseメソッドの良い使用シナリオのように見えます。


0

PHP 4.1.2、40バイト

引用符のペアをバイトA0(ISO-8859-1またはWindows-1252、これはNBSP)に置き換えて、表示されるバイトカウントを取得し、Webブラウザー(またはコマンドライン)から実行して、文字列をクエリ文字列引数(または環境変数)aおよびb

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

このバージョンのPHPでは、 register_globalsはデフォルトでオンになっているため、変数$aとに文字列が自動的に割り当てられます$b。値を増やす2e5必要に応じ(200000)を。

PHP 7.1以降、58バイト

次を使用して、コマンドラインで実行します php -r 'code here' string1 string2

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

3e5(300000)は、ほとんどのLinuxシステム(具体的には、x86と、PAGE_SIZEが4096であり、したがってMAX_ARG_STRLENが131072である他のアーキテクチャ)で(MAX_ARG_STRLEN * 2 + 1)を超えるように選択されます。必要に応じて増やします。

オンラインでお試しください!


0

スタックス、10 バイト

▌Ö↑o╓→ì]yç

実行してデバッグする

以下は、同じプログラムの動作を示すための、無制限の表現です。

        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

これを実行する


0

クリスタル、108バイト

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

オンラインでお試しください!

使い方?

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.