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
Respuestas:
GolfScript
48 75 73 70 67 66 63 5753Demos en línea:
Caso de prueba 1 ('c')
Caso de prueba 2 ('H')
Caso de prueba 3 (entrada no válida)
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:
fuente
If wrong input is send to the program it will not print anything.
C,
135129128caracteresMaldició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".
Explicación:
La
**b+6&31
parte 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):
fuente
test
,test c
test X.
main(a,b)char**b;{
. Además, unob++
le permitiría reemplazar*b[1]
->**b
yb[1][1]
->1[*b]
.Ruby,
727161 caracteresEsta versión ruby usa una expresión regular para verificar la entrada. Afortunadamente, el método de cadena Ruby
succ
hace la mayor parte del trabajo por nosotros (incluido el resumen).Editar: 61 personajes con la ayuda de chron y Ventero .
fuente
c=gets[0];25.times{$><<c.next![-1]+($1?$/:' ')}if~/^[a-z](\.)?$/i
gets;25.times{$><<$_=$_.next[0]+($1?$/:' ')}if~/^[a-z](\.)?$/i
- básicamente lo mismo que el tuyo solo abusando$_
y$/
+=
lugar de+
, puedes soltar los paréntesis$1?$/:' '
.Rubí:
12711392 (?) 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).Ejecución de muestra:
fuente
Ruby,
10195Pruébalo en línea
fuente
('a'..'z').to_a
=>[*?a..?z]
GolfScript,
8072 caracteresGran 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
fuente
q / k4
66 64 63 60 5856 + 2 penalizaciónpenalización por la variable global init, el algoritmo es 56 como se muestra a continuación:
56:
58:
60:
63:
64:
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
Ejemplo:
fuente
Perl,
1311271171121061041029896929190937166656458 caracteresUso:
Se ha agregado un personaje a la cuenta para la
n
opción.El corte más grande solo fue posible debido a ver el comportamiento de los
++
personajes en la respuesta de Jon Purdy .fuente
s/a.$1/az/
para ahorrar 2 más.chop().($2?$/:$")
->chop,$2?$/:$"
por 4 másPerl,
149, 167Actualizar
fuente
$s=($d)?"\n":" ";
con$s=$d?$/:$";
y tal vez sólo deshacerse de$s
todoPython, 83
fuente
PHP
120119113fuente
$v[1]=='.'?"\n":" "
el resultado en la variable $ s, deje que PHP lo calcule cada vez en laecho
declaración. De esa manera puedes ahorrar 6 caracteres.Mathematica
158 159 204 199 183 167 165162Código
Uso
fuente
J 43
Ejemplos:
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 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:
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":
La porción de la derecha,
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).
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:
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".
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í,
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
fuente
brainfuck, 303
Actualmente no es compatible con la
If wrong input is send to the program it will not print anything
parte, y probablemente puede ser más corta. Planeo arreglarlo más tarde. En este momento mi cerebro está demasiado jodido para continuar.fuente
C, 110
A veces imprime "espacios" entre letras, a veces no.
Ligeramente más legible:
Carreras:
fuente
JavaScript, 137
Lamentablemente un poco detallado (
String.fromCharCode
ycharCodeAt
).fuente
Perl
77767068Ediciones:
Guardado un personaje usando expresiones regulares en lugar de
substr
.Guardado 6 caracteres usando en
map
lugar defor
.Salvó 2 caracteres al omitir la nueva línea final.
fuente
\n
en su finalprint
, lo que le ahorrará un par de caracteres\n
, gracias.R, 219
Feo, largo ... todavía funciona.
Uso:
fuente
C, 146 caracteres (terrible)
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:
fuente
VBA 225
Formateado para ejecutarse desde la ventana inmediata:
Desglosado en líneas individuales (debe estar rodeado por un
Sub
bloque y necesita unprint
método diferente para trabajar en un módulo, lo que hace que el código sea más largo):fuente
Java 8, 127 bytes
Explicación:
Pruébalo en línea.
fuente
Paperas,
91,86,82,79, 76No es un lenguaje tan moderno;) Estoy seguro de que queda un poco de espacio de optimización ...
Explicación:
leer entrada
compruebe si t coincide con la entrada requerida
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:
(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
fuente
JavaScript: 141
Versión comentada:
jsFiddle DEMO
fuente
Aquí está mi primer intento con APL.
si puedo usar una sola variable global,
A←2 26⍴6↓26⌽⎕UCS 65+⍳58
entonces puedo acortar lo anterior a lo siguiente:fuente
C ++ 11
fuente
C (111)
disección
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.
fuente
[A-Za-z]\.?
, si entendí bien la pregunta.Perl, 226 caracteres
fuente
die
declaración puede reducirse, ahorrando un montón ...C # 170
Sin comprimir
fuente
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.char
convar
y afeitado 1 punto de su puntuación, perder el.ToCharArray()
(unastring
es un char-array ya se puede iterar sobre!), Perder elstring[] a
puesto 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.C, 117
Crédito a schnaader por el truco d + 6 y 31.
http://ideone.com/ts1Gs9
fuente
Bash: 110 bytes
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 aa b c d...
. Puedes hacer lo mismo para generar secuencias numéricas.[[ $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.fuente