Imprimir alfabeto personalizado

20

El reto

Muestra el alfabeto de una letra dada leída desde la entrada de la consola. Si la letra es mayúscula, debe mostrar el alfabeto en mayúscula. El alfabeto impreso debe terminar en la letra precedente de la insertada. Si se agrega un parámetro adicional a la entrada (un punto simple .), el alfabeto debe imprimirse una letra en cada línea. De lo contrario, el alfabeto debe imprimirse en la misma línea, separado por un espacio simple. Si se envía una entrada incorrecta al programa, no imprimirá nada.

Ejemplos de entradas:

Entrada:

c

Salida del 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.

Salida del 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
fuente
Sage Notebook opera en el "nivel de consola", entonces, ¿es la "entrada de consola" requerida en este caso simplemente escribiendo la entrada en una celda de la hoja de trabajo?
res
el código más corto gana?
ardnew
@ardnew Sí, el código más corto gana.
Averroes
@res Creo que si bien es necesario codificar la lectura de entrada de alguna manera, puede ser justo desde la perspectiva de las reglas.
Averroes
66
@Averroes La penalización por usar GolfScript es la cantidad de tiempo que lleva aprender un idioma que no tiene un uso real fuera de este tipo de competencia. No creo que penalizar a las personas por usar la herramienta adecuada para el trabajo sea muy productivo.
Gareth el

Respuestas:

12

GolfScript 48 75 73 70 67 66 63 57 53

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

Demos en línea:

Actualizar:

Ahora también se implementa la última regla. Gracias a Ventero por señalar el problema.

Actualizar:

Reescribí el código desde cero y encontré nuevas formas de acortarlo aún más.

Historia de modificaciones:

.,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
fuente
2
Esta solución no sigue el último requisito:If wrong input is send to the program it will not print anything.
Ventero
@Ventero Derecha. Arreglaré esto.
Cristian Lupascu
63 - agradable, somos head2head :), ojalá pudiera entender golfscript;)
bua
Siento lo mismo por P. ¡Buen trabajo! ;-)
Cristian Lupascu el
+1 increíble! dispuesto a romper 50 ;-)?
bua
10

C, 135129128 caracteres

Maldición, tantos números mágicos diferentes, pero no hay forma de deshacerse de ellos.

Tiene que ejecutarse con la entrada como parámetro del programa. Ahora sigue el requisito de "entrada incorrecta".

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);}

Explicación:

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

La **b+6&31parte utiliza el hecho de que los códigos ASCII para caracteres en minúscula / mayúscula son los mismos si solo se miran los últimos 5 bits y los 5 bits restantes están en el rango 1..26.

Versión sin requisito de "entrada incorrecta" (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
fuente
¿Alguna instrucción sobre cómo compilarlo? Me da error de segmentación cuando se ejecuta.
manatwork
@manatwork parece tomar la entrada como parámetro.
shiona
Sí, de hecho, editado para aclarar. Por ejemplo, si el nombre del programa es test, test ctest X.
llámelo
Gracias, lo tengo. Mi C parece estar más oxidada de lo que pensaba.
manatwork
2
Definición de estilo K & R puede ayudar a: main(a,b)char**b;{. Además, uno b++le permitiría reemplazar *b[1]-> **by b[1][1]-> 1[*b].
ugoren
7

Ruby, 72 71 61 caracteres

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

Esta versión ruby ​​usa una expresión regular para verificar la entrada. Afortunadamente, el método de cadena Ruby succhace la mayor parte del trabajo por nosotros (incluido el resumen).

Editar: 61 personajes con la ayuda de chron y Ventero .

Howard
fuente
El mío terminó siendo demasiado similar al tuyo para molestarse en publicar por separado. Mismo enfoque, pero algunos caracteres más cortos (65):c=gets[0];25.times{$><<c.next![-1]+($1?$/:' ')}if~/^[a-z](\.)?$/i
Paul Prestidge
2
Y esto es 62: gets;25.times{$><<$_=$_.next[0]+($1?$/:' ')}if~/^[a-z](\.)?$/i- básicamente lo mismo que el tuyo solo abusando $_y$/
Paul Prestidge
2
@chron: Usando en +=lugar de +, puedes soltar los paréntesis $1?$/:' '.
Ventero
@chron y Ventero: Gracias. Agregué tu código a mi solución.
Howard
6

Rubí: 127 113 92 (?) Caracteres

(No puedo encontrar la regla sobre el puntaje de penalización en el uso -p. Agregado 1 por ahora. Si está mal, corrígeme).

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

Ejecución de muestra:

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
hombre trabajando
fuente
6

Ruby, 101 95

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

Pruébalo en línea

defhlt
fuente
No sigue "Si se envía una entrada incorrecta al programa, no imprimirá nada".
Matt
podría guardar algunos caracteres con ('a'..'z').to_a=>[*?a..?z]
Paul Prestidge
@chron ¡Gracias! ¿Cómo podría perder eso?
defhlt
6

GolfScript, 80 72 caracteres

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

Gran parte del código está probando entradas válidas y la opción "no imprimir nada". La lógica real es de solo 37 caracteres.

Casos de prueba en línea

Howard
fuente
6

q / k4 66 64 63 60 58 56 + 2 penalización

penalización por la variable global init, el algoritmo es 56 como se muestra a continuación:

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]
  • cambiar de if-else a if reorganizar el código y deshacerse de ";" al final

60:

1@/$[&/x in".",l:(a;A)90>*x;1_,/|_[0,l?x;l];" "],'"  \n"@#x;
  • finalmente se deshizo de esta verificación redundante

63:

1@/$[&/x in".",l:(a;A)90>*x;1_,/|_[0,l?x;l];" "],'" \n""."in x; 
  • imprimir caracteres recursivamente en lugar de un objeto completo
  • todavía no puede salir de la comparación de identidad x en "." en dos lugares ... :(
  • se requiere punto y coma al final, de lo contrario la función de impresión (1 @) imprimiría su valor de retorno a stdout ... maldición

64:

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

EDITAR:

Se agregó una penalización de 2 por la inicialización global (x :), lo mismo si se ajusta la función entre paréntesis (como sugiere slackware),
no estoy seguro de si cambiar el espacio de nombres también se debe castigar ... entonces son otros 3

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

Ejemplo:

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
fuente
+1 Buen progreso. Intentaré encontrar otra forma de acortar mi código ahora.
Cristian Lupascu
¿Realmente se puede llamar válido k si está usando definiciones en qk? ;-) Además, si lo ajusta en una función, puede omitir el paso de configuración x: "a", por ejemplo, {$ [...]}
skeevey
@slackwear tienes razón, por eso se llama 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'

Se ha agregado un personaje a la cuenta para la nopción.

El corte más grande solo fue posible debido a ver el comportamiento de los ++personajes en la respuesta de Jon Purdy .

Gareth
fuente
Puede eliminar un par de caracteres eliminando los últimos 2 puntos
ardnew
@ardnew Gracias. :-)
Gareth
1
esto es impresionante
bua
@bua Gracias, todavía estoy tratando de encontrar los personajes para poder atraparte a ti y a w0lf. :-)
Gareth el
s/a.$1/az/para ahorrar 2 más. chop().($2?$/:$")-> chop,$2?$/:$"por 4 más
mafia
5

Perl, 149 , 167

Actualizar

  • Se agregó control de cordura.
  • Tomó una nueva sugerencia sobre la aplicación del 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
fuente
se puede reemplazar $s=($d)?"\n":" ";con $s=$d?$/:$";y tal vez sólo deshacerse de $stodo
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
fuente
No soy fanático de esta restricción, pero existe y su programa no la sigue: "Si se envía una entrada incorrecta al programa, no imprimirá nada".
Matt
Además, parece que imprime un carácter más de lo que debería. El resultado de ejemplo es de 25 caracteres.
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
fuente
1
Este es un desafío de código de golf , por lo que no se necesitan optimizaciones de velocidad y uso de recursos. En lugar de almacenar $v[1]=='.'?"\n":" "el resultado en la variable $ s, deje que PHP lo calcule cada vez en la echodeclaración. De esa manera puedes ahorrar 6 caracteres.
manatwork
1
@manatwork Gracias, lo cambié.
lortabac
4

Mathematica 158 159 204 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
fuente
El tercer caso de uso es f ["H"] o f ["H" "]?
Averroes
Tuve que arreglar el manejo de ".", Agregando 50 caracteres al código. Pero ahora funciona de acuerdo con las instrucciones
DavidC
3

J 43

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

Ejemplos:

|: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 solución evolucionó en el foro de programación J: http://jsoftware.com/pipermail/programming/2012-Austust/029072.html

Autores: AlvordBossCerovskiCyrEllerHuiLambertMcCormickMillerQuintanaSchottSherlockTaylorTherriault

Explicación

Las frases J se ejecutan comenzando por la derecha, pasando el resultado continuo hacia la izquierda a medida que se evalúa. Como es interactivo, podemos ver partes de la solución de forma aislada para comprenderlas mejor.

La parte central genera el alfabeto en mayúsculas y minúsculas en Unicode:

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

El verbo "u:" convierte su argumento numérico a la derecha en caracteres Unicode. El argumento numérico se genera a partir de los valores ASCII para los caracteres en mayúscula y minúscula agregando los números para "A" y "a" cada uno a los valores del 0 al 25 generados 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

La porción de la derecha,

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

busca (i.) la posición del argumento derecho (]) en la izquierda ([), que es el vector de letras arriba) y suelta (}.) uno más (>:) que ese número. El "" 0 "aplica esta frase a los argumentos de 0 dimensiones (escalares).

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

La frase "25 {." Toma los primeros 25 elementos del vector a la derecha.

La penúltima frase "1j1 #" de la izquierda replica su argumento de la derecha según el número de la izquierda. Un número simple hace una replicación simple:

   2 # 'ABCD'
AABBCCDD

Sin embargo, un número complejo, indicado por la "j" entre las porciones real e imaginaria, inserta un elemento de relleno de acuerdo con la parte imaginaria. Aquí indicamos un elemento de relleno por el que está a la derecha de la "j".

   2j1 # 'ABCD'
AA BB CC DD 

Como con la mayoría de las primitivas J, el verbo replicado (#) funciona en matrices numéricas de forma análoga a cómo funciona en matrices de caracteres. Como se muestra aquí,

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

vemos que el elemento de relleno numérico predeterminado es cero, mientras que para los caracteres es el carácter de espacio.

Finalmente, el token más a la izquierda "|:" transpone el resultado de los verbos anteriores a su derecha.

Explicación proporcionada por Devon McCormick. Gracias Devon

bob therriault
fuente
+1 Muy buena solución y explicación. Pensé en probarlo en J, pero no pude encontrar una buena manera (una forma corta) de verificar que la entrada fuera válida. Creo que el mío habría sido al menos dos veces más largo que esto.
Gareth
Gracias Gareth, si miras las primeras soluciones en el enlace de discusión, verás que muchos de nuestros comienzos fueron más largos. Una de las cosas interesantes que encontramos fue la variedad de enfoques que podríamos usar con J. cheers, bob
bob therriault
3

brainfuck, 303

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

Actualmente no es compatible con la If wrong input is send to the program it will not print anythingparte, y probablemente puede ser más corta. Planeo arreglarlo más tarde. En este momento mi cerebro está demasiado jodido para continuar.

caja de cartón
fuente
2

C, 110

A veces imprime "espacios" entre letras, a veces no.

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);}}

Ligeramente más legible:

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);}
}

Carreras:

$ ./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
fuente
2

JavaScript, 137

Lamentablemente un poco detallado ( String.fromCharCodey 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
fuente
2

Perl 77 76 70 68

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

Ediciones:

  1. Guardado un personaje usando expresiones regulares en lugar de substr.

  2. Guardado 6 caracteres usando en maplugar de for.

  3. Salvó 2 caracteres al omitir la nueva línea final.

Jon Purdy
fuente
3
Agradable, pero como has señalado, no cumple con el requisito de que la entrada no válida no dé salida. Arregla eso y obtendrás mi voto positivo.
Gareth el
no parece funcionar para mí en perl 5.14.2. Además, no creo que se requiera \nen su final print, lo que le ahorrará un par de caracteres
nuevo
@ardnew: lo escribí en mi computadora de trabajo, que tiene 5.12.3. Matará al \n, gracias.
Jon Purdy
2

R, 219

Feo, largo ... todavía 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
fuente
2

C, 146 caracteres (terrible)

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)));}

No tengo mucha experiencia en C, lo que probablemente muestra ...>. <Tenía la sensación de que los caracteres como enteros serían útiles, pero en realidad no parecía tener un impacto tan grande como esperaba ... Sin embargo, dejaré mi intento aquí, siéntase libre de sugerir mejoras.

Versión no 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
  );
}
Luciérnaga
fuente
2

VBA 225

Formateado para ejecutarse desde la ventana inmediata:

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

Desglosado en líneas individuales (debe estar rodeado por un Subbloque y necesita un printmétodo diferente para trabajar en un módulo, lo que hace que el código sea más largo):

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
fuente
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;}

Explicación:

Pruébalo en línea.

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
fuente
1

Paperas, 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["." !

No es un lenguaje tan moderno;) Estoy seguro de que queda un poco de espacio de optimización ...

Explicación:

r t 

leer entrada

i t?1A.1"."

compruebe si t coincide con la entrada requerida

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 recorrer el alfabeto. Tenga en cuenta que las paperas se evalúan estrictamente de izquierda a derecha. Verdadero = 1, entonces obtienes 65 o 97 como resultado de p, # es el operador de módulo

pruebas:

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>

(necesitará un entorno de tiempo de ejecución de paperas, es decir, Caché para ejecutar esto)

editar: encabezado en negrita

editar: tenía una solución incorrecta, corregida ahora. Gracias a rtfs y Averroees por señalar esto

kazamatzuri
fuente
el código parece tener 79 caracteres de longitud, no 80
Cristian Lupascu
por desgracia, el primer espacio no es opcional, así que pensé que tengo que contarlo en.
kazamatzuri
Los casos de prueba no terminan en la letra precedente de la que se pasó como parámetro, ¿verdad?
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

Versión 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
fuente
0

Aquí está mi primer intento con APL.

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

si puedo usar una sola variable global, A←2 26⍴6↓26⌽⎕UCS 65+⍳58entonces puedo acortar lo anterior a lo siguiente:

{1 1≡(2⌈⍴⍵)⍴⍵∊'.',,A:⊃(~=/2⍴⍵)⌷(,X,' ')(X←25 1⍴1↓(X⍳⊃⍵)⌽X←(⎕A∊⍨⊃⍵)⌷A)}⍞
Aaron W. Hsu
fuente
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
fuente
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));}

disección

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

Funciona] $ ./test W XYZABCDEFGHIJKLMNOPQRSTUV

Obras] $ ./test M NOPQRSTUVWXYZABCDEFGHIJKL

Works] $ ./test g hijklmnopqrstuvwxyzabcdef

Obras] $ ./test [

Works] $ ./test a bcdefghijklmnopqrstuvwxyz

Funciona] $ ./test Z ABCDEFGHIJKLMNOPQRSTUVWXY


Gracias por algo de reflexión.

essbeev
fuente
No está agregando nuevas líneas si un '.' es dado. Además, no debe generar nada si la entrada no lo es [A-Za-z]\.?, si entendí bien la pregunta.
marinus
# 1 ¡Oh! Estaba absorto en hacer el código corto ... # 2. ver el resultado de 'prueba [' no 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]));
principianteProg
fuente
Puede formatear su texto para que aparezca como un bloque de código. Lea la guía aquí para formatear sus publicaciones. Además, puede guardar algunos caracteres utilizando nombres de variables de un solo carácter.
Gareth el
1
Una entrada no válida debe imprimir nada, por lo que su diedeclaración puede reducirse, ahorrando un montón ...
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);}}}

Sin comprimir

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
fuente
No olvides agregar una explicación a tu respuesta.
Justin
Este programa ni siquiera intenta jugar con las reglas. 1: Si la letra está en mayúscula, debe mostrar el alfabeto en mayúscula. 2: El alfabeto impreso debe terminar en la letra precedente de la insertada. 3: Si se agrega un parámetro adicional a la entrada (un punto simple), el alfabeto debe imprimirse una letra en cada línea. De lo contrario, el alfabeto debe imprimirse en la misma línea, separado por un espacio simple. 4: Si se envía una entrada incorrecta al programa, no imprimirá nada. Esta es una falta de 4 de 4.
RobIII
^ Aparte de eso, le insto a que eche un vistazo a mis comentarios anteriores aquí . Se puede reemplazar charcon vary afeitado 1 punto de su puntuación, perder el .ToCharArray()(una string es un char-array ya se puede iterar sobre!), Perder el string[] apuesto que usted no está tratando con argumentos de línea de comandos, perder el espacio de nombres, Su constante 'c' debe leerse desde la entrada de la consola, perder la cadena del alfabeto y usar ASCII en su lugar, etc. Es genial que juegues, pero intenta hacer un esfuerzo decente; la mayoría de las presentaciones suyas parecen ser solo curricán.
RobIII
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 a schnaader por el truco d + 6 y 31.

http://ideone.com/ts1Gs9

Mattnewport
fuente
0

Bash: 110 bytes

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

En términos de explicación, es bastante sencillo, no hay trucos de magia: esto es algo para lo que bash es intrínsecamente adecuado. En términos de los bits no obvios:

  • {a..z}es un truco muy poco utilizado en bash: se expande a a b c d.... Puedes hacer lo mismo para generar secuencias numéricas.
  • Bash puede hacer coincidir expresiones regulares, [[ $1 =~ [a-z] ]]ejecuta una coincidencia de expresiones regulares contra el primer argumento del programa para los caracteres de la a a la z. Del mismo modo para AZ. Sin embargo, necesita corchetes dobles, [no puede hacerlo.
  • ${1:1:1}obtiene una subcadena de $ 1 (el primer argumento), un carácter en, un carácter largo, es decir, devuelve el segundo carácter de la cadena, lo que esperamos que sea ..
  • sed 's/ /\n/g'regex simple: busca y reemplaza espacios con nuevas líneas. Si .es el segundo carácter de la cadena, canalizamos la entrada a esto, o de lo contrario ...
  • cat es el truco final aquí: si no queremos reemplazar espacios con nuevas líneas, en su lugar, enviamos stdin a cat, que simplemente lo devuelve a la salida.
Alboroto
fuente
No olvides agregar una explicación.
Justin