Problema:
Você está criando um novo telefone em que as pessoas podem digitar números de telefone especializados, por exemplo 1-800-program
, e eles seriam convertidos automaticamente em um número de telefone utilizável, como 1-800-7764726
(no exemplo anterior).
Seu programa receberá uma string, se houver algum comprimento, com números, letras e traços, e converterá todas as letras em seus números correspondentes.
Aqui está um teclado, para referência:
Regras:
- Seu programa receberá uma string
- Ele processará e retornará / imprimirá outra string
- Qualquer idioma é aceito
- Como é código-golfe , o código mais curto ganha
Respostas:
GolfScript, 24 caracteres
Entrada de teste:
Saída de teste:
Explicação:
{ }%
aplica o código entre chaves a cada caractere da entrada..96>{ }*
executa o código entre chaves se e somente se o código ASCII do caractere for maior que 96 (ou seja, é uma letra minúscula).O primeiro
,
transforma o caractere em uma lista de todos os caracteres com códigos ASCII inferiores e91,'qx'+-
filtra todos os caracteres com códigos ASCII menores que 91, assim como as letrasq
ex
, da lista. Assim, por exemplo, o personagema
é transformado na lista de 6 caracteres[\]^_`
, enquantoz
é transformado na lista de 29 caracteres[\]^_`abcdefghijklmnoprstuvwy
.O segundo
,
conta os elementos restantes na lista e3/
divide essa contagem por três (arredondamento para baixo). Finalmente,`
transforma o número resultante (no intervalo de 2 a 9) em uma sequência.Assim, conforme as especificações, hífens e números permanecem inalterados, enquanto letras minúsculas são mapeadas em números de acordo com o diagrama do teclado de referência. O código vai realmente limpa passar por todos os caracteres ASCII imprimíveis exceto para letras minúsculas (que, como mapeadas como descrito) e os personagens
{
,|
e}
(que são mapeados para a string de dois caracteres10
). A entrada não-ASCII de 8 bits produzirá todos os tipos de saída numérica estranha.Depois de tudo isso, é um pouco decepcionante que isso só supere a solução trivial do bash em apenas seis caracteres.
fonte
Bash, 30
Edit: Obrigado Maçaneta por eliminar 3 caracteres
Exemplo:
fonte
9
s?C,
837877656362http://ideone.com/qMsIFQ
fonte
~(c=getchar())
getch()
vez degetchar()
?getch()
não é o padrão C, como resultado, acho que não está vinculado ao ideone. De qualquer forma, eu testei no MSVC e ele realmente não funciona tristemente - como consome diretamente a entrada do teclado, não há como sair do programa, embora traduza o que você digita em tempo real, o que é bem legal.Javascript - 103 caracteres
fonte
charCodeAt(0)
porcharCodeAt()
e você pode usar a função de seta parafunction(y)...
economizar alguns bytes e para~~(y/3)
você poder usary/3|0
Ruby, 75 caracteres
Usa o
chars
bloco obsoleto com e imprime cada letra individualmente com$><<
. Eu também gosto[[*?a..?z].index(c)||-1]
; ele pega o caractere correspondente à letra do alfabeto, se for uma letra, e o último caractere (que passa a ser o caractere de teste inalterado), se não for.Ruby, 43 (ou 35) caracteres
Roubando descaradamente de @ace;)
Raspe 8 caracteres se eu puder executar no IRB com a variável
s
como a string:fonte
C ++ - 222 caracteres
Solução mais longa até agora:
fonte
Frink, 92
Uma linguagem bastante detalhada, eu sei. Isso verifica 8 valores em vez de 26 sem precisar digitar as comparações. Qualquer uma das soluções "222333444 .." acima pode ser reduzida de maneira semelhante?
Usando estruturas embutidas, 107
Usando uma função recursiva personalizada, 92
fonte
Smalltalk,
7970entrada é s:
provavelmente não é candidato por ser o mais baixo - mas pode ser interessante para um truque antigo para evitar um teste para uma condição não encontrada (indexOf: retorna 0 nesse caso). Portanto, nenhum teste especial para letras é necessário. Alguns Smalltalks, no entanto, têm seqüências imutáveis, e precisamos de mais 4 caracteres ("cópia").
Ah, uma versão melhor, que até lida com seqüências imutáveis em 70 caracteres:
fonte
Mathematica 90
Isso segue a lógica da solução do @ ace:
Exemplo
fonte
1
em#1
:)1
. Ainda 90 caracteres, mas cortar e colar irá funcionar. Você entende, é claro, a motivação para usar a seta de caractere único.Perl, 50
Outra cópia óbvia da resposta do bash de Ace
fonte
-p
switch, que permite que você passe por cada linha de stdin. Enquanto estamos nisso, o intervalo em y /// não precisa ser colocado entre colchetes. Também podemos nos livrar de três 9s, deixando apenas um e remover o ponto-e-vírgula final:-p y/a-z/22233344455566677778889/
Pronto, 30 + 1 para-p
. Obrigado por usar os Serviços de Otimização e Golfe Enterprise Perl da China e tenha um bom dia.R, muito longo, mas divertido
fonte
k [32 caracteres]
Uso
fonte
JavaScript, 85
O JavaScript nunca vai vencer as guerras do golfe, mas eu gosto e queria fazer algo diferente do que pular na onda @ace.
fonte
PHP, 141
Não é o mais curto, mas mais divertido:
Mais legível:
fonte
strtolower
Python 2.7, 80
Eu sou novo em python, então tenho certeza de que deve haver uma maneira de jogar isso ainda mais , é uma abordagem diferente, espero que vocês gostem, meu deus, é bonito em python!
Execute o exemplo:
fonte
T-SQL, 216 bytes
Passei bastante tempo nas últimas duas noites criando meticulosamente uma função de sequência matemática que seria arredondada corretamente para gerar os códigos ASCII adequados para os números dos códigos ASCII alfabéticos. Tinha um número ridículo de casas decimais nos coeficientes, mas funcionou.
No entanto, a abordagem racional de mattnewport também funciona em SQL, a um custo muito menor de bytes, então estou descaradamente descarrilando minha própria matemática em favor da dele. Suba para votar nele, é uma solução elegante!
Aqui está o meu:
Isso usa um CTE recursivo para criar uma pilha de caracteres improvisados no número de telefone e traduzir as letras rapidamente, depois um pouco de truque SQL (SELECT @ p = @ p + columnValue) para recompor a sequência do CTE sem exigir outra construção de recursão.
Saída:
fonte
Python 2.7,
6665Anakata's Original
Mais golfed
Como não tenho reputação suficiente para comentar a resposta de @ anakata, fiz um post separado aqui. Eu tive a mesma idéia (fazendo o módulo 3 da ordenança), mas não consegui descobrir como imprimir os números certos para s-z .
Enfim, as melhorias de golfe que fiz:
alterado
raw_input
parainput
removeu os nomes estranhos
'\b'
e parênteses e aspas simplesremoveu o
+2
deslocamento e o colocou na subtração original (97 - (3 * 2) = 91)Testado com o intérprete Python 2.7.6. Supõe, de acordo com as regras, uma entrada de sequência.
fonte
PHP, 87
fonte
q [38 caracteres]
Inspirado na solução da @ ace
Exemplo
fonte
XQuery, 71
O BaseX foi usado como processador XQuery.
$i
é entrada.Não é a resposta mais curta, mas bastante curta e muito legível.
fonte
Python, muito ungolfed
Como todo mundo está copiando o ás, decidi postar o código que criei antes de enviar a pergunta:
fonte
EcmaScript 6 (103 bytes):
Espera
i
conter a sequência.Experimente em qualquer versão recente do Firefox. Eu não experimentei o Google Chrome.
fonte
Python 3, 121
fonte
Haskell, 93C
Uso
fonte
C # 140
fonte
Python
fonte
ECMASCRIPT, 101 (com entrada)
Nova linha adicionada para maior clareza. 85 caracteres se a entrada estiver em uma variável.
fonte
Perl, 54
Atire, @RobHoare ainda me venceu por 4 caracteres. :)
fonte
QBasic, 155
Ah, as memórias ...
Isso deveria ter sido mais curto, mas eu estava testando com repl.it , que não permite
IF
instruções de linha única e se comporta de maneira estranha se você deixar a variável desativadaNEXT i
. Ele também não reconhece aASC
função, portanto, para executar o código, você precisará adicionar esta solução alternativa no início:(Na segunda vez em que você o executar, o intérprete reclamará, a menos que você remova a
DECLARE FUNCTION
linha, siga em frente.)fonte
R, 110
Exemplo:
fonte