Desafio
Dada a entrada de uma seqüência de letras minúsculas [a-z]
, produza a distância total entre as letras.
Exemplo
Input: golf
Distance from g to o : 8
Distance from o to l : 3
Distance from l to f : 6
Output: 17
Regras
- Lacunas padrão proibidas
- Este é o código-golfe - a resposta mais curta em bytes ganha.
- O alfabeto pode ser deslocado de qualquer direção. Você sempre deve usar o caminho mais curto. (ou seja, a distância entre
x
ec
é 5).
Casos de teste
Input: aa
Output: 0
Input: stack
Output: 18
Input: zaza
Output: 3
Input: valleys
Output: 35
code-golf
string
number
arithmetic
Daniel
fonte
fonte
æ%
while reading through the built-ins the other day, and it was pretty much made for this (type of) problem:OIæ%13AS
æ
são dois).Haskell,
5756 bytesExemplo de uso:
sum.q.q.(zipWith(-)=<<tail).map fromEnum $ "valleys"
->35
.Como funciona:
Edit: @Damien salvou um byte. Obrigado!
fonte
q.q
) #map
na definição deq
um byte a menos #MATL ,
14, 10 bytesExperimente online!
Obrigado @Suever por salvar 4 bytes!
Explicação:
Versão anterior:
fonte
Python 3,
6968 bytesDemolir:
fonte
for
f=lambda a,b,*s:13-abs(13-abs(ord(a)-ord(b)))+(s and f(b,*s)or 0)
Java,
126120117 bytesAgradecemos a @KevinCruijssen por apontar um bug na versão original e sugerir que o loop for fique vazio.
O uso de
(26 + z[i] - z[i - 1]) % 26)
é inspirado em um comentário de @Neil em outra resposta.(26 + ...)%26
serve ao mesmo propósito queMath.abs(...)
por causa de...? e : 26 - e
.Ungolfed :
fonte
[edit] those details into the top of your post, with this markdown:
#Language, n bytes` #-
antes de ume
na sua versão não-destruída.e=z[i]-z[i-1];
Então, você precisa de uma conversão para(byte)
ou para alterare
paraint
. Além disso, você pode remover os suportes para-circuito, colocando tudo dentro do loop for, como este:int f(String s){byte[]z=s.getBytes();int r=0,i=0,e;for(;++i<z.length;r+=(e=z[i]-z[i-1])>0?e<14?e:26-e:-e<14?-e:e+26);return r;}
(PS: O inverteu o ciclo for é, infelizmente, o mesmo comprimento:int f(String s){byte[]z=s.getBytes();int r=0,i=z.length-1,e;for(;i>0;r+=(e=z[i]-z[--i])>0?e<14?e:26-e:-e<14?-e:e+26);return r;}
.JavaScript (ES6),
848279 bytesEconomizou 3 bytes graças a Cyoce:
Explicação:
Exemplo:
Chamada:
f('golf')
Saída:
17
Soluções anteriores:
82 bytes graças a Neil:
84 bytes:
fonte
Math.abs(...)
você pode usar(26+...)%26
; isso funciona porque você está invertendo valores acima de 13 de qualquer maneira. (Acho que é assim que a resposta MATL funciona.)p=parseInt;
e, em seguida, usando emp()
vez deparseInt()
Ruby, 73 bytes
fonte
PHP, 93 bytes
fonte
05AB1E , 12 bytes
Explicação
Experimente online!
fonte
Perl, 46 bytes
Inclui +3 para
-p
(o código contém'
)Dê entrada no STDIN sem nova linha final:
stringd.pl
:fonte
Raquete 119 bytes
Teste:
Saída:
Versão detalhada:
fonte
(define(f s)
por(lambda(s)
2 bytes mais curtos (funções anônimas são boas).(λ(s)
, o que, se em utf8 for de 6 bytes, pensoC #,
8785 bytesSolução aprimorada - substituiu Math.Abs () pelo truque add & modulo para economizar 2 bytes:
Solução inicial :
Experimente online!
Fonte completa, incluindo casos de teste:
fonte
Na verdade, 21 bytes
Baseado parcialmente na resposta Ruby de cia_rana .
Houve um erro com
O
(nesse caso, map ord () sobre uma string) em que ele não funcionaria comd
(desenfileirar o elemento bottom) ep
(pop primeiro elemento) sem primeiro converter o mapa em uma lista com#
. Este bug foi corrigido, mas como essa correção é mais recente que esse desafio, eu continuei#
.Edit: E a contagem de bytes está errada desde setembro. Ops.
Sugestões de golfe são bem-vindas. Experimente online!
Ungolfing
fonte
Java 7.128 bytes
Ungolfed
fonte
Pitão, 20 bytes
Um programa que recebe a entrada de uma string entre aspas no STDIN e imprime o resultado.
Experimente online
Como funciona
fonte
dc + od, 65 bytes
Explicação:
Como no dc você não pode acessar os caracteres de uma string, usei od para obter os valores ASCII. Estes serão processados na ordem inversa a partir da pilha (contêiner LIFO) da seguinte forma:
Corre:
Saída:
fonte
C,
82 86 8376 bytesSupõe que a sequência de entrada tenha pelo menos um caractere. Isso não requer
#include<stdlib.h>
Edit: Argh, pontos de sequência!
Experimente no Ideone
fonte
C, 70 bytes
76 bytesfonte
Scala, 68 bytes
Críticas são bem-vindas.
fonte
C #, 217 bytes
Golfe:
Ungolfed:
Saída:
'a' é 97 quando convertido em bytes; portanto, 97 é subtraído de cada um. Se a diferença for maior que 13 (ou seja, metade do alfabeto), subtraia as diferenças entre cada caractere (valor de bytes) de 26. Uma adição de última hora de "yield return" me salvou alguns bytes!
fonte
Python 3, 126 bytes
Com lista na compreensão.
fonte
abs(x-y)
pory-x
desde a chamada asorted
fazerx < y
.PHP, 79 bytes
fonte
Java, 109 bytes
fonte