Inspirado no Google Code Challenge :
O alfabeto latino contém 26 caracteres e os telefones possuem apenas dez dígitos no teclado. Gostaríamos de facilitar a gravação de uma mensagem para seu amigo usando uma sequência de pressionamentos de tecla para indicar os caracteres desejados. As letras são mapeadas para os dígitos, como mostrado abaixo. Para inserir o caractere B, por exemplo, o programa pressionaria 22. Para inserir dois caracteres em sequência da mesma tecla, o usuário deve fazer uma pausa antes de pressionar a tecla uma segunda vez. O caractere de espaço '' deve ser impresso para indicar uma pausa. Por exemplo, 2 2 indica AA enquanto 22 indica B.
Cada mensagem consistirá apenas em caracteres minúsculos az e caracteres de espaço ''. Pressionar zero emite um espaço.
Seu desafio é escrever a menor função que pega a string de entrada e retorna a sequência de pressionamentos de tecla necessários para produzir a entrada como string ou enviá-la para stdout. A função com a menor quantidade de bytes vence.
Exemplo de entrada / saída
phone("hi")
44 444
phone("hello world")
4433555 555666096667775553
Outros esclarecimentos
- As pausas devem ser adicionadas apenas quando necessário e devem ser um espaço ''.
- Cada mensagem consistirá apenas em caracteres minúsculos az e caracteres de espaço ''. Imprima
0
para significar espaços. - Nenhuma biblioteca externa.
- Somente a string de entrada pode ser passada para sua função.
- Para tornar outros idiomas competitivos, a declaração da função principal não conta e nem importa outras bibliotecas padrão.
#include
s, seimport
esusing
não contam. Tudo o resto faz. Isso inclui#define
funções se e auxiliar. Veja a regra 2 nesta pergunta se você estiver confuso. - Vários espaços podem ser indicados como
00
ou0 0
já que você realmente não precisa fazer uma pausa entre um espaço
{}
parte da assinatura da função? Por exemplo, se meu código forfunction f(){alert('hi');}
, devo contar os caracteres dealert('hi');
ou{alert('hi');}
?t9
funciona de maneira diferente: você precisa clicar em cada tecla uma vez para obter uma palavra.Respostas:
Rubi,
129122115111108107105Feito com golfe ...
Ops, esqueci completamente de remover espaços desnecessários - ...
Guardado 2 caracteres graças a Peter Taylor.
Versão online
Explicação:
espaço é traduzido para o char com o ordinal 96
os caracteres são mapeados primeiro para uma série de números: - a a 2 - b a 22 - d a 3222 - h a 444333222
uma expressão regex corresponde ao primeiro grupo de dígitos iguais
a matriz está unida
todos os espaços nas ocorrências de "espaço com dígitos diferentes_dígitos" são removidos
fonte
6666
6 não precisa ser pressionado 4 vezes seguidas.\2
desse regex final? Certamente o segundo grupo é uma afirmação de largura zero?REBEL -
154110103Esta 'função' aceita entrada do stdin e envia resultados para o stdout.
Execuções de teste (para que você não precise instalar o intérprete):
fonte
JavaScript (124)
Execute no Firefox.
fonte
GolfScript, 46 caracteres
Como de costume, lê as entradas de stdin, imprime em stdout. Veja demonstração on-line (com entrada em lata).
Observe que este código se baseia em uma interpretação muito rigorosa da especificação de entrada (apenas letras minúsculas e espaços): em particular, qualquer nova linha na entrada o trava! Esse problema pode ser corrigido, ao custo de dois caracteres extras, anexando
n-
o código para filtrar as novas linhas.fonte
C ++ - 365 caracteres sem
int main(){}
Usa o mesmo raciocínio da minha resposta aqui , usando apenas
for
loops para gerar cada letra o número apropriado de vezes.fonte
s[i]==32
vez des[i]==' '
. O valor ASCII do espaço é 32.Perl - 107
110Aqui está minha solução anterior em 120
128 130 155:Testes:
fonte
VBA
220253/258/219Não contando
Function
linhas aqui:Com
String
, 253 :Com um
For
loop 258 :Correções adicionadas à tecla 7/9 (obrigado, Danny), que adicionaram muitos caracteres.
Usando
Choose
219 :Eu não queria rodar com este, pois é mais básico em funcionalidade, mas é o código mais curto ...
fonte
yes
deveria ser999337777
. Eu10338
uso sua função.C,
165 163 153 149138 caracteresMinha primeira tentativa no código de golfe, todas as sugestões são apreciadas.
fonte
C ++ -
170168160Golfe:
Ungolfed
fonte
C: 136 caracteres
E um pouco não-destruído (sim, é assim que foi escrito):
Talvez eu consiga reduzir um pouco aplicando alguma recursão, magia negra e uma boa quantidade de pimenta em pó.
fonte
Java - 243
Solução java bastante ingênua. Obrigado aos comentadores por sugestões.
Corrigido um erro que algumas vezes inseria espaços desnecessários, por exemplo, para a entrada "hello worlds sup".
fonte
java
. Você pode colocar isso em sua posição, como as outras respostas?t.length
por10
i
é usado apenas para iterar através doString
, remova-o e faça um loop foreach:for(char c:s.toCharArray())
if(c==' '){o+='0';continue;}
paraif(c==' ')o+='0';else{
e adicionar o apropriado}
.CoffeeScript - 202 (210 - 8)
fonte
APL, 77 caracteres
Explicação
2+⌊y←7.99,⍨.315×⍳25
ou, sem ser golpeado,y←(0.315×⍳25),7.99 ◇ 2+⌊y
mostra uma linha adequadamente inclinada (y = 0,315 x) nos pontos de 1 a 25; a linha é inclinada de forma que o piso desses valores y siga o padrão de repetição 000111 ... 777, exceto o sexto grupo de dígitos 5555; um número é anexado no final para obter o quarto 7, para que a matriz final mais 2 seja 22233344455566677778889999;⌈3.1×y-⌊y
amplifica a diferença entre esses valores y e seus pisos, de modo que os limites máximos das diferenças dêem o padrão 123123 ... com um 4 nos últimos dígitos dos dois grupos de 4 dígitos;'0',⍨( ... )/¨⍕¨ ...
ou(( ... ) /¨ ⍕¨ ...),'0'
usa o último resultado para duplicar dígitos do anterior, de modo que a saída seja a matriz de cadeias "2" "22" "222" "3" "33" "333" ... com os "7777" e "corretos" 9999 "no lugar e um" 0 "anexado ao final;⍵⍳⍨⎕UCS 96+⍳26
ou(⎕UCS 96+⍳26)⍳⍵
calcula o índice de cada caractere de entrada, onde "a" é 1, "z" é 26 e o espaço (e todos os outros caracteres) é 27;{ ... }/( ... )[ ... ]
pega o último resultado, o índice de cada caractere de entrada, para converter cada caractere na respectiva sequência de dígitos e concatena as sequências usando a função entre chaves;{⍵,⍨⍺,''↑⍨=/↑¨⍺⍵}
ou{(⍺,(=/↑¨⍺,⍵)↑''),⍵}
anexa cada nova string ⍺ ao acumulador ⍵, interpondo um único espaço apenas se os dois argumentos começarem com o mesmo caractere.Exemplos
fonte
Python
155150Eu gostaria de ser melhor neste XD. Definição de função não contada. O primeiro nível de indentação é um espaço, o segundo é uma guia e as terceiras 2 guias.
fonte
JavaScript 234
for(l=-1,r="",I=0,y=(s=prompt()).length;I<y;I++){c=s[I];n="";d=c.charCodeAt(0)-96;if(0>d)n=0;else for(k=J=0;J<8;k=++J){v="33333434"[k];if(d<=v){for(x=K=0;0<=d?K<d:K>d;x=0<=d?++K:--K)n+=k+2;break}d-=v}r+=n[0]==l[0]?" "+n:n;l=n}alert(r)
fonte
R 224
Tenho certeza de que há uma maneira melhor de fazer isso, então continuarei trabalhando nisso.
fonte