Introdução
Clarence é um funcionário de entrada de dados que trabalha em um provedor de serviços de Internet. Seu trabalho é inserir manualmente os endereços IP de todos os clientes do ISP no banco de dados. Ele faz isso usando um teclado com o seguinte layout:
1
2
3
4
5
6
7
8
9
.
0
A distância entre o centro das teclas adjacentes na horizontal ou na vertical é exatamente de um centímetro. Por exemplo, a distância entre os centros de 3e 9seria de dois centímetros. A distância entre os centros de 3e 5seria √2cm. O teorema de Pitágoras é suficiente para calcular a distância entre duas chaves.
Clarence, como você pode esperar de quem trabalha em um ISP, usa um sistema de digitação muito lento e ineficiente. Ele usa um único dedo e procura a tecla, depois move o dedo para a tecla, pressiona e repete para todos os dígitos do número. Você pode conhecer esse estilo como o "sistema de pesquisa de águia", já que o dedo procura acima do teclado a tecla correta antes de mergulhar no pressionamento de tecla, como uma águia mergulhando para matar.
Por exemplo, aqui está como o Clarence digitaria o número 7851
:
- Ele começa o dedo 7e aperta a tecla.
- Ele move o dedo para a direita 1cm 8e pressiona a tecla.
- Ele move o dedo para cima 1cm 5e pressiona a tecla.
- Ele move o dedo na diagonal para cima e deixa √2cm 1e pressiona a tecla.
Portanto, a distância total que Clarence moveu seu dedo para digitar 7851
é 1 + 1 + √2
que é cerca de 3,41 centímetros.
Sua tarefa é escrever um programa que calcule a distância que Clarence deve mover o dedo para digitar endereços IP arbitrários.
Descrição da entrada
Entrada é uma sequência que estará no formato
().().().()
onde cada ()
um é um número inteiro no intervalo 0
- 999
. Isso representa o endereço IP que o Clarence deve digitar. Um exemplo de entrada pode ser:
219.45.143.143
Também gostaria de salientar que entradas como 0.42.42.42
ou 999.999.999.999
ainda são válidas, apesar de serem endereços IP inválidos. Portanto, você não precisa incluir nenhum código de verificação de endereço IP no seu programa.
Descrição da saída
Saída a distância que Clarence deve mover o dedo para digitar o endereço IP especificado. Arredonde as respostas para duas casas decimais, quando necessário, e use a cm
unidade em sua saída. A saída para a entrada de exemplo é 27.38cm
(1 + √8 + √5 + 2 + 1 + √5 + 3 + 1 + √5 + √13 + 3 + 1 + √5).
Respostas:
CJam,
464443383734 bytesObrigado a @ user23013 por sugerir
mh
, o que possibilitou salvar 5 bytes.Experimente online no intérprete CJam .
Como funciona
fonte
{3fmd~@-@@-mh}%
.mh
existisse.Pitão,
383534 bytesDemonstração.
Indexando a sequência de uma ideia de flutuação graças a @Dennis.
Explicação, na entrada falsa
15.0
:z
. '15 .0 'Mapeamos esta lista da seguinte forma:
m.jF.Dx`ciUTT1k3z
.UT
: Geramos a lista[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
.iUTT
: Em seguida, tratamos esta lista como um número base 10, fornecendo-nos123456789
.ciUTT1
: Em seguida, convertemos esse número em um ponto flutuante pelo ponto flutuante, dividindo-o por 1, dando123456789.0
.`
: Converte em uma sequência.'123456789.0'
x k
: Pegue o índice do caractere de entrada nessa sequência.[0, 4, 9, 10]
..D 3
:.D
é a função divmod, emitindo sua primeira entrada dividida e modulada pela segunda entrada. A segunda entrada é 3, aqui. Isso fornece a localização física do personagem no teclado numérico.[(0, 0), (1, 1), (3, 0), (3, 1)]
..jF
:.j
é o construtor de números complexos.F
aplica-o à tupla.[0j, (1+1j), (3+0j), (3+1j)]
..: 2
: Agora, pegamos as 2 substrings de entrada desta lista para encontrar as distâncias aos pares.[[0j, (1+1j)], [(1+1j), (3+0j)], [(3+0j), (3+1j)]]
.-M
: Toma a diferença dos dois números complexos.[(-1-1j), (-2+1j), -1j]
..aM
: Pega o valor absoluto do resultado. Esta é a distância entre os locais do teclado.[1.4142135623730951, 2.23606797749979, 1.0]
s
: Soma as distâncias.4.650281539872885
..R 2
: Arredonde para 2 casas decimais.4.65
.+ "cm
: Adicione'cm'
no final e imprima.4.65cm
.fonte
PHP - 108 bytes
A entrada é retirada do stdin. O
-.987654321
enviado para astrpos
função é avaliado'-0.987654321'
em um contexto de sequência.Uso da amostra:
fonte
C,
192177159 bytesVersão atualizada, agora complete o programa usando o argumento de linha de comando. Ao mesmo tempo, aprimorado para ainda ser menor que a versão anterior:
Ungolfed:
A versão golfed usa um pré
#define
- processador para encurtar parte do código repetido na versão completa.fonte
s
antes de verificar que*s
não é zero. 3. O OP disse programa em seu post. Não tenho certeza se uma função é aceita. 4. Com o GCC, você não precisa da inclusão. 5.sqrt
é menor do quesqrtf
. 6.pow(u-p,2)
é menor do que(u-p)*(u-p)
. 7. Não tenho certeza, mas acho que armazenar as duas coordenadas em uma única string e configuraçãou=x[c]/3
ev=x[c]%3
deve ser mais curta.int
poderiam ser usadas não declaradas. Mas, de fato, o clang também aceita isso com um aviso, então me livrei dele.p=u,q=v,G,r+=...
.JavaScript ( ES6 ), 132
E / S via pop-up. Execute o trecho para testar (apenas Firefox)
fonte
Python 3, 108 bytes
É certo que não muito bem jogado, mas pelo menos ele se relaciona com o PHP.
fonte
Ruby 135
139Teste on-line: http://ideone.com/2CIQa5
fonte
Python
199 171166Existe um código Python mais curto (108) para isso no SP3000:
https://codegolf.stackexchange.com/a/50854/41163
Uso da amostra:
Execute on-line: http://codepad.org/h9CWCBNO
Código comentado
fonte
if
cláusulas em uma linha, comoif i<1:c=3,1
<!-- language: lang-python -->