O Duolingo, o aplicativo de aprendizado de idiomas, tem muitas coisas a seu favor, mas há uma questão importante que me deixa louca. Ele me diz quantos dias seguidos eu usei o aplicativo com uma mensagem como Você está em uma sequência de 7 dias! Deixando de lado a hifenização e se o número deve ser digitado, isso funciona bem para a maioria dos números, mas é indiscutivelmente errado quando diz que você está em uma sequência de 8 dias! Não estou usando para aprender inglês, mas esse ainda é um comportamento infeliz para um aplicativo de idioma.
Você ajudará a equipe do Duolingo escrevendo um programa ou função completa que calcula se um determinado número deve ser precedido por um ou um . Um número é precedido por a se sua pronúncia no inglês falado começar com um som consoante ou semivogal e precedido por um se sua pronúncia começar com um som com vogal. Assim, os únicos números precedidos por um são aqueles cuja pronúncia começa com oito , onze , dezoito ou oitenta .
Presumivelmente, a equipe de desenvolvedores do Duolingo deixou esse bug porque ficou sem espaço para obter mais código-fonte no aplicativo, então você precisa torná-lo o mais curto possível, na esperança de que eles possam extraí-lo.
Seu código deve levar um número inteiro de 0 a 2.147.483.647 e gerar a
ou an
. Uma nova linha à direita é opcional. Para os propósitos deste desafio, 1863 é lido como mil oitocentos e sessenta e três , e não mil e oitocentos e sessenta e três .
Casos de teste:
0 → a
8 → an
11 → an
18 → an
84 → an
110 → a
843 → an
1111 → a
1863 → a
8192 → an
11000 → an
18000 → an
110000 → a
180000 → a
1141592 → a
1897932 → a
11234567 → an
18675309 → an
Respostas:
Pitão, 23 bytes
Isso seleciona quantas letras devem ser cortadas no final
"an"
, verificando se a primeira letra não é um8
e se o primeiro dígito do número, quando considerado na base 1000, não é 11 nem 18. O booleano resultante é o número de caracteres para fatiar o fim.fonte
Python 2, 60 bytes
Uma função anônima. Adiciona um
n
se:fonte
n
> = '8' 'salva três bytes.GNU Sed, 32
A pontuação inclui +1 para a
-E
opção sed.Experimente online.
an
a
Obrigado a @ MartinBüttner por sua abordagem de retina que salvou 10 bytes.
fonte
Shell + bsd-games, 30
Entrada lida de STDIN.
number
converte uma string decimal em palavras. É então uma questão simples decidir se o resultado começa ou nãoe
.fonte
Retina , 27 bytes
Isso não é muito diferente da resposta Retina da DigitalTrauma, mas eles insistiram que eu publicasse isso pessoalmente.
Experimente online.
O primeiro regex substitui todos os números relevantes por
an
e o segundo substitui todos os números restantes pora
. Isso funciona para os mesmos bytes:fonte
C ++, 101
Esse é o meu desafio, portanto, não é uma resposta competitiva. Só queria ver o quão curto eu poderia obtê-lo em C ++. As operações de string são muito detalhadas, portanto, isso é feito com matemática. Sinto que deve haver uma maneira de diminuir essa condição, mas não consigo entender direito.
fonte
Mathematica, 53 bytes
Uma solução usando processamento de string acabaria sendo mais longa.
fonte
PostScript,
119113 caracteresCom código de teste:
fonte
JavaScript (ES6)
70614638 bytesWiki da comunidade porque a solução atual é muito diferente da minha original. Obrigado a todos!
Demo: http://www.es6fiddle.net/iio40yep/
fonte
eval
truque! Eu sabia que tinha que haver uma expressão regular melhor também, mas não conseguia descobrir nada que fosse mais curto. Obrigado!n=>/^8|^(?=1[18])..(\d{3})*$/.test(n)?'an':'a'
( es6fiddle.net/iiehl1ex ). Tem 46 bytes de comprimento.8
, se começa1[18]
e se o tamanho dos números é2 * (3n)
. Basicamente, é todo o seu código, mas dentro de uma expressão regular.Sério,
4340 bytesA estratégia aqui é examinar apenas os 1, 2 ou 3 dígitos mais significativos, dividindo por inteiro a entrada pelo maior valor
10^(3n)
que é menor que a entrada.Experimente online
Explicação:
fonte
Retina , 34
Tradução direta da minha resposta sed :
Experimente online.
Um byte economizado graças a @Timwi.
fonte
Perl 6 ,
3130 bytes(O Perl 6 usa
[ ]
em expressões regulares para não captura( )
e usa<[ ]>
para conjuntos de caracteres)Uso:
fonte
PostScript, 109 bytes
O código verifica se o número começa com determinados prefixos. O prefixo
8
é sempre verificado ( oito , oitenta e poucos , oito centenas e ), mas11
e18
( onze e dezoito ) são verificados apenas quando o número de dígitos é um múltiplo de 3 mais 2.Começamos com um resultado provisório de
a
e quando um prefixo é encontrado, o resultado é substituído poran
.anchorsearch
é usado para evitar extrair um prefixo da string. Mesmo que seja encontrada uma correspondência, continuamos verificando o restante dos prefixos - por que desperdiçar 5 bytes para oexit
? -, mas como a string original é substituída por,a
temos certeza de que não obtemos nenhum falso positivo.Para retornar o resultado
a
- ou -an
na pilha de operandos em vez de imprimi-lo, remova o final=
(comprimento resultante: 107 bytes).Código do teste:
fonte
PostScript (com tokens binários), 63 bytes
O
’
são bytes com o valor 146 (decimal),¥
é um 165 e$
é um 3. Todos os outros são imprimíveis caracteres ASCII de 7 bits.É o mesmo que minha versão PostScript [ASCII pura], mas usa tokens binários, onde isso ajuda a reduzir o comprimento total. Coloco separadamente por 3 razões:
fonte
Python 3,
11093917674706564 bytesAqui é longo, mas simples.
Edit: Corrigido com agradecimentos a isaacg . Economizou algum espaço em branco após as comparações. Muitos bytes salvos graças a Timwi , Mego , benpop e Alissa .
ou para o mesmo número de bytes.
Ungolfed:
fonte
843
"oitocentos e quarenta e três", que deveria estaran
.(-~len(n)%3)<1
invés delen(n)%3==2
?(n[:2]=="11"or n[:2]=="18")
ser reduzido para"118".contains(n[:2])
?n[:2]in"118"
?Java 10, 102 bytes
Experimente online.
Explicação:
fonte
Japonês ,
2827 bytesExperimente online!
Descompactado e como funciona
fonte
1e3
porA³
GNU
sed -r
+ BSDnumber
, 34 bytesPrimeiro, convertemos para o número em inglês. Exclua tudo, exceto uma possível inicial
e
, e prefixe coma
. Em seguida, converta oe
(se presente) paran
. O único truque de golfe é combinar o opcionale
na primeira substituição, para que possamos reutilizar o padrão na linha a seguir.Demo
fonte
TeaScript , 35 bytes
Experimente aqui.
Explicação
fonte
Python 2.7, 66
Obviamente, não tão curto quanto
lambda
esse.fonte
05AB1E , 26 bytes
Provavelmente pode ser jogado um pouco mais, mas está funcionando.
Experimente online ou verifique todos os casos de teste .
Explicação:
fonte
QuadS , 32 bytes
Experimente online!
fonte
Stax , 25 bytes
Execute e depure
Descompactado, não jogado e comentado, parece com isso.
Execute este
fonte
Espaço em branco , 243 bytes
Letras
S
(espaço),T
(tabulação) eN
(nova linha) adicionadas apenas como destaque.[..._some_action]
adicionado apenas como explicação.Experimente online (apenas com espaços brutos, guias e novas linhas).
O programa para com um erro: Nenhuma saída encontrada.
Explicação em pseudo-código:
fonte
C ++,
80bytesFicou 4 bytes mais curto para testar explicitamente contra 8xx e 8x do que ter outro
/=10
loop, como este:Demo
fonte
i/=1000
seri/=1e3
, e tudo pode&&
se tornar&
?&&
não podem ser todos&
, porque subtracção produz números inteiros e não booleanos - por exemplo,19-11
é de 8, e19-18
é 1; veja que8 && 1
é verdade, mas8 & 1
é falso. Poderíamos usar,&
mas precisaríamos mudar-
para!=
e também adicionar parênteses.&
fato não funciona aqui, meu mal. Btw, por que você também não adiciona um link TIO à sua resposta?Perl 5
-p
, 26 bytesExperimente online!
fonte
Perl,
715549 bytesEu sabia que o operador ternário ajudaria um dia ...
Deixe-me explicar isso.
$_=<>
aceita um número como entrada.$_=...
bloco definirá o valor de$_
após ser usado....?...:...
é o operador ternário. Se a condição (primeiro argumento) for verdadeira, ela retornará o segundo argumento. Caso contrário, ele retornará o terceiro./^8/||(/^1[18]/&&length%3==2)
verifica se o número começa com 8 ou começa com 11 ou 18 (1[18]
aceita um) e tem um comprimento mod 3 de 2.$_
está definido comoan
. Caso contrário, está definido comoa
.$_
(uma
ouan
) comsay
.Alterar
fonte
$_=<>;$_=(/^8/)||/^1[18]/&&length($_)%3==1?'an':'a';say
salva alguns bytes. (Embora o número de comparar a isso depende do que o seu carácter de nova linha é, mas isso não muda a contagem de bytes.)length($_)
paralength
(ou pelo menos largar os parênteses), mas isso não está funcionando para mim por algum motivo.($_)
obter$_=<>;$_=/^8/||/^1[18]/&&length%3==1?'an':'a';say
, que é de apenas 49 bytes.-p
vez de$_=<>
esay
, emy///c
vez delength
, e soltando as aspas em torno dea
ean
:perl -pe'$_=/^8/||/^1[18]/&&y///c%3==2?an:a'
(34 bytes + 1 para-p
). Note-se que a entrada não pode terminar com uma nova linha:echo -n 11 | perl -pe'...'
. Isso também corrige um erro:length%3==2
é analisado comolength(%3)==2
, e não comolength($_)%3==2
, portanto, sempre retorna falso.Pyth,
2931Inverte a string, divide-a em seções de três, inverte-a novamente e escolhe o final apropriado.
fonte
111
- dáan