交易所大写


35

给定两个字母字符串,将每个字符串的大写模式转移到另一个字母上。最少的字节数获胜。

Input:   CodeGolf xxPPCGxx  
Output:  coDEGOlf XxppCgxx
  • 这两个字符串都是等长且非空的,只有字母a..zA..Z
  • 您可以相对于输入以任何顺序输出两个结果字符串。
  • 您可以将一对字符串表示为一个字符串,并使用非字母单字符分隔符输入和/或输出。
  • 您可以将字符串表示为字符列表或一个字符的字符串,但不能表示为代码点值的序列,除非这些只是您语言中的字符串。
  • 您的输入和输出可能代表不同的字符串。

测试用例:

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

Answers:


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++++i与模和并附+=加到数组中的行不起作用。. 这里以Java 10 TIO为例查看问题。这是Java 10 JDK还是Java 10 TIO编译器中的错误(或功能:S)?
凯文·克鲁伊森

1
@KevinCruijssen我看到了问题,但似乎很奇怪。我看到TIO上使用的版本是10.0.0_46(20-03-2018)。最新版本是10.0.1。我们可能应该要求TIO更新其Java版本。
奥利维尔·格雷戈尔

3
@KevinCruijssen Dennis将版本更新为10.0.1,问题仍然存在(我尚未安装Java 10,所以像您一样我也依赖TIO)。我已经问过堆栈溢出问题,因为我不知道这里会发生什么...莫名其妙!
奥利维尔·格雷戈尔

5
@KevinCruijssen好的,这不是像这样的答案吸引了很多反对意见:P反正...事实是您实际上发现了一个错误。由于规范说它应该像您想的那样工作,因此请继续以这种方式编写答案,并根据需要针对Java 10进行优化。这样,您可以获得有效的Java 10答案,但是由于该错误而无法测试。只需编写并在Java 8中对其进行测试,然后对Java 10进行适当的更改,例如更改Stringvar
奥利维尔·格雷戈尔

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;}

在线尝试!



@哇嘎哇哇; 非常感谢。
乔纳森·弗雷希


@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
Jonathan Allan

7

APL(Dyalog Classic)13 12字节

⊖⊖819⌶¨⍨∊∘⎕a

在线尝试!

输入和输出是2×N字符矩阵

⎕a 是大写英文字母 'ABC...Z'

∊∘⎕a 返回一个布尔矩阵,指示输入中的哪些字母为大写

819⌶ 根据其布尔左参数将其右参数转换为大写或小写(“ 819”代表“ BIG”)

819⌶¨⍨为每个(¨)字符执行此操作,交换()参数

表示垂直反转;一个充当左手论据,另一个充当819⌶最终行动


1
"819" is leetspeak for "BIG"严重吗?那就是为什么它是819的实际解释?0_o
DLosc

@DLosc是:) 看到聊天
NGN

5

Pyth,10个字节

rVV_mmrIk1

在这里尝试!

解释和整洁的Pyth技巧

  • rVV_mmrIk1—完整程序。输入来自STDIN作为两个字符串的列表,输出被写入STDOUT作为两个字符列表的列表。

  • mm —对于每个字符串中的每个字符:

    • Ik —检查它在...下是否不变
    • r...1— ...转换为大写。产量真正的大写字母和小写的。
  • _ —反转该列表。

  • VV —然后对两个列表中的以下函数进行双重向量化:

    • r—如果值为True(aka 1),则转换为大写,否则转换为小写。

本次提交滥用的事实,r0r1在Pyth的小写和大写功能,我们用真值(通过检查每个字符是大写获得的值,逆转)产生True了大写和False小写。布尔值是Python中整数的子类这一事实对于此答案使用的方法非常方便。移植Dennis和Jonathan的Jelly方法都导致超过18个字节,因此我对这里使用的Pyth特有的技巧感到非常满意。


4

MATL,11个字节

kG91<P32*-c

在线尝试!验证所有测试用例

说明

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


3

J36 31 27字节

-9个字节感谢FrownyFrog!

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

在线尝试!

先前的解决方案是:

J36 31字节

-5个字节,感谢FrownyFrog!

|:@(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非常好的高尔夫,谢谢!你真的很好!
Galen Ivanov


@FrownyFrog哇!你能解释的使用"$?谢谢!
Galen Ivanov

输入完成后,:,左侧有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)

在线尝试!

必须有一个更加高尔夫球的方式。-43个字节,感谢Giuseppe,后者向我指出了Luis Mendo的MATL解决方案。 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在其他任何地方使用。
朱塞佩

@Giuseppe你在读我的想法吗?;)
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来区分两个字符串的大小写位。 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相同jccscasb仍然是rdi使用单字节指令递增的最佳方法。我想我们能xor al, [rdi]/ stosb。那将是相同的大小,但在这种loop情况下可能更快(内存src +存储比内存dst +重载便宜)。并且仍然会为隐式长度的情况适当地设置ZF!

在线尝试!使用_start在argv [1],argv [2]上调用它并在结果上使用sys_write





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$

以逗号分隔两个字符串,并输出结果以换行符分隔。使用Dennis的Jelly answer中的摆弄算法。除此之外,这里的主要高尔夫技巧是直接打印第一个结果字符串,一次打印一个字符,这比将两个结果字符串都保存在变量中并在循环外打印要短一些。


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>{}
Arnauld

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字节源)

十六进制字节:

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

函数入口位于at 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感谢您的提示。我添加了十六进制字节。我的程序集有点生疏(我上次不得不为DOS 3.3编写一个小设备驱动程序!),但我想我获得了大部分优化
。– ErikF

是的,看起来不错。有趣的部分注册黑客。 and al,32使用大多数ALU指令具有的特殊AL,imm8编码,它只有2个字节。您可能需要在RCX中使用字符串长度并使用loop。我要说的是,应该这样做,test ah,ah因为这比or同等长度的效率更高,但是在asm源中则更长,因此硬皮的老成语实际上对asm源代码高尔夫很有价值:P
Peter Cordes

使用内存目标xor和更紧密的循环结构,我的版本以x86-64机器代码的14个字节出现。对于计数隐式长度或显式长度的字符串相同。它的NASM源也可能比123字节短。我不确定哪种处理器可以在Skylake或Ryzen等现代CPU上运行得更快(Ryzen在读取DX时合并DH不会有任何额外成本,但是SKL会需要一个额外的周期来插入合并的uop。)
Peter Cordes


0

木炭,17字节

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

在线尝试!链接是详细版本的代码。将输入作为两个字符串的数组。说明:

 θ                  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将两个字符串作为参数。Seq.fold2将带有累加器(a)的函数应用于字符串中的每个元素(xy)。最初a是一个空字符串,并且在每次迭代中将转换后的字符添加到其中。

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浏览器(或从命令行)运行,并提供以下字符串:查询字符串参数(或环境变量)ab

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

在此版本的PHP中,默认情况下register_globals处于启用状态,因此字符串将自动分配给变量$a$b2e5如有必要,增加值(200000)。

PHP 7.1 +,58字节

使用php -r 'code here' string1 string2以下命令在命令行上运行:

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

3e5在大多数Linux系统(特别是x86和其他体系结构(PAGE_SIZE为4096,因此MAX_ARG_STRLEN为131072))上,将值(300000)选择为超过(MAX_ARG_STRLEN * 2 +1),以避免任何可能的输入字符串出现问题。必要时增加。

在线尝试!


0

Stax,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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.