O desafio
Exiba o alfabeto de uma determinada letra lida na entrada do console. Se a letra estiver em maiúscula, é necessário exibir o alfabeto em maiúsculas. O alfabeto impresso deve terminar na letra precedente da que foi inserida. Se um parâmetro adicional for adicionado à entrada (um ponto simples .
), o alfabeto deverá ser impresso uma letra em cada linha. Caso contrário, o alfabeto deve ser impresso na mesma linha, separada por um espaço simples. Se uma entrada incorreta for enviada ao programa, ela não imprimirá nada.
Exemplos de entradas:
Entrada:
c
Produção do programa:
d e f g h i j k l m n o p q r s t u v w x y z a b
Entrada
H.
Produção do programa:
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
A
B
C
D
E
F
G
Respostas:
GolfScript
48 75 73 70 67 66 63 5753Demos online:
Caso de teste 1 ('c')
Caso de teste 2 ('H.')
Caso de teste 3 (entrada inválida)
Atualizar:
Agora a última regra também é implementada. Agradecemos a Ventero por apontar o problema.
Atualizar:
Reescrevi o código do zero e encontrei novas maneiras de reduzi-lo ainda mais.
Histórico de modificações:
fonte
If wrong input is send to the program it will not print anything.
C,
135 129128 caracteresPorra, tantos números mágicos diferentes, mas não há como se livrar deles.
Tem que ser executado com a entrada como parâmetro do programa. Agora segue o requisito "entrada incorreta".
Explicação:
A
**b+6&31
parte usa o fato de que os códigos ASCII para caracteres em minúsculas / maiúsculas são os mesmos se apenas olharmos para os últimos 5 bits e os 5 bits restantes estiverem no intervalo de 1 a 26.Versão sem requisito de "entrada incorreta" (82 caracteres):
fonte
test
, chame-o comotest c
outest X.
main(a,b)char**b;{
. Além disso,b++
você pode substituir*b[1]
->**b
eb[1][1]
->1[*b]
.Ruby,
727161 caracteresEsta versão ruby usa uma expressão regular para verificar a entrada. Felizmente, o método de string Ruby
succ
faz a maior parte do trabalho para nós (incluindo o contorno).Edit: 61 caracteres com a ajuda de chron e Ventero .
fonte
c=gets[0];25.times{$><<c.next![-1]+($1?$/:' ')}if~/^[a-z](\.)?$/i
gets;25.times{$><<$_=$_.next[0]+($1?$/:' ')}if~/^[a-z](\.)?$/i
- basicamente o mesmo que o seu apenas abusando$_
e$/
+=
vez de+
, você pode soltar os parênteses$1?$/:' '
.Ruby:
12711392 caracteres (?)(Não consigo encontrar a regra sobre a pontuação da penalidade no uso
-p
. Adicionado 1 por enquanto. Se estiver errado, corrija-me.)Exemplo de execução:
fonte
Ruby,
10195Experimente online
fonte
('a'..'z').to_a
=>[*?a..?z]
GolfScript,
8072 caracteresMuito do código está testando a entrada válida e a opção "imprimir nada". A lógica real tem apenas 37 caracteres.
Casos de teste online
fonte
q / k4
66 64 63 60 5856 + 2 penalidadepenalidade para a variável global init, o algoritmo é 56 como abaixo:
56:
58:
60:
63:
64:
EDITAR:
Adicionado penalidade de 2 para inicialização global (x :), o mesmo se a função de agrupamento entre colchetes (como sugerido o slackware)
não tiver certeza se a alteração do namespace deve ser punida também ... então são outras 3
Exemplo:
fonte
Perl,
1311271171121061041029896929190937166656458 caracteresUso:
Um caractere foi adicionado à contagem da
n
opção.O maior corte só foi possível por causa do comportamento dos
++
personagens na resposta de Jon Purdy .fonte
s/a.$1/az/
para economizar mais 2.chop().($2?$/:$")
->chop,$2?$/:$"
para mais 4Perl,
149, 167Atualizar
fonte
$s=($d)?"\n":" ";
com$s=$d?$/:$";
e talvez apenas se livrar$s
por completoPython, 83
fonte
PHP,
120119113fonte
$v[1]=='.'?"\n":" "
o resultado na variável $ s, deixe o PHP calculá-lo toda vez naecho
instrução. Dessa forma, você pode poupar 6 caracteres.Mathematica
158 159 204 199 199 183 167 165162Código
Uso
fonte
J 43
Exemplos:
tuvwxyzabcdefghijklmn opqr
t
u
v
w
x
y
z
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
Esta solução evoluiu no fórum de programação J: http://jsoftware.com/pipermail/programming/2012-August/029072.html
Autores: AlvordBossCerovskiCyrEllerHuiLambertMcCormickMillerQuintanaSchottSherlockTaylorTherriault
Explicação
As frases J são executadas começando à direita, passando o resultado contínuo para a esquerda à medida que é avaliado. Como é interativo, podemos analisar partes da solução isoladamente para entendê-las melhor.
A parte do meio gera o alfabeto maiúsculo e minúsculo em Unicode:
O verbo "u:" converte seu argumento numérico à direita em caracteres Unicode. O argumento numérico é gerado a partir dos valores ASCII para os caracteres maiúsculos e minúsculos, adicionando os números de "A" e "a" cada aos valores de 0 a 25 gerados por "i.26":
A parte direita,
procura (i.) a posição do argumento certo (]) à esquerda ([) - que é o vetor de letras acima - e descarta (}.) mais um (>:) que esse número. O '"0' aplica essa frase aos argumentos dimensionais 0 (escalares).
A frase "25 {." Pega os primeiros 25 elementos do vetor à direita.
A penúltima frase "1j1 #" à esquerda replica seu argumento à direita de acordo com o número à esquerda. Um número simples faz uma replicação simples:
No entanto, um número complexo - indicado pelo "j" entre as partes real e imaginária - insere um elemento de preenchimento de acordo com a parte imaginária. Aqui, indicamos um elemento de preenchimento pelo lado direito do "j".
Como na maioria das primitivas J, o verbo replicado (#) funciona em matrizes numéricas de maneira análoga à maneira como funciona nas matrizes de caracteres. Como mostrado aqui,
vemos que o elemento de preenchimento numérico padrão é zero, enquanto que para caracteres é o caractere de espaço.
Por fim, o token mais à esquerda "|:" transpõe o resultado dos verbos anteriores para a direita.
Explicação fornecida por Devon McCormick. Obrigado Devon.
fonte
brainfuck, 303
Atualmente, ele não suporta a
If wrong input is send to the program it will not print anything
parte e provavelmente pode ser mais curto. Eu pretendo corrigi-lo mais tarde. No momento, meu cérebro está muito danificado para continuar.fonte
C, 110
Às vezes imprime "espaços" entre as letras, às vezes não.
Um pouco mais legível:
Corre:
fonte
JavaScript, 137
Infelizmente um pouco detalhado (
String.fromCharCode
echarCodeAt
).fonte
Perl,
77767068Edições:
Salve um caractere usando regex em vez de
substr
.Guardou 6 caracteres usando em
map
vez defor
.Salva 2 caracteres, omitindo a nova linha final.
fonte
\n
sua últimaprint
é necessária, que vai salvar um casal caracteres\n
, obrigado.R, 219
Feio, longo ... ainda funciona.
Uso:
fonte
C, 146 caracteres (péssimo)
Eu não sou muito experiente em C, o que provavelmente mostra ...>. <Tive a sensação de que caracteres inteiros seriam úteis, mas na verdade não pareceu causar o impacto que eu esperava ... Vou deixar minha tentativa aqui, fique à vontade para sugerir melhorias.
Versão não minificada:
fonte
VBA 225
Formatado para executar a partir da janela imediata:
Dividido em linhas individuais (precisa ser cercado por
Sub
bloco e precisa de umprint
método diferente para trabalhar em um módulo, aumentando assim o código):fonte
Java 8, 127 bytes
Explicação:
Experimente online.
fonte
Caxumba,
91,86,82,79, 76Não é uma linguagem tão moderna;) Tenho certeza que resta um pouco de espaço de otimização ..
Explicação:
ler entrada
verifique se t corresponde à entrada necessária
básico para loop através do alfabeto. Observe que a caxumba está avaliando estritamente da esquerda para a direita. True = 1, então você obtém 65 ou 97 como resultado para p, # é o operador de módulo
testes:
(você precisará de um ambiente de tempo de execução da caxumba, ou seja, Caché para executar isso)
editar: cabeçalho em negrito
editar: tinha uma solução errada, corrigida agora. Obrigado a rtfs e Averroees por apontar isso
fonte
JavaScript: 141
Versão comentada:
jsFiddle DEMO
fonte
Aqui está minha primeira tentativa com o APL.
se eu posso usar uma única variável global
A←2 26⍴6↓26⌽⎕UCS 65+⍳58
, posso reduzir o valor acima para o seguinte:fonte
C ++ 11
fonte
C (111)
dissecação
Obras] $ ./test 5
Obras] $ ./test W XYZABCDEFGHIJKLMNOPQRSTUV
Obras] $ ./test M NOPQRSTUVWXYZABCDEFGHIJKL
Works] $ ./test g hijklmnopqrstuvwxyzabcdef
Obras] $ ./test [
Works] $ ./test a bcdefghijklmnopqrstuvwxyz
Obras] $ ./test Z ABCDEFGHIJKLMNOPQRSTUVWXY
Obrigado por um pouco de reflexão.
fonte
[A-Za-z]\.?
for, se eu entendi a pergunta corretamente.Perl, 226 caracteres
fonte
die
declaração pode ser reduzida, economizando muito ...C # 170
Descomprimido
fonte
1
: Se a letra estiver em maiúscula, é necessário exibir o alfabeto em maiúsculas.2
: O alfabeto impresso deve terminar na letra precedente da que foi inserida.3
: Se um parâmetro adicional for adicionado à entrada (um ponto simples.), O alfabeto deverá ser impresso uma letra em cada linha. Caso contrário, o alfabeto deve ser impresso na mesma linha, separada por um espaço simples.4
: Se uma entrada incorreta for enviada ao programa, ela não imprimirá nada. Esta é uma falta de 4 em 4.char
comvar
e barbear 1 ponto de sua pontuação, solta o.ToCharArray()
(astring
é um char-array você já pode iterar!), Perder astring[] a
desde que você não está lidando com argumentos de linha de comando, perder o namespace, seu constante 'c' deve ser lido da entrada do console, perca a sequência do alfabeto e use ASCII, etc. É ótimo que você jogue, mas tente fazer um esforço decente; a maioria dos seus envios parece ser apenas de pesca à linha.C, 117
Crédito para schnaader pelo truque d + 6 e 31.
http://ideone.com/ts1Gs9
fonte
Bash: 110 bytes
Em termos de explicação, é bastante direto, sem truques de mágica - isso é apenas algo para o qual o bash é intrinsecamente adequado. Em termos de bits não óbvios:
{a..z}
é um truque muito subutilizado no bash - ele se expande paraa b c d...
. Você pode fazer o mesmo para gerar seqüências numéricas.[[ $1 =~ [a-z] ]]
executa uma correspondência de expressões regulares no primeiro argumento do programa para caracteres de a a z. Da mesma forma para AZ. Você precisa de colchetes duplos para isso, porém,[
não pode fazê-lo.${1:1:1}
obtém uma substring de $ 1 (o primeiro argumento), um caractere, um caractere de comprimento - ou seja, retorna o segundo caractere da string, o que esperamos ser.
.sed 's/ /\n/g'
Regex simples: pesquisa e substitui espaços por novas linhas. Se.
é o segundo caractere da string, canalizamos a entrada para isso ou de outra forma ...cat
é o truque final aqui - se não queremos substituir espaços por novas linhas, alimentamos stdin para cat, o que simplesmente gera novamente.fonte