Capitalización cambiaria

35

Dadas dos cadenas de letras, transfiera el patrón de mayúsculas de cada cadena a la otra. Pocos bytes ganan.

Input:   CodeGolf xxPPCGxx  
Output:  coDEGOlf XxppCgxx
  • Ambas cadenas serán de igual longitud y no vacías, con solo letras a..zy A..Z.
  • Puede generar las dos cadenas resultantes en cualquier orden en relación con las entradas.
  • Puede representar un par de cadenas como una cadena con un separador de un solo carácter sin letras para entrada y / o salida.
  • Puede representar una cadena como una lista de caracteres o cadenas de un carácter, pero no como una secuencia de valores de puntos de código a menos que se trate simplemente de cadenas en su idioma.
  • Su entrada y salida pueden representar cadenas de manera diferente.

Casos de prueba:

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

Respuestas:

14

Java (JDK 10) , 66 bytes

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

Pruébalo en línea!

Explicaciones

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
fuente
99
Completamente no relacionado con esta respuesta tuya, pero es más fácil que crear un chat. ; p ¿Notó que el Java-10 TIO tiene un error al usarlo array[i++%n]+=...;? array[t=i++%n]=array[t]+...;funciona bien; y array[i%n]+=...;i++;funciona bien también, pero usar i++o ++icon un módulo y +=agregar a una fila en una matriz no funciona. Aquí un Java 10 TIO como ejemplo para ver el problema. ¿Es esto un error (o característica: S) en el Java 10 JDK o en el compilador Java 10 TIO?
Kevin Cruijssen
1
@KevinCruijssen Veo el problema, pero parece extraño. Veo que la versión utilizada en TIO es 10.0.0_46 (del 20-03-2018). La última versión es 10.0.1. Probablemente deberíamos pedirle a TIO que actualice su versión de Java.
Olivier Grégoire
3
@KevinCruijssen Dennis actualizó la versión a 10.0.1 y el problema sigue ocurriendo (todavía no tengo Java 10 instalado, así que confío en TIO, al igual que usted). He preguntado sobre Stack Overflow porque simplemente no sé qué pasa aquí ... ¡Es desconcertante!
Olivier Grégoire
55
@KevinCruijssen Está bien, no es que esta respuesta atraiga muchos votos positivos: P De todos modos ... La cosa es que realmente encontraste un error . Como la especificación dice que debería estar actuando como crees que lo hace, sigue escribiendo tu respuesta de esa manera, optimizada para Java 10 si es necesario. De esa manera, tiene una respuesta válida de Java 10, pero no comprobable debido a ese error. Simplemente escríbalo y pruébelo en Java 8, luego realice los cambios apropiados de Java 10 como cambiar Stringa var.
Olivier Grégoire
66
Creo que es genial que hayas encontrado un error en JDK 10. Buen trabajo:]
Empuja el
13

C (gcc) , 86 58 55 53 bytes

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

Pruébalo en línea!

Jonathan Frech
fuente
La manipulación de bits daf(S,Z)char*S,*Z;{for(int d;d=(*Z^*S)&32,*Z++^=d;)*S++^=d;}
Kritixi Lithos
@Cowsquack Wow; muchas gracias.
Jonathan Frech
@ OlivierGrégoire Gracias.
Jonathan Frech
8

Jalea , 9 bytes

O&32^/^OỌ

Pruébalo en línea!

Cómo funciona

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
fuente
1
... sabíamos que iba a suceder: D
Jonathan Allan
7

APL (Dyalog Classic) , 13 12 bytes

⊖⊖819⌶¨⍨∊∘⎕a

Pruébalo en línea!

entrada y salida es una matriz de caracteres 2 × N

⎕a es el alfabeto en mayúscula 'ABC...Z'

∊∘⎕a devuelve una matriz booleana que indica qué letras en la entrada son mayúsculas

819⌶ convierte su argumento derecho a mayúsculas o minúsculas dependiendo de su argumento booleano a la izquierda ("819" es leetspeak para "BIG")

819⌶¨⍨hace eso para cada carácter ( ¨), intercambiando ( ) los argumentos

significa revertir verticalmente; uno actúa como argumento izquierdo 819⌶y el otro es la acción final

ngn
fuente
1
"819" is leetspeak for "BIG"... ¿Seriamente? Esa es la explicación real de por qué es 819? 0_o
DLosc
@DLosc sí :) ver chat
ngn
5

Pyth , 10 bytes

rVV_mmrIk1

Pruébalo aquí!

Explicación y trucos Pyth limpios utilizados

  • rVV_mmrIk1- Programa completo. La entrada se toma de STDIN como una lista de dos cadenas, y la salida se escribe en STDOUT como una lista de dos listas de caracteres.

  • mm - Para cada personaje en cada una de las cadenas:

    • Ik - Compruebe si es invariante en ...
    • r...1- ... Convertir a mayúsculas. Rendimientos True para caracteres en mayúscula y False para caracteres en minúscula.
  • _ - Invierte esa lista.

  • VV - Y doble vectorice la siguiente función sobre las dos listas:

    • r- Convertir a mayúsculas si el valor es True(aka 1), de lo contrario, convertir a minúsculas.

Esta presentación abusa del hecho de que r0y r1son las funciones en minúsculas y mayúsculas en Pyth, y usamos valores de verdad (los valores obtenidos al verificar si cada carácter es mayúscula, invertido) dando lugar Truea mayúsculas y Falseminúsculas. El hecho de que los booleanos son subclases de enteros en Python es muy útil para el enfoque que está utilizando esta respuesta. Los enfoques de Porting Dennis y Jonathan's Jelly resultaron en más de 18 bytes, por lo que estoy bastante contento con los trucos específicos de Pyth utilizados aquí.

Sr. Xcoder
fuente
4

MATL , 11 bytes

kG91<P32*-c

Pruébalo en línea!O verificar todos los casos de prueba .

Explicación

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
fuente
4

Haskell , 78 bytes

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

Pruébalo en línea!

usuario28667
fuente
44
isUpper xpuede ser x<'a'.
Lynn
3

J , 36 31 27 bytes

-9 bytes gracias a FrownyFrog!

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

Pruébalo en línea!

La solución anterior fue:

J , 36 31 bytes

-5 bytes gracias a FrownyFrog!

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

Pruébalo en línea!

Cómo funciona:

                          (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
fuente
El [:puede ser 0 y el (22 b.)puede ser XOR. &.(3&u:)ahorra 1 byte.
FrownyFrog
@FrownyFrog Muy buenos campos de golf, ¡gracias! ¡Eres muy bueno!
Galen Ivanov
27
FrownyFrog
@FrownyFrog ¡Guau! ¿Puedes explicar el uso de "y $? ¡Gracias!
Galen Ivanov
La entrada se realiza con ,:, hay 2 filas en el lado izquierdo. Necesitamos "(1)pero "$también funciona, porque significa "1 _. $ b.0da el rango de $ (monádico, izquierda diádica, derecha diádica).
FrownyFrog
3

R , 118 94 75 72 bytes

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

Pruébalo en línea!

Debe haber una forma mucho más golfista. -43 bytes gracias a Giuseppe que me señaló la solución MATL de Luis Mendo. El enlace TIO contiene una solución de función para el mismo recuento de bytes.

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

Bonificación: ¡La salida es un vector con nombre cuyos nombres son las cadenas de entrada originales!

JayCe
fuente
Debería poder soltar a<-ya que no lo usa en aningún otro lugar.
Giuseppe
@Giuseppe ¿Estabas leyendo mi mente? ;)
JayCe
3

Código de máquina x86-64, 14 bytes

Se puede llamar desde C (convención de llamadas SysV x86-64) con este prototipo:

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

Una versión de longitud explícita con longitud rcxes del mismo tamaño. void casexchg(char *rdi, char *rsi, int dummy, size_t len);


Utiliza el mismo algoritmo de intercambio de bits que las respuestas de C y Java: si ambas letras son el mismo caso, ninguna necesita cambiar. Si son el caso opuesto, ambos deben cambiar.

Use XOR para diferenciar el bit de mayúsculas y minúsculas de las dos cadenas. mask = (a XOR b) AND 0x20es 0 para igual o 0x20 para diferente. a ^= mask; b ^= maskcaseflip ambas letras si fueran mayúsculas y minúsculas. (Debido a que los códigos de letras ASCII para superior e inferior difieren solo en el bit 5).

Listado NASM (desde nasm -felf64 -l/dev/stdout). Use cut -b 26- <casexchg.lst >casexchg.lstpara volver a convertir esto en algo que pueda armar.

   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

La loopinstrucción lenta también es de 2 bytes, igual que un corto jcc. scasbsigue siendo la mejor manera de aumentar rdicon una instrucción de un byte. Supongo que podríamos xor al, [rdi]/ stosb. Sería del mismo tamaño pero probablemente más rápido para elloop caso (la memoria src + store es más barata que la memoria dst + reload). ¡Y todavía establecería ZF apropiadamente para el caso de longitud implícita!

Pruébalo en línea! con un _start que lo llama en argv [1], argv [2] y usa sys_write en el resultado

Peter Cordes
fuente
2

Python 3 , 83 bytes

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)]

Pruébalo en línea!

-3 bytes gracias a Mr. Xcoder
-3 bytes gracias a Chas Brown

Hiperneutrino
fuente
83 bytes con un poco de bit-twiddling.
Chas Brown
@ChasBrown Oh, bien, bien. ¡Gracias!
HyperNeutrino
2

QBasic, 133 bytes

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$

Toma las dos cadenas separadas por comas y genera los resultados separados por nueva línea. Utiliza el algoritmo de violín de la respuesta de Dennis's Jelly . Aparte de eso, el truco principal del golf aquí es que la primera cadena de resultados se imprime directamente, un carácter a la vez, que es un poco más corto que guardar ambas cadenas de resultados en variables e imprimirlas fuera del bucle.

DLosc
fuente
2

JavaScript, 77 74 73 bytes

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

Toma una matriz de matrices de caracteres, emite una matriz de matrices de caracteres.

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

Darrylyeo
fuente
1
Puede guardar un byte con c>{}.
Arnauld
1

Retina , 75 bytes

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

Pruébalo en línea! Explicación: las nuevas líneas se utilizan como marcadores para determinar la cantidad de cadena que se ha procesado. La expresión regular intenta hacer coincidir las letras mayúsculas o en su defecto cualquier carácter. Si una letra mayúscula coincide, entonces el otro carácter está en mayúscula; de lo contrario, está en minúscula y viceversa, mientras que las líneas nuevas avanzan al siguiente carácter.

Neil
fuente
1

Python 3 , 76 75 bytes

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

Pruébalo en línea!

Emite el resultado como una cadena con un separador de un solo carácter.

Gracias a Jonathon Allan por 1 byte.

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

Ensamblaje (nasm, x64, Linux) , 25 bytes (fuente de 123 bytes)

Bytes hexadecimales:

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

El punto de entrada de la función está en a, con las cadenas pasadas en el uso RDIy 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

Pruébalo en línea!

ErikF
fuente
Me acabo de dar cuenta de que estás jugando a la fuente asm, no al tamaño del código de máquina. Eso suele ser más divertido, porque ocasionalmente es útil en la vida real. (Todo lo demás es igual, más pequeño suele ser mejor para la densidad de caché de front-end y uop). Consejos para jugar golf en código de máquina x86 / x64 .
Peter Cordes
@ PeterCordes Gracias por la sugerencia. He agregado los bytes hexadecimales. Mi ensamblaje está un poco oxidado (¡la última vez que tuve que escribir un pequeño controlador de dispositivo para DOS 3.3!) Pero creo que obtuve la mayoría de las optimizaciones.
ErikF
Sí, esto se ve bastante bien. Hacks interesantes de registro parcial. and al,32es de solo 2 bytes, usando la AL especial, codificación imm8 que tienen la mayoría de las instrucciones ALU. Puede requerir la longitud de la cadena en RCX y usarla loop. Iba a decir que deberías test ah,ahporque eso es más eficiente queor si bien tiene la misma longitud, pero es más largo en fuente asm, por lo que el viejo idioma crujiente en realidad tiene mérito para el golf de código fuente asm: P
Peter Cordes
Utilizando xor de destino de memoria y una estructura de bucle más ajustada, mi versión llegó a 14 bytes de código de máquina x86-64 . Lo mismo para contar cadenas de longitud implícita o de longitud explícita. Su fuente NASM probablemente también podría reducirse a menos de 123 bytes. No estoy seguro de qué funcionaría más rápido en una CPU moderna como Skylake o Ryzen (Ryzen no tendría ningún costo adicional por fusionar DH al leer DX, pero SKL necesitaría un ciclo adicional para insertar una fusión).
Peter Cordes
0

Carbón , 17 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. Toma la entrada como una matriz de dos cadenas. Explicación:

 θ                  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
fuente
0

F #, 120 bytes

Tío.

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

Pruébalo en línea!

La función gtoma las dos cadenas como parámetros. Seq.fold2aplica una función con un acumulador ( a) a cada elemento ( xy y) en las cadenas. Inicialmente aes una cadena vacía, y le agrega el carácter convertido en cada iteración.

bEs la función principal. Primero se convierte fcon respecto a s, y luego se convierte scon respecto a f. Luego devuelve una tupla con ambos valores.

Ciaran_McCarthy
fuente
0

Ruby , 74 69 bytes

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

Pruébalo en línea!

La entrada y la salida son matrices de caracteres, por lo que el pie de página realiza transformaciones de cadenas.

Todavía no estoy seguro de si este es un buen enfoque del problema, pero este desafío definitivamente parece un buen escenario de uso para el swapcasemétodo.

Kirill L.
fuente
0

PHP 4.1.2 , 40 bytes

Reemplace el par de comillas con el byte A0 (en ISO-8859-1 o Windows-1252, esto es NBSP) para obtener el recuento de bytes que se muestra, luego ejecute desde un navegador web (o desde la línea de comando), proporcionando las cadenas como los argumentos de cadena de consulta (o variables de entorno) ay b.

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

En esta versión de PHP, register_globals está activado de forma predeterminada, por lo que las cadenas se asignarán automáticamente a las variables $ay $b. Aumente el valor 2e5(200000) si es necesario.

PHP 7.1+, 58 bytes

Ejecutar en la línea de comando, usando php -r 'code here' string1 string2 :

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

El valor 3e5 (300000) se elige para exceder (MAX_ARG_STRLEN * 2 + 1) en la mayoría de los sistemas Linux (específicamente, x86 y otras arquitecturas para las cuales PAGE_SIZE es 4096, y MAX_ARG_STRLEN es 131072), para evitar problemas con cualquier posible cadena de entrada. Aumentar si es necesario.

Pruébalo en línea!

Por favor levantese
fuente
0

Stax , 10 bytes

▌Ö↑o╓→ì]yç

Ejecutar y depurarlo

Aquí hay una representación no reflejada del mismo programa para mostrar cómo funciona.

        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

Ejecute este

recursivo
fuente
0

Cristal , 108 bytes

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

Pruébalo en línea!

¿Cómo funciona?

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
usuario80978
fuente