Matriz ascendente


17

A "matriz ascendente" é uma matriz infinita de números inteiros (0 incluídos), em que qualquer elemento é o menor elemento disponível que não foi usado anteriormente na respectiva linha e coluna:

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

Sua tarefa é escrever um programa que produza o elemento encontrado na linha e coluna especificada pela entrada. (entrada e saída padrão)

Casos de teste:

5 3 -> 6
2 5 -> 5

Aplicam-se as regras do Código Golf - o código mais curto vence.

PS Mesmo que isso tenha uma natureza algorítmica, o código pode ser muito, muito conciso.

EDIT: Eu não esperava ver a solução xor tão cedo. Eu estava realmente esperando ver 10 posts com uma abordagem algorítmica e ENTÃO a solução xor. Agora, tendo em mente que não é muito divertido ver como escrever xor em diferentes idiomas, recomendo que você também tente uma abordagem algorítmica.

Então, sim, acho que ninguém pode superar a marca de cinco caracteres agora - portanto, parabenizo Ilmari Karonen pela solução mais inteligente e mais curta. Mas há um novo desafio à frente: escreva a solução algorítmica mais curta .


5
Xor é algorítmico.
Peter Taylor

Respostas:


10

GolfScript, 5 caracteres

~(\(^

De fato, essa tarefa é muito simples quando você reconhece o padrão. O único bit incómodo é a indexação baseada em 1 - se os índices de entrada fossem baseados em zero, esta solução de 2 caracteres seria suficiente:

~^

Para explicar isso aos leitores não familiarizados com o GolfScript, o ~comando avalia a entrada, deixando os dois números na pilha. ^então XORs os dois números mais altos na pilha juntos, deixando o resultado para a saída. Para lidar com a entrada baseada em 1, são necessários mais dois comandos: (diminui o número mais alto da pilha em um, enquanto \troca os dois itens principais da pilha.


11
Você poderia explicar o ^? Mencionei a página de incorporados do GolfScript e a diferença simétrica ; usar esta operação com dois conjuntos de matrizes faz sentido, mas não entendo como funciona para apenas dois números separados.
Rob

11
@ Mike: Quando aplicado a números, o ^operador retorna seu XOR bit a bit .
Ilmari Karonen

Essa é uma relação muito cool :)
beary605

11
Você estava certo em sua avaliação da minha resposta, que removi desde então por me basear em uma leitura incorreta do desafio.
DavidC

2

Mathematica 10 44

Editar

Minha primeira resposta foi baseada em um mal-entendido sobre a natureza do desafio, conforme observado por Ilmari. Aqui está outra tentativa.

Uso

f[n___, 1, n___] := n - 1;
j_~f~k_ := BitXor[j - 1, k - 1]

@IlmariKaronen Acho que entendi direito desta vez. Mas nem chega perto do tamanho da sua solução.
DavidC

2

K, 31

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

Roubei a lógica XOR de Ilmari Karonen, que eu nunca teria me visto.


2

PHP, 38

Apenas uma implementação simples do XOR de Ilmari Karonen

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

Uso:

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

imprimirá 6


2

Haskell 174

Achei que eu faria uma solução que não dependesse do XOR. Com preguiça de jogar corretamente.

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)

Edit: Eu percebi um dia depois que isso é apenas o cálculo de XOR. Portanto, se isso conta como uma solução algorítmica, o de Ilmari Karonen também deveria.


2
Com preguiça de jogar corretamente. - envie sua inscrição para que ela seja um candidato sério.
Jonathan Frech

2

Python 2, 36

Eu acho que desde que estou começando a aprender Python que este seria o momento perfeito para enviar minha primeira resposta (e ninguém respondeu usando Python) e talvez eu possa receber algum feedback.

Obrigado @IlmariKaronen pelo atalho muito legal.

Obrigado @Gareth pelo código abaixo.

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

Python 3, 56

O programa original que eu havia escrito.

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

IDEONE com 2 e 5

IDEONE com 3 e 3


Estou assumindo que você está usando o Python 2 em vez do Python 3 - se não ignorar esse comentário. inputjá avalia a entrada para int()que não seja necessário. Além disso, como você está recebendo um int diretamente, input()você pode fazer isso -1imediatamente. Você também pode se livrar completamente das variáveis ​​intermediárias e seguir em frente print(input()-1^input()-1). Se a importação é ou não necessária - outros usuários do Python neste site não a incluem para programas que usam input(), mas eu não sou um programador de Python, então não sei dizer se é necessário ou não.
Gareth

@ Gareth Na verdade, eu estava usando Python 3, mas eu gosto da sua sugestão print(input()-1^input()-1). Obrigado pela ajuda!
Rob

Posso perguntar por que você importa sys?
Jonathan Frech

2

MATL , 2 bytes

Z~

Experimente online!

O MATL adia o desafio por vários anos, mas, ei, indexação baseada em 1 natural e uma função xor bit a bit torna isso agradável e arrumado!



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>


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.