Estamos todos acostumados com o teclado do telefone da velha escola, certo? Para referência, aqui está o que parece:
Dada uma String que consiste apenas em letras ASCII minúsculas e espaços únicos , sua tarefa é retornar o número de toques que você deve fazer para digitar a String completa com um teclado de telefone como o descrito acima.
Para aqueles que não estão familiarizados com isso, veja como funciona:
A tecla com o dígito
2
, por exemplo, também possui a stringabc
escrita nela. Para digitara
, você deve pressionar essa tecla uma vez, poisb
deve pressionar duas vezes ec
pressionar três vezes.Para letras consecutivas que estão na mesma tecla, você deve esperar 1 segundo antes de pressionar novamente. Portanto, se você quiser digitar
cb
, pressione 3 vezesc
, aguarde um segundo e depois pressione duas vezesb
, para continuar com 5 toques.O mesmo se aplica a todas as outras teclas, exceto um espaço único , que requer apenas 1 toque. Observe também as teclas
7
e9
tem quatro letras nelas. O mesmo algoritmo é aplicado, a única diferença é o número de letras. As seqüências correspondentes a cada chave podem ser encontradas na imagem acima (mas em minúsculas) ou na lista a seguir, que contém todos os caracteres que você pode receber:"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz", " "
Casos de teste
Entrada -> Saída (Explicação) "" -> 0 (nada deve ser tocado) "água" -> 8 ("w, a, t" exige 1 torneira (nas teclas 9, 2 e 8), "e" requer 2 torneiras (na tecla 3), "r" requer 3 torneiras (na tecla 7 ), 1 + 1 + 1 + 2 + 3 = 8) "sabão" -> 9 (4 + 3 + 1 + 1) "candela" -> 13 (3 + 1 + 2 + 1 + 2 + 3 + 1) "código de golfe" -> 20 (3 + 3 + 1 + 2 + 1 (para o espaço) + 1 + 3 + 3 + 3) "rei da colina" -> 33 (2 + 3 + 2 + 1 + 1 + 3 + 3 + 1 + 1 + 2 + 2 + 1 + 2 + 3 + 3 + 3)
Especificações
Aplicam-se as regras de E / S padrão e as brechas padrão.
Você pode receber apenas entradas no tipo String nativo do seu idioma. A saída pode ser um número inteiro ou uma representação de sequência desse número inteiro.
Este é o código-golfe , a resposta mais curta em todos os idiomas vence.
Respostas:
JavaScript (ES6)
77666460 bytes(Economizou alguns bytes graças a @Johan Karlsson e @Arnauld).
Mostrar snippet de código
fonte
(s,t=0)=>[...s].map(l=>t+=(1+'behknquxcfilorvysz'.indexOf(l)/8|0)+1)&&t
para 71 bytesf=s=>[...s].map(c=>t+=((c=parseInt(0+c,36))>23?c+3:c&&~-c%3)%7%4+1,t=0)|t
.05AB1E ,
292625 bytesExperimente online!
Explicação
fonte
Python 2 , 56 bytes
Usa o mesmo algoritmo da solução Javascript de @ RickHitchcock
Experimente online!
fonte
'...'.find(c)
retorna-1
. Ao adicionar 2, obtemos um pressionamento de tecla.-1
, mas não percebi que você tinha um+2
clichê posterior ... Enfim, a solução Python mais curta de longe.Python 3 ,
69676564 bytes1 byte graças ao Sr. Xcoder.
1 byte graças a Felipe Nardi Batista.
Experimente online!
fonte
i==" "
comi<"a"
, porque você só recebe letras e espaçosDyalog APL, 37 bytes
Experimente online!
Quão?
Obtenha o
⍳
ndex de cada caractere de entrada na string'adgjmptw behknqux~cfilorvy~'
(s
ez
o padrão será 28), divida por 9, arredonde e some.fonte
'adgjmptw ' 'behknqux' 'cfilorvy' 'sz'
para salvar alguns bytesf←
portanto são 47 bytes #JavaScript (ES6), 71 bytes
Não procure tabelas de letras! Eu não entendi direito a fórmula do @ LeakyNun, então criei a minha.
fonte
s=>[...s]
faz porque não apenass=>s.map()...
s
é uma string, então você não podemap
diretamente....s
iteras
, enquanto[...s]
converte a iteração em uma matriz, dividindo-se efetivamentes
em uma matriz de caracteres.C,
211196 bytesA primeira submissão aqui ... parece bastante longa e vejo que essa não é uma abordagem eficiente, mas pelo menos funciona :)
Versão não destruída:
fonte
*(k+i)
pode serk[i]
.*
(por exemplochar*n
), e adicionar as suas declarações para o seu vaziofor
declaração (em vez deint s=0,j=0;(for(;
você teriafor(int s=0,k=0;
) e em vez dei==0
uso!i
s
no loop for porque o uso mais tarde, mas juntei asint
declarações e usei atribuições onde precisava delas.Haskell -
747162 bytesEditar: removido 3 bytes usando uma compreensão de lista em vez de filtro
Edit: Economize 9 bytes graças a Siracusa, Laikoni e Zgarb!
Uso
Experimente online!
fonte
f
paraf=length.(=<<)(\x->x:[y|y<-l,y==x])
, onde(=<<)
estáconcatMap
aqui.filter
:f=length.(=<<)(\x->x:filter(==x)l)
l
apenas uma vez, ele pode ser incorporado.Gelatina , 25 bytes
Experimente online!
fonte
Clojure,
8276 bytesOh, é mais simples de usar
filter
ecount
de usarfrequencies
. Original:A string codifica quantas vezes mais do que apenas uma vez você precisa pressionar a tecla para um determinado caractere :)
fonte
Python 3 , 91 bytes
Experimente online!
fonte
Python 3 , 60 bytes
Provavelmente abaixo do ideal, pois este é o meu primeiro golfe em Python.
Experimente online!
fonte
Retina ,
4636 bytesObrigado ao CalculatorFeline por salvar 6 bytes.
Experimente online!
fonte
Java,
9573 bytesObrigado a Kevin Cruijssen por tornar a função uma expressão lambda (onde
a
é do tipoString
). 95 bytes se tornaram 73 bytes!Uma expressão lambda resume a contagem de imprensa de cada caractere usando
map()
.map()
converte cada caractere (ASCII em baixa gama caso é 97-122) no fluxo para o valor apropriado (parece onda serra simples, mas tendo em conta ambos os 4 ciclos é irritante) usando essa matemática:1+(b<64?0:b+(Math.abs(b-115)<4?4:5))%(3+b/112)
. Aqui está um gráfico de desmos desse modelo.fonte
interface Z{static void main(String a){System.out.print(a.chars().map(b->1+(b<64?0:b+(Math.abs(b-115)<4?4:5))%(3+b/112)).sum());}}
a->{return a.chars().map(b->1+(b<64?0:b+(Math.abs(b-115)<4?4:5))%(3+b/112)).sum();}
é permitido. E como é uma única declaração de retorno,a->a.chars().map(b->1+(b<64?0:b+(Math.abs(b-115)<4?4:5))%(3+b/112)).sum()
( 73 bytes ) seria sua resposta. Além disso, aqui está um link TryItOnline da sua resposta que você pode adicionar à sua resposta. Mais uma vez: bem-vinda e boa resposta. +1 de mim.f=
nem o ponto e vírgula principal;
. E você também não precisa adicionar o tipo do parâmetro, desde que mencione qual é o tipo (portanto, em vez de(String a)->
poder usara->
e mencionar que a entradaa
é umString
na sua resposta). Ah, e Dicas para jogar golfe em Java e Dicas para jogar golfe em <todos os idiomas> podem ser interessantes para ler, caso você ainda não o tenha feito.Mathematica, 83 bytes
fonte
a
falta no início da"bc1..."
?)QBIC , 94 bytes
Explicação
fonte
Bash ,
6968 bytesExperimente online!
Dobra um caracter por linha, translitera cada nova linha com
+
, cada espaço com1
e cada letra com o número correspondente de toques. bc faz a soma.fonte
bc <(fold -1|tr "\n "adgjmptwbehknquxcfilorvysz +[1*9][2*8][3*8]44;echo 0)
C,
9288 bytesfonte
s=n
para substituirreturn n
e combinars++;
comc=*s
. Pode ser 9 bytes mais curto.s=n
não funcionaria, já ques
é local. E*s=n
não funcionaria, pois existem apenasCHAR_BIT
bits*s
, o que não seria suficiente para algumas mensagens. Mas você está certo sobre os++
. Obrigado.APL (Dyalog) , 36 bytes
Experimente online!
Encontrados os mod 3-índices no alfabeto sem S e Z . Como espaço, S e Z não são encontrados, eles "têm" o índice 25 (um a mais que o índice máximo), o que é bom para o espaço. Então nós só precisa adicionar 3 para cada S ou Z .
{
função anônima em que o argumento é representado por ⍵ :⎕A~'SZ'
o alfabeto A maiúsculo , exceto S e Z819⌶
minúsculas⍵⍳⍨
os índices do argumento em que¯1+
adicione um negativo3|
mod-31+
adicione um (isso converte todos os 0-mods em 3)(
…),
Prepend:⍵∊'sz'
Booleano em que o argumento é s ou z3×
multiplicar por 3+/
somafonte
C (gcc), 75
77bytesThe unprintable string
""
is a table of04 01 02 03 01 02 03 04
.Try it online!
fonte
Pip,
10090 bytesCheck each character of the input for a match in each element of b. The index of that match plus 1 gets added to the total.
Try it online!
fonte