Imprimir alfabeto personalizado

20

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
Averroes
fonte
O Sage Notebook opera no "nível do console", então a "entrada do console" necessária neste caso está apenas digitando a entrada em uma célula da planilha?
res
código mais curto ganha?
ardnew
@ardnew Sim, o código mais curto vence.
Averroes
@res Acho que, embora você precise codificar a leitura de entrada de alguma forma, isso pode ser justo da perspectiva das regras.
Averroes
6
@Averroes A penalidade pelo uso do GolfScript é o tempo que leva para aprender uma linguagem que não tem uso real fora desse tipo de competição. Não acho que penalizar as pessoas por usar a ferramenta certa para o trabalho será muito produtivo.
Gareth

Respostas:

12

GolfScript 48 75 73 70 67 66 63 57 53

(91,65>.+.{32+}%+.@?>(;25<''+.,1>*\['''.']?[' 'n 0]=*

Demos online:

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:

.,3<\(:x;:§['''.']?)and{91,65>.+.{32+}%+.x?).{>25<''+{§n' 'if}%}{;;}if}''if
.,3<\(:x;:§['''.']?)*{91,65>.+.{32+}%+.x?).{>25<''+{§n' 'if}%}{;;}if}''if
.,3<\(:x;:§['''.']?)*{91,65>.+.{32+}%+.x?).!!@@>25<''+{§n' 'if}%*}''if
.,3<\(:x;:§['''.']?)*!!91,65>.+.{32+}%+.x?).!!@@>25<''+{§n' 'if}%**
.,3<\(:x;:§['''.']?)*91,65>.+.{32+}%+.x?).@@>25<''+{§n' 'if}%@@*!!* 
.(@,3<@:§['''.']?)*91,65>.+.{32+}%+@1$?).@@>25<''+{§n' 'if}%@@*!!*
.(@,3<@:§['''.']?)*91,65>.+.{32+}%+@1$?):x>25<''+{§n' 'if}%\x*!!*
.(@,3<@:§['''.']?)*91,65>.+.{32+}%+@1$?):x>25<''n' 'if*\x*!!*
(\:§['''.']?)91,65>.+.{32+}%+@1$?):x>25<''n' 'if*\x*!!*
(91,65>.+.{32+}%+.@?>(;25<''+.,1>*\['''.']?[' 'n 0]=* 
Cristian Lupascu
fonte
2
Esta solução não segue o último requisito:If wrong input is send to the program it will not print anything.
Ventero
@Ventero Right. Eu vou consertar isso.
Cristian Lupascu
63 - agradável, estamos Head2Head :), gostaria de poder entender golfscript;)
bua
Eu me sinto da mesma maneira sobre Q. Ótimo trabalho! ;-)
Cristian Lupascu
+1 incrível! disposto a quebrar 50 ;-)?
bua
10

C, 135 129 128 caracteres

Porra, 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".

c;main(a,b)char**b;{if(a==2&&isalpha(**++b)&&!(c=1[*b])||c==46&&!2[*b])for(;++a<28;)printf("%c%c",**b-=**b+6&31?-1:25,c?10:32);}

Explicação:

c;                   // Variable that will be used later
main(a,b)char**b;{   // There's one parameter => a = 2, b[1] = the parameter
                     // Wrong input checks: We want...
  if(
     a==2 &&         // 1 parameter and ...
     isalpha(**++b)  // lower- or uppercase letter as parameter,
                     // increase b so we can access it better
     &&              // and ...
     !(c=1[*b]) ||   //   either no further character,
                     //     save the character in c, or...
     (c==46&&!2[*b]) //   a dot as next character and no further characters
    )                // if check succeeded, execute the for loop, else do nothing
  for(;++a<28;)      // This will loop 26 times (2..27)
    printf("%c%c",   // Print two characters
                     // First character to print:
      **b            // We'll print the first character of the parameter,
       -=            // but decrement it before printing
       **b+6&31?     // if the last five bits (31 = 11111b) are not 26 (6 == -26 mod 32)
        -1           //   decrement it by -1 (aka increment it)
        :25,         //   else (char=z/Z) decrement by 25, so we start over at a/A
                     // Second character to print:
      c?             // c is either ASCII 0 or a dot (ASCII 46)
       10            //   dot     -> print a newline
       :32);         //   ASCII 0 -> print a space (ASCII 32)
}

A **b+6&31parte 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):

main(a,b)char**b;{for(b++;++a<28;)printf("%c%c",**b-=**b+6&31?-1:25,1[*b]?10:32);}
schnaader
fonte
Alguma instrução sobre como compilá-lo? Eu recebo uma falha de segmentação ao executar.
manatwork
@manatwork parece usar a entrada como parâmetro.
Shiona
Sim, de fato, editado para esclarecer. Por exemplo, se o nome do programa for test, chame-o como test coutest X.
schnaader
Obrigado, entendi. Meu C parece mais enferrujado do que eu pensava.
manatwork
2
K & R estilo definição pode ajudar: main(a,b)char**b;{. Além disso, b++você pode substituir *b[1]-> **be b[1][1]-> 1[*b].
Ugoren
7

Ruby, 72 71 61 caracteres

gets;25.times{$><<$_=$_.succ[0]+=$1?$/:' '}if~/^[a-z](\.)?$/i

Esta versão ruby ​​usa uma expressão regular para verificar a entrada. Felizmente, o método de string Ruby succfaz a maior parte do trabalho para nós (incluindo o contorno).

Edit: 61 caracteres com a ajuda de chron e Ventero .

Howard
fonte
O meu acabou muito parecido com o seu para incomodar a postagem separadamente. Mesma abordagem, mas alguns caracteres mais curtos (65):c=gets[0];25.times{$><<c.next![-1]+($1?$/:' ')}if~/^[a-z](\.)?$/i
Paul Prestidge
2
E isso é 62: gets;25.times{$><<$_=$_.next[0]+($1?$/:' ')}if~/^[a-z](\.)?$/i- basicamente o mesmo que o seu apenas abusando $_e$/
Paul Prestidge 24/08/12
2
@chron: Usando em +=vez de +, você pode soltar os parênteses $1?$/:' '.
Ventero
@chron e Ventero: Obrigado. Adicionado seu código à minha solução.
259 Howard
6

Ruby: 127 113 92 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.)

$_=if ~/^([a-z])(\.)?$/i;s,e=$1>?Z?[?a,?z]:[?A,?Z];[*$1.succ..e,*s...$1]*($2==?.?$/:" ")end

Exemplo de execução:

bash-4.2$ ruby -pe '$_=if ~/^([a-z])(\.)?$/i;s,e=$1>?Z?[?a,?z]:[?A,?Z];[*$1.succ..e,*s...$1]*($2==?.?$/:" ")end' <<< c
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

bash-4.2$ ruby -pe '$_=if ~/^([a-z])(\.)?$/i;s,e=$1>?Z?[?a,?z]:[?A,?Z];[*$1.succ..e,*s...$1]*($2==?.?$/:" ")end' <<< H.
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

bash-4.2$ ruby -pe '$_=if ~/^([a-z])(\.)?$/i;s,e=$1>?Z?[?a,?z]:[?A,?Z];[*$1.succ..e,*s...$1]*($2==?.?$/:" ")end' <<< seven
homem a trabalhar
fonte
6

Ruby, 101 95

i,d=gets.split''
[*?a..?z].join[/#{i}/i]
($'+$`).chars{|c|$><<(i>?Z?c:c.upcase)+(d==?.?$/:' ')}

Experimente online

defhlt
fonte
Não segue "Se uma entrada incorreta for enviada para o programa, ela não imprimirá nada".
21412 Matt
poderia salvar alguns caracteres com ('a'..'z').to_a=>[*?a..?z]
Paul Prestidge
@chron Obrigado! Como eu pude sentir falta disso ..
Defhlt 22/08/2012
6

GolfScript, 80 72 caracteres

.).46={;)}*25,{65+.32+}%?)\""=*!!\([{)..31&26-!26*-}25*;]n+\"."=n" "if**

Muito 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

Howard
fonte
6

q / k4 66 64 63 60 58 56 + 2 penalidade

penalidade para a variável global init, o algoritmo é 56 como abaixo:

56:

if[&/x in".",l:(a;A)90>*x;1@/1_,/|_[0,l?x;l,'"  \n"@#x]]

58:

if[&/x in".",l:(a;A)90>*x;1@/(1_,/|_[0,l?x;l]),'"  \n"@#x]
  • mude de if-else para if permissão para reorganizar o código e se livrar de ";" no fim

60:

1@/$[&/x in".",l:(a;A)90>*x;1_,/|_[0,l?x;l];" "],'"  \n"@#x;
  • acabou se livrando dessa verificação redundante

63:

1@/$[&/x in".",l:(a;A)90>*x;1_,/|_[0,l?x;l];" "],'" \n""."in x; 
  • imprimir caracteres recursivamente em vez de um objeto inteiro
  • ainda não é possível obter a comparação de identidade x em "." em dois lugares ... :(
  • é necessário ponto e vírgula no final, caso contrário, a função print (1 @) imprimirá seu valor de retorno para stdout .... damn

64:

2@,/$[&/x in".",l:(a;A)90>*x;1_,/|_[0,l?x;l];" "],'" \n""."in x;  

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

(.Q`a`A) instead of (a;A)

Exemplo:

q)\         - switch interpreter to k4
 \d .Q     - change to native namespace
  x:"c"
  if[&/x in".",l:(a;A)90>*x;1@/1_,/|_[0,l?x;l,'"  \n"@#x]]
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

  x:"@"
  if[&/x in".",l:(a;A)90>*x;1@/1_,/|_[0,l?x;l,'"  \n"@#x]]    
  x:"H."
  if[&/x in".",l:(a;A)90>*x;1@/1_,/|_[0,l?x;l,'"  \n"@#x]]
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
  x:...
bua
fonte
+1 Bom progresso. Vou tentar encontrar outra maneira de reduzir meu código agora.
Cristian Lupascu
Pode realmente ser chamado de k válido se estiver usando definições em qk? ;-) Além disso, se você envolvê-la em uma função, você pode pular o x: "a" etapa de configuração, por exemplo, {$ [...]}
skeevey
@slackwear você está certo, é por isso que se chama q / k4 ;-).
bua
6

Perl, 131 127 117 112 106 104 102 98 96 92 91 90 93 71 66 65 64 58 caracteres

s!^([a-z])(\.?)$!print chop,$2?$/:$"for($1..az)[1..25]!ie

Uso:

perl -ne 's!^([a-z])(\.?)$!print chop,$2?$/:$"for($1..az)[1..25]!ie'

Um caractere foi adicionado à contagem da nopção.

O maior corte só foi possível por causa do comportamento dos ++personagens na resposta de Jon Purdy .

Gareth
fonte
Você pode raspar um par de caracteres, removendo os últimos 2 semicolons
ardnew
@ardnew Obrigado. :-)
Gareth
1
esta coisa é impressionante
bua
@ bua Obrigado, ainda estou tentando encontrar os personagens para que eu possa pegar você e o w0lf. :-)
Gareth
s/a.$1/az/para economizar mais 2. chop().($2?$/:$")-> chop,$2?$/:$"para mais 4
mob
5

Perl, 149 , 167

Atualizar

  • Adicionada verificação de sanidade.
  • Nova sugestão sobre a aplicação do separador.
exit if $ARGV[0] !~ /[a-z]\.?/i;    # sanity check input
($x,$d)=split //,$ARGV[0];          # split input arguments
@l=65..90;                          # define uc letter range
push @l,splice @l,0,ord(uc $x)-64;  # rotate letter range
pop @l;                             # remove the argument letter
print join $d?$/:$",                # print the joined list
  map {ord($x)>90?lc chr:chr} @l;   # map chr and lc as appropriate
Thor
fonte
você pode substituir $s=($d)?"\n":" ";com $s=$d?$/:$";e talvez apenas se livrar $spor completo
ardnew
4

Python, 83

r=raw_input()
i=ord(r[0])
exec"i+=1-26*(i%%32>25);print chr(i)%s;"%","["."in r:]*26
grc
fonte
Eu não sou fã dessa restrição, mas ela existe e o programa não a segue: "Se uma entrada incorreta for enviada ao programa, ela não imprimirá nada".
21812 Matt
Além disso, parece que você imprime um caractere a mais do que deveria. A saída de exemplo é de 25 caracteres.
21412 Matt
4

PHP, 120 119 113

<?$v=fgets(STDIN);$f=$c=$v[0];ctype_alpha($c++)||die;for(;$c[0]!=$f;$c=$c[0],$c++)echo$c[0],$v[1]=='.'?"\n":" ";
Lortabac
fonte
1
Esse é um desafio do código-golfe , portanto, não são necessárias otimizações de velocidade e uso de recursos. Em vez de armazenar $v[1]=='.'?"\n":" "o resultado na variável $ s, deixe o PHP calculá-lo toda vez na echoinstrução. Dessa forma, você pode poupar 6 caracteres.
manatwork
1
@manatwork Obrigado, eu mudei.
Lortabac
4

Mathematica 158 159 204 199 199 183 167 165 162

Código

f@h_ := Most@RotateLeft[#, Position[#, h][[1, 1]]] &[FromCharacterCode /@ 
        (65~Range~90 + 32 Boole@LowerCaseQ@h)];
g = Characters@# /. {{p_} :> Row[f@p, " "], {p_, "."} :> Column@f@p, _ -> ""} &

Uso

g["c"]
g["H"]
g["H."]
g["seven"]

uso

DavidC
fonte
O terceiro caso de uso é f ["H"] ou f ["H."]?
Averroes
Eu tive que corrigir a manipulação de ".", Adicionando 50 caracteres ao código. Mas agora ele funciona de acordo com as instruções #
9159
3

J 43

|:1j1#(25{.(u:,2#65 97+/i.26)(>:@i.}.[)])"0

Exemplos:

|:1j1#(25{.(u:,2#65 97+/i.26)(>:@i.}.[)])"0 's'

tuvwxyzabcdefghijklmn opqr

|:1j1#(25{.(u:,2#65 97+/i.26)(>:@i.}.[)])"0 's.'

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

|:1j1#(25{.(u:,2#65 97+/i.26)(>:@i.}.[)])"0 '['

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:

   u:,2#65 97+/i.26
ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz

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":

   65 97+/i.26
65 66 67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122

A parte direita,

   ((>:@i.}.[)])"0

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).

   ('123H999' (>:@i.}.[)])"0 'H'
999

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:

   2 # 'ABCD'
AABBCCDD

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".

   2j1 # 'ABCD'
AA BB CC DD 

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,

   1j1 # 1 2 3
1 0 2 0 3 0

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.

bob therriault
fonte
+1 Solução e explicação realmente agradáveis. Eu considerei tentar em J, mas não consegui descobrir uma maneira boa (uma maneira curta) de verificar se a entrada era válida. Eu acho que o meu teria pelo menos duas vezes mais que isso.
Gareth
Obrigado Gareth, se você olhar as soluções iniciais no link da discussão, verá que muitos de nossos começos foram mais longos. Uma das coisas legais que encontramos foi a variedade de abordagens que poderíamos usar com J. elogios, bob
bob Therriault
3

brainfuck, 303

,>,>++++++[-<-------->]<++[[-]+++++[->++++<]>++<]>++++++++++<<[->+>>>+<<<<]>>>>>>+++++++++++++++[-<++++++<<++++++>>>]<[<[->>]>[>>]<<-]<[[-]++++++++[-<++++>]]<<<[->>>+>+<<<<]>>>>>+[[-]<.<<<.>[->>>+>+<<<<]>>>[-<<<+>>>]<[->+>-<<]>[-<+>]+>[-<[-]>]<[++++[-<----->]<->]<+[->+>+<<]<[->+>-<<]>[-<+>]>>[-<<+>>]<]

Atualmente, ele não suporta a If wrong input is send to the program it will not print anythingparte e provavelmente pode ser mais curto. Eu pretendo corrigi-lo mais tarde. No momento, meu cérebro está muito danificado para continuar.

caixa de papelão
fonte
2

C, 110

Às vezes imprime "espaços" entre as letras, às vezes não.

i,j;main(int c,char*l){gets(l);l[1]&=10;j=*l%32;c=*l&~31;for(i=j;i<j+25;i++){l[0]=c+i%26+1;printf("%2s",l);}}

Um pouco mais legível:

i,j;
main(int c,char*l)
{
  gets(l);
  l[1]&=10;          // makes . to line feed and some other chars to "start of text" 
                     // which looks like space in some cases 
                     // (the byte can become either 0, 2, 8 or 10)

  j=*l%32;           // 0b 000c cccc, these five bits code which letter was chosen
  c=*l&~31;          // 0b ccc0 0000, these three bits code upper/lowercase

                     // 0b ccc0 0000 + (0b 000c cccc + [0..24])%26 + 1
  for(i=j;i<j+25;i++){l[0]=c+i%26+1;printf("%2s",l);}
}

Corre:

$ ./a.out
G
 H I J K L M N O P Q R S T U V W X Y Z A B C D E F

$ ./a.out
p.
q
r
s
t
u
v
w
x
y
z
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
shiona
fonte
2

JavaScript, 137

Infelizmente um pouco detalhado ( String.fromCharCodee charCodeAt).

for(x=b=(n=prompt(m={122:97,90:65})).charCodeAt(r='');/^[a-z]\.?$/i.test(n)&&(x=m[x]||x+1)!=b;)r+=String.fromCharCode(x)+(n[1]?"\n":" ");
pimvdb
fonte
2

Perl, 77 76 70 68

chomp(($a,$b)=split//,<>);$"=$/if$b;map{++$a=~/(.)$/}1..25;print"@a"

Edições:

  1. Salve um caractere usando regex em vez de substr.

  2. Guardou 6 caracteres usando em mapvez de for.

  3. Salva 2 caracteres, omitindo a nova linha final.

Jon Purdy
fonte
3
Bom, mas como você apontou, ele não atende ao requisito de que entradas inválidas não produzam saída. Corrija isso e você receberá meu voto positivo.
Gareth
parece não funcionar para mim no perl 5.14.2. também eu não acredito que a \nsua última printé necessária, que vai salvar um casal caracteres
ardnew
@ardnew: escrevi no meu computador de trabalho, que possui 5.12.3. Vai matar o \n, obrigado.
Jon Purdy
2

R, 219

Feio, longo ... ainda funciona.

f=function(l){if(!nchar(l)%in%c(1,2))invisible()else{s=ifelse(nchar(l)==1," ","\n");l=substr(l,1,1);v=letters;if(l%in%v){}else v=LETTERS;l=grep(l,v);if(l==26)cat(v[1:25],sep=s)else cat(c(v[l+1:(26-l)],v[1:l-1]),sep=s)}}

Uso:

f("a")
f("c.")
f("H")
f("z")
f("Z.")
f("seven")
Paolo
fonte
2

C, 146 caracteres (péssimo)

main(){char b[100];gets(b);for(char a=b[0],c=a,d=a&223,e=b[1];++c!=a&64<d&d<91&(!e|e==46&!b[2]);(c&31)>26?(c&=96):(putchar(c),putchar(e?10:32)));}

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:

main() {
  char b[999]; // assume that the line will fit in 999 chars...
  gets(b);

  // a is the char we start on, c is the char that we iterate,
  // d is toUppercase(a), e is just an alias for the second char.
  for (char a = b[0], c = a, d = a&223, e=b[1];
      // increment c, make sure that we haven't reached a yet.
      // also check the other conditions (first char is letter, second char
      // is either '.' or NULL, third char is NULL if second char was '.').
      ++c != a & 64 < d & d < 91 & (!e | e == 46 & !b[2]);
      (c&31) > 26     // check if we need to wrap around
        ? (c &= 96)   // if so, wrap
        : (putchar(c), putchar(e?10:32))  // otherwise, print char & separator
  );
}
FireFly
fonte
2

VBA 225

Formatado para executar a partir da janela imediata:

s=InputBox(""):n=Asc(Left(s,1)):l=Len(s):p=IIf(l<3,IIf(l=2,IIf(Right(s,1)=".",vbCr,"")," "),""):c=IIf(n>64 And n<91,65,IIf(n>96 And n<123,97,99)):o=n-c+1:If o>0 And p<>"" Then For i=o To o+24:x=x & Chr(i Mod 26+c) & p:Next:?x

Dividido em linhas individuais (precisa ser cercado por Subbloco e precisa de um printmétodo diferente para trabalhar em um módulo, aumentando assim o código):

s=InputBox("")
n=Asc(Left(s,1))
l=Len(s)
p=IIf(l<3,IIf(l=2,IIf(Right(s,1)=".",vbCr,"")," "),"")    
c=IIf(n>64 And n<91,65,IIf(n>96 And n<123,97,99))
o=n-c+1
If o>0 And p<>"" Then 
For i=o To o+24
x=x & Chr(i Mod 26+c) & p
Next
End If 'Not needed when completed in single line format
MsgBox x
Gaffi
fonte
2

Java 8, 127 bytes

a->{String r="",d=a.length>1?"\n":" ";char c=a[0],C=c;for(;++c<(c<97?91:123);r+=c+d);for(c=C<97?64:'`';++c<C;r+=c+d);return r;}

Explicação:

Experimente online.

a->{                        // Method with character-array parameter and String return-type
  String r="",              //  Result-String, starting empty
         d=a.length>1?      //  If the length of the input is larger than 1
            "\n"            //   Set the delimiter to a new-line
           :                //  Else:
            " ";            //   Set the delimiter to a space
  char c=a[0],              //  Get the input letter
       C=c;                 //  And create a copy of it
  for(;++c<(c<97?91:123);   //  Loop from this letter + 1 to (and including) 'Z'/'z'
    r+=c+d);                //   And append the result with a letter + the delimiter
  for(c=C<97?64:'`';++c<C;  //  Loop again from 'A'/'a' to (and excluding) the input-letter
    r+=c+d);                //   And append the result with a letter + the delimiter
  return r;}                //  Return the result
Kevin Cruijssen
fonte
1

Caxumba, 91 , 86 , 82 , 79 , 76

r t i t?1A.1"." s a=$A(t),p=a>90*32+65 f i=1:1:25 w *(a+i-p#26+p) w:t["." !

Não é uma linguagem tão moderna;) Tenho certeza que resta um pouco de espaço de otimização ..

Explicação:

r t 

ler entrada

i t?1A.1"."

verifique se t corresponde à entrada necessária

s a=$A(t),p=a>90*32+65 f i=1:1:25 { w *(a+i-p#26+p) w:t["." !}

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:

USER>d ^golf
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
c

USER>d ^golf
tuvwxyzabcdefghijklmnopqrs
USER>d ^golf
h.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

USER>d ^golf
hallo
USER>

(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

kazamatzuri
fonte
o código parece ser 79 caracteres de comprimento, não 80
Cristian Lupascu
infelizmente, o primeiro espaço não é opcional, então eu pensei que eu tenho que contá-lo no.
kazamatzuri
Os casos de teste não terminam na letra precedente da passada como parâmetro, pois não?
Averroes
1

JavaScript: 141

c="",b=c[0].charCodeAt()<91,a="abcdefghijklmnopqrstuvwxyz",b&&(a=a.toUpperCase()),a=a.split(c[0]),a=a[1]+a[0],a=c[1]?a.split("").join("\n"):a

Versão comentada:

c="", //write input here (examples "a", "B", "c.", "D.")
b=c[0].charCodeAt()<91, //true for upperC, false for lowerC
a="abcdefghijklmnopqrstuvwxyz", //the abc
b&&(a=a.toUpperCase()), //if upper, turn main string to upperC
a=a.split(c[0]), //split by the first char of input
a=a[1]+a[0], //swap the two parts
a=c[1]?a.split("").join("\n"):a //if input second char, add breaklines in between
//the output is inside 'a'

jsFiddle DEMO

ajax333221
fonte
0

Aqui está minha primeira tentativa com o APL.

⍞{1 1≡(2⌈⍴⍺)⍴⍺∊'.',⍵:⊃(~=/2⍴⍺)⌷(,X,' ')(X←25 1⍴1↓(X⍳⊃⍺)⌽X←(⎕A∊⍨⊃⍺)⌷2 26⍴⍵)}6↓26⌽⎕UCS 65+⍳58

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:

{1 1≡(2⌈⍴⍵)⍴⍵∊'.',,A:⊃(~=/2⍴⍵)⌷(,X,' ')(X←25 1⍴1↓(X⍳⊃⍵)⌽X←(⎕A∊⍨⊃⍵)⌷A)}⍞
Aaron W. Hsu
fonte
0

C ++ 11

#include <iostream>
#include <vector>
#include <cstdio>

int main(int argc, const char * argv[])
{
    std::vector<char> list1,list2;
    for( char c = 'a'; c <='z'; c++ )
    {
        list1.push_back( c );
        list2.push_back( toupper( c ) );
    }
    char c = getchar();
    auto f = [ c ]( std::vector<char> list )
    {
        auto i = std::find( list.begin(), list.end(), c );
        if( i == list.end() )
            return;
        auto c = i;
        for( ;; )
        {
            c++;
            if( c == list.end() ) c = list.begin();
            if( c == i )break;
            std::cout<<*c<<"\n";
        }
    };
    f( list1 );f(list2);
    return 0;
}
Carl
fonte
0

C (111)

main(int i, char**c){if(isalpha(*c[1]))for(i=0;i<25;i++) printf("%c",isalpha((*c[1])+1)?++*c[1]:(*c[1]-=25));}

dissecação

if(isalpha(*c[1])) // start with char-check.

for(i=0;i<25;i++) // we need 25 values, excluding input char. reusing i.

printf("%c", // print char. ofcourse.

isalpha((*c[1])+1) ? ++*c[1] : (*c[1]-=25)); 
//check if we are past z/Z and fall back to a/A. 
//make that available to print. 

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.

essbeev
fonte
Você não está adicionando novas linhas se um '.' é dada. Além disso, você não deve produzir nada se a entrada não [A-Za-z]\.?for, se eu entendi a pergunta corretamente.
marinus
# 1 ah! eu estava interessado em tornar o código curto .. # 2. veja a saída de 'test [', ela não imprime nada. @marinus
essbeev
0

Perl, 226 caracteres

die "Invalid input " if $ARGV[0] !~ /[a-z]\.?/i;
@listA=(a...z);
$index=ord(lc(substr($ARGV[0],0,1)))-97;
print join(substr($ARGV[0],1) ? "\n" : " ",map{$ARGV[0] =~ /[A-Z]/?uc $_:$_}(@listA[$index+1...25],@listA[0...$index]));
beginnerProg
fonte
Você pode formatar seu texto para aparecer como um bloco de código. Leia o guia aqui para formatar suas postagens. Além disso, você pode salvar alguns caracteres usando nomes de variáveis ​​de um único caractere.
Gareth
1
Uma entrada inválida não deve imprimir nada, portanto sua diedeclaração pode ser reduzida, economizando muito ...
Gaffi
0

C # 170

using System.Linq;namespace N{class P{static void Main(string[]a){foreach(char e in"abcdefghijklmnopqrstuvwxyz".ToCharArray().Where(o =>o>'c'))System.Console.Write(e);}}}

Descomprimido

using System.Linq;
namespace N {
    class P {
        static void Main(string[]a){
            foreach (char e in "abcdefghijklmnopqrstuvwxyz".ToCharArray().Where(o => o > 'c'))
                System.Console.Write(e);
        }
    }
}
PauloHDSousa
fonte
Não se esqueça de adicionar uma explicação à sua resposta.
23714 Justin justin
Este programa nem de longe tenta jogar de acordo com as regras. 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.
precisa saber é o seguinte
^ Fora isso, peço que você dê uma olhada nos meus comentários anteriores aqui . Você pode substituir charcom vare barbear 1 ponto de sua pontuação, solta o .ToCharArray()(a string é um char-array você já pode iterar!), Perder a string[] adesde 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.
precisa saber é o seguinte
0

C, 117

main(c,s,d){d=c=getchar(),s=getchar();for(s=s<0?32:s^46?0:10;d+=d+6&31?1:-25,s&&isalpha(c)&&d^c;printf("%c%c",d,s));}

Crédito para schnaader pelo truque d + 6 e 31.

http://ideone.com/ts1Gs9

mattnewport
fonte
0

Bash: 110 bytes

(([[ $1 =~ [a-z] ]]&&echo {a..z})||([[ $1 =~ [A-Z] ]]&&echo {A..Z}))|([ "${1:1:1}" = . ]&&sed 's/ /\n/g'||cat)

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 para a b c d.... Você pode fazer o mesmo para gerar seqüências numéricas.
  • O Bash pode fazer a correspondência de expressões regulares, [[ $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.
Tumulto
fonte
Não se esqueça de adicionar uma explicação.
21714 Justin justin