Matriz ascendente

17

La "matriz ascendente" es una matriz infinita de números enteros (incluido 0) en la que cualquier elemento es el elemento más pequeño disponible que no se haya utilizado previamente en la fila y columna respectivas:

  | 1 2 3 4 5 6 ...
--+----------------
1 | 0 1 2 3 4 5 ...
2 | 1 0 3 2 5 4 ...
3 | 2 3 0 1 6 7 ...
4 | 3 2 1 0 7 6 ...
5 | 4 5 6 7 0 1 ...
6 | 5 4 7 6 1 0 ...
. | ...............

Su tarea es escribir un programa que genere el elemento encontrado en la fila y columna especificada por la entrada. (entrada y salida estándar)

Casos de prueba:

5 3 -> 6
2 5 -> 5

Se aplican las reglas de Code Golf: gana el código más corto.

PD Incluso si esto tiene una naturaleza algorítmica, el código puede ser muy, muy conciso.

EDITAR: No esperaba ver la solución xor tan temprano. Realmente esperaba ver 10 publicaciones con un enfoque algorítmico y ENTONCES la solución xor. Ahora, teniendo en cuenta que no es muy divertido ver cómo escribir xor en diferentes idiomas, le recomiendo que también pruebe un enfoque algorítmico.

Entonces, sí, creo que nadie puede superar la marca de 5 caracteres ahora; por lo tanto, felicito a Ilmari Karonen por la solución más inteligente y más corta. Pero hay un nuevo desafío por delante: escribir la solución algorítmica más corta .

adrianton3
fuente
55
Xor es algorítmico.
Peter Taylor

Respuestas:

10

GolfScript, 5 caracteres

~(\(^

De hecho, esta tarea es muy simple una vez que reconoce el patrón. El único bit incómodo es la indexación basada en 1: si los índices de entrada se basan en cero, esta solución de 2 caracteres sería suficiente:

~^

Para explicar esto a los lectores que no están familiarizados con GolfScript, el ~ comando evalúa la entrada y deja los dos números en la pila. ^luego XOR junta los dos números superiores en la pila, dejando el resultado para la salida. Para manejar la entrada basada en 1, se necesitan dos comandos más: (disminuye el número más alto en la pila en uno, mientras \intercambia los dos elementos superiores en la pila.

Ilmari Karonen
fuente
1
¿Podría por favor explicarme ^? Me referí a la página de GolfScript Built-ins y a la diferencia simétrica ; usar esta operación con dos conjuntos de matrices tiene sentido, pero no entiendo cómo funciona para solo dos números separados.
Rob
1
@ Mike: cuando se aplica a los números, el ^operador devuelve su XOR bit a bit .
Ilmari Karonen
Esa es una relación genial :)
beary605
1
Estuviste en lo correcto en tu evaluación de mi respuesta, que desde entonces eliminé por basarme en una mala interpretación del desafío.
DavidC
2

Mathematica 10 44

Editar

Mi primera respuesta se basó en un malentendido sobre la naturaleza del desafío, como señaló Ilmari. Aquí hay otro intento.

Uso

f[n___, 1, n___] := n - 1;
j_~f~k_ := BitXor[j - 1, k - 1]
DavidC
fuente
@IlmariKaronen Creo que lo hice bien esta vez. Pero ni siquiera se acerca al tamaño de su solución.
DavidC
2

K, 31

{0b/:{(x|y)&~x~y}. 0b\:'-1+x,y}

Robé la lógica XOR de Ilmari Karonen, que nunca me habría visto.

tmartin
fuente
2

PHP, 38

Solo una implementación simple del XOR de Ilmari Karonen

<?php echo --$_GET['a']^--$_GET['b']?>

Uso:

... / xor.php? a = 4 & b = 7

imprimirá 6

Scleaver
fuente
2

Haskell 174

Pensé que haría una solución que no dependiera de XOR. Demasiado perezoso para jugar al golf correctamente.

a 0 0=0
a b c
 |m==n=a(b-m)(c-n)
 |m>n=m+a(b-m)c
 |m<n=n+a b(c-n)
 where{g f=until(>f)(*2)1`div`2;m=g b;n=g c;}
main=do
 [x,y]<-fmap(map read.words)getLine
 print$a(x-1)(y-1)

Editar: Me di cuenta un día después de que esto es solo calcular XOR. Por lo tanto, si esto cuenta como una solución algorítmica, también debería hacerlo la de Ilmari Karonen.

Walpen
fuente
2
Demasiado perezoso para jugar al golf correctamente. - Golf tu presentación para que sea un contendiente serio.
Jonathan Frech
2

Pitón 2, 36

Creo que desde que estoy empezando a aprender Python, este sería el momento perfecto para enviar mi primera respuesta usándola (y nadie ha respondido usando Python) y tal vez podría recibir algunos comentarios.

Gracias @IlmariKaronen por el atajo genial.

Gracias @Gareth por el código a continuación.

import sys
print(input()-1^input()-1)

Pitón 3, 56

El programa original que había escrito.

import sys
x=int(input())
y=int(input())
x-=1
y-=1
print(x^y)

IDEONE con 2 y 5

IDEONE con 3 y 3

Mike Dtrick
fuente
Supongo que estás usando Python 2 en lugar de Python 3; si no, ignora este comentario. inputya evalúa la entrada, por lo int()que no debería ser necesario. Además, dado que está recibiendo un int directamente de input()usted, puede hacerlo de -1inmediato. También puede deshacerse de las variables intermedias por completo e ir a la derecha print(input()-1^input()-1). En cuanto a si la importación es necesaria o no, otros usuarios de Python en este sitio no la incluyen para los programas que usan input(), pero no soy un programador de Python, así que no podría decir si es necesario o no.
Gareth
@Gareth En realidad estaba usando Python 3, pero me gusta su sugerencia print(input()-1^input()-1). ¡Gracias por la ayuda!
Rob el
¿Puedo preguntar por qué importas sys?
Jonathan Frech
2

MATL , 2 bytes

Z~

Pruébalo en línea!

MATL pospone el desafío por varios años, pero, ¡oye, la indexación natural basada en 1 y una función xor bit a bit lo hacen agradable y ordenado!

Giuseppe
fuente
0

Javascript 13 bytes

a=>b=>--a^--b

f=a=>b=>--a^--b

result = document.getElementById('result')
<input type="text" onkeyup="result.innerHTML = f(this.value.split(',')[0])(this.value.split(',')[1])" >
<p id="result"></p>

Luis felipe De jesus Munoz
fuente