Calcular o Numpad Taxicab

8

O crédito vai para onde é devido


Dado dois dígitos, x e y, calcule o menor número de saltos horizontais ou verticais para ir de x a y em um numpad padrão, por exemplo

789
456
123
00

Você pode assumir com segurança que todas as entradas serão de 0 a 9 e não precisa manipular entradas inválidas. A entrada pode ser o mesmo número duas vezes, que tem uma distância de 0.

O IO pode estar em qualquer formato razoável , e as brechas padrão são proibidas. Menor resposta em bytes ganha!

IO de amostra:

1, 4: 1
1, 8: 3
3, 7: 4
8, 2: 2
6, 1: 3
0, 9: 4
4, 4: 0
0, 4: 2
James
fonte

Respostas:

3

Gelatina , 11 bytes

o-1.’d3ạ/ḞS

Experimente online! ou verifique todos os casos de teste .

Como funciona

o-1.’d3ạ/ḞS  Main link. Argument: [a, b] (list of integers)

 -1.         Yield -1.5.
o            Take the logical OR of a and b with -1.5.
             This maps 0 to -1.5, and all other integers to themselves.
    ’        Decrement the results.
     d3      Divmod; compute quotient and remainder of each result divided by 3.
       ạ/    Reduce by absolute difference across columns.
         Ḟ   Floor; round all differences down to the nearest integer.
          S  Sum; add the rounded absolute differences.
Dennis
fonte
Bom retorno.
Leaky Nun
3

Python, 140 114 bytes

Eu sou o primeiro temporizador, então por favor ajude. Aqui está o meu código.

def f(x,y):x,y,k=x-1,y-1,abs;return x!=-1 and y!=-1 and k(y//3-x//3)+k(y%3-x%3) or k(y//3-x//3)+int(max(x,y)%3==2)
TheRandomGuy
fonte
1
Algumas dicas: 1) use espaços únicos para recuos, 2) coloque os parênteses em torno da condição if, 3) se livre do espaço na lista de argumentos, 4) divmodpode ajudá-lo, 5) em vez de if cond:return A\nelse:return Bfazê-lo return cond and A or B.
Mego
@Mego Como divmodajuda? Eu não acho que eu bytes já salvou com isso
SP3000
@ Sp3000 Talvez Mego signifique que, ao definir (por exemplo) p,q=divmod(x,3);r,s=divmod(y,3), o Dhruv pode salvar bytes k(y//3-x//3)+k(y%3-x%3ao mudar para k(r-p)+k(s-q). Além disso, eu acho que você pode remover inte apenas se(max(x,y)%3==2)
Sherlock9
2
@ Sherlock9 A coisa é, p,q=x//3,x%3é sempre melhor do que p,q=divmod(x,3), mesmo em Python 3
Sp3000 22/16
1
@DrGreenEggsandHamDJ Os lambdas Python não suportam várias tarefas. Ele perderia muitos bytes sem essas definições.
Sherlock9
2

JavaScript (ES6), 59

Infelizmente, não divmodem javascript. De fato, nenhum número inteiro dive nenhum mod: o %não é exatamente mod. Mas, pela primeira vez, o comportamento estranho de %números negativos é útil.

(a,b,A=Math.abs)=>A(~(--a/3)-~(--b/3))+A(a%3-b%3)-(a*b%3<0)

Teste

f=(a,b,A=Math.abs)=>A(~(--a/3)-~(--b/3))+A(a%3-b%3)-(a*b%3<0)

for(i=0;i<10;console.log(r),i++)
  for(r='',j=0;j<10;j++)
    r+=[i,j,f(i,j)]+' '

edc65
fonte
Então, isso acaba sendo calculado como se estivesse 0à esquerda, em 1vez de abaixo dela, e então (a*b%3<0)é o ajuste furtivo do segundo 0. Agradável!
Neil
1

Pitão, 22 21 19 bytes

FGITW.

L.D?b+2b.5 3ssaMCyM

Suíte de teste.

Tabela de conversão:

0: [0.0, 0.5]
1: [1, 0]
2: [1, 1]
3: [1, 2]
4: [2, 0]
5: [2, 1]
6: [2, 2]
7: [3, 0]
8: [3, 1]
9: [3, 2]
Freira Furada
fonte
1

Julia, 56 bytes

x->sum(abs(-([[divrem(t>0?t+2:.5,3)...]for t=x]...)))÷1

Experimente online!

Dennis
fonte
1

Python 2, 61 bytes

lambda x,y:abs(x/-3-y/-3)+abs((x or 1.5)%-3-(y or 1.5)%-3)//1

Teste em Ideone .

Como funciona

  • Distância vertical

    Divisão inteira sempre volta para baixo para o número inteiro mais próximo em Python, produzindo os seguintes resultados para os 10 possíveis dividendos dividido pelo -3 .

     0  1  2  3  4  5  6  7  8  9
     0 -1 -1 -1 -2 -2 -2 -3 -3 -3

    Assim, podemos calcular a distância vertical entre x e y como abs(x/-3-y/-3).

  • Distância horizontal

    Para colunas, podemos evitar tratar 0 como um caso especial substituindo-o por 1,5 , colocando-o "entre" a primeira e a segunda coluna.

    O módulo ( %) sempre tem o sinal do divisor em Python, produzindo os seguintes resultados para o possível 10 módulo -3 de dividendos .

       0  1  2  3  4  5  6  7  8  9
    -1.5 -2 -1  0 -2 -1  0 -2 -1  0

    Assim, arredondando para baixo ( //1) o resultado de abs((x or 1.5)%-3-(y or 1.5)%-3), podemos calcular a diferença horizontal entre x e y .

Dennis
fonte
0

Java 149 160 caracteres

O obrigatório: Porque ... você sabe ... Java! Divertir-se com Java em menos de 150 161 caracteres:

int d(int f,int t){if(f==t)return 0;if(Math.min(f,t)==0){int m=Math.max(f,t);return Math.min(d(1,m),d(2,m))+1;}return Math.abs(--t%3- --f%3)+Math.abs(t/3-f/3);}

Ungolfed em uma classe:

public class Q80357 {

    static int distance(int from, int to) {
        if (from == to)
            return 0;
        if (Math.min(from, to) == 0) {
            int max = Math.max(from, to);
            return Math.min(distance(1, max), distance(2, max)) + 1;
        }
        return Math.abs(--to % 3 - --from % 3) + Math.abs(to / 3 - from / 3);
    }
}

Como funciona

Primeiro, ele captura o caso padrão em que não precisamos ir a lugar algum.

Agora, podemos assumir que ambos os números inteiros diferem, portanto, apenas o menor pode ser 0. Se esse for o caso, calculamos a distância da chave 1 e 2 à outra chave. Usaremos o de menor distância e adicionaremos uma etapa para passar de 1 ou 2 a 0.

Se não queremos ir de / para zero, precisamos apenas mover-nos na grade 3x3. Podemos determinar a coluna e a linha da chave usando mod ou div, respectivamente. Depois calculamos a distância da coluna e da linha e as adicionamos. Essa é a distância que precisamos percorrer de uma chave para outra.

Espero que a explicação possa ser entendida, fique à vontade para jogar golfe :)

Atualizações

Teve que alterá-lo para uma função real, pois usa recursão que não é possível com lambdas:, (

Frozn
fonte