Hay 97 caracteres ASCII que las personas encuentran regularmente. Se dividen en cuatro categorías:
Cartas (52 en total)
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
Números o dígitos (10 en total)
0123456789
Símbolos y puntuación (32 en total)
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
Espacio en blanco (3 en total)
Espacio
\t
y nueva línea\n
. (Trataremos las variantes de nueva línea\r\n
como un solo personaje).
Para mayor concisión, llamaremos a estas categorías L, N, S y W, respectivamente.
Elija cualquiera de las 24 permutaciones de las letras LNSW
que desee y repítalas indefinidamente para formar una plantilla de programación para usted.
Por ejemplo, puede elegir la permutación NLWS
, por lo que su plantilla de programación sería:
NLWSNLWSNLWSNLWSNLWS...
Necesita escribir un programa o función basado en esta plantilla, donde:
Cada
L
se reemplaza con cualquier letra (ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
).Cada
N
se reemplaza con cualquier número (0123456789
).Cada
S
se reemplaza con cualquier símbolo (!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
).Cada
W
se reemplaza con cualquier carácter de espacio en blanco (\t\n
).
Básicamente, su código debe seguir el patrón
<letter><number><symbol><whitespace><letter><number><symbol><whitespace>...
como sugiere el título de la pregunta, excepto que puede elegir un orden diferente de las cuatro categorías de caracteres, si lo desea.
Tenga en cuenta que:
Los reemplazos para una categoría pueden ser caracteres diferentes. Por ejemplo, se
9a ^8B\t~7c\n]
ajusta válidamente a la plantillaNLWSNLWSNLWS
(\t
y\n
serían sus caracteres literales).No hay restricciones de longitud de código. por ejemplo,
1A +2B -
and1A +2B
y1A
y1
todos se ajustan a la plantillaNLWSNLWSNLWS...
.
Lo que debe hacer su código conformado por plantilla es tomar un carácter ASCII no extendido y generar un número del 0 al 4 en función de la categoría de la que es miembro en la categorización anterior. Es decir, salida 1
si la entrada es una letra, 2
si es un número, 3
si es un símbolo y 4
si es un espacio en blanco. Salida 0
si la entrada no es ninguno de estos (un carácter de control ).
Para la entrada, también puede tomar un número del 0 al 127 inclusive que represente el código del carácter ASCII de entrada.
Los pares de entrada (como código char) y salida que debe tener su código son exactamente los siguientes:
in out
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 4
10 4
11 0 or 4
12 0 or 4
13 0 or 4
14 0
15 0
16 0
17 0
18 0
19 0
20 0
21 0
22 0
23 0
24 0
25 0
26 0
27 0
28 0
29 0
30 0
31 0
32 4
33 3
34 3
35 3
36 3
37 3
38 3
39 3
40 3
41 3
42 3
43 3
44 3
45 3
46 3
47 3
48 2
49 2
50 2
51 2
52 2
53 2
54 2
55 2
56 2
57 2
58 3
59 3
60 3
61 3
62 3
63 3
64 3
65 1
66 1
67 1
68 1
69 1
70 1
71 1
72 1
73 1
74 1
75 1
76 1
77 1
78 1
79 1
80 1
81 1
82 1
83 1
84 1
85 1
86 1
87 1
88 1
89 1
90 1
91 3
92 3
93 3
94 3
95 3
96 3
97 1
98 1
99 1
100 1
101 1
102 1
103 1
104 1
105 1
106 1
107 1
108 1
109 1
110 1
111 1
112 1
113 1
114 1
115 1
116 1
117 1
118 1
119 1
120 1
121 1
122 1
123 3
124 3
125 3
126 3
127 0
Las entradas 11, 12 y 13 corresponden a caracteres que a veces se consideran espacios en blanco, por lo tanto, sus salidas pueden ser 0
o 4
como desee.
El código más corto en bytes gana.
fuente
Respuestas:
Haskell 300 bytes
Este código no debe tener una nueva línea final. La función
m1
toma la entrada como aChar
y devuelve la respuesta como aChar
.No pude resistir un desafío que alguien afirmó que era imposible para los idiomas "convencionales".
Puede cuestionar si Haskell cuenta, pero la mayoría de las palabras clave y los identificadores son caracteres múltiples y no se pueden usar. Sin embargo, las definiciones de funciones de nivel superior, las listas, los literales de cadena, las comparaciones estrictas, la coincidencia de patrones y la ramificación con guardias funcionan, siempre que las letras aparezcan justo antes de los dígitos, y si los símbolos también aparecen antes de las letras, tenemos caracteres de escape como
\t
y\r
. Desafortunadamente, las permutaciones que funcionan para la programación general no permiten literales numéricos, por lo que no pude obtener números de ninguna manera útil.Cómo funciona:
m1
.x1
es el personaje que se analiza.f1
función divide la cadena con la coincidencia de patrones de lista y tiene tres ramas: para cuando los límites son símbolos más grandes que el espacio, para cuando los límites se escapan, los caracteres de control son más pequeños que el espacio y para manejar la comparación final con el espacio en sí. Los nombres de las piezas de la lista son mnemotécnicos para la primera rama: letra, número, espacio, símbolo, resto.b1
función maneja la ramificación de dos caracteres de límites1 < b1
a la vez.Pruébalo en línea
fuente
Retina , 113 bytes
Letra, Número, Espacio, Símbolo, Repetir
Pruébalo en línea!
¡Pruébalo en sí mismo!
La retina parece una buena herramienta para este trabajo: podemos usar todo tipo de caracteres de manera flexible en la configuración del escenario, y tenemos algunas clases de caracteres predefinidas que pueden ser útiles.
Creo que este problema podría resolverse con etapas de reemplazo o etapas de transliteración; Elegí las transliteraciones porque son más flexibles y tienen las clases de caracteres más útiles. Con respecto al patrón de la fuente, me vi obligado a poner símbolos justo antes de las letras para usarlas
\n
en las nuevas líneas (en realidad, tuve una solución más corta usando el ¶ más práctico para las nuevas líneas, pero los caracteres no ascii están prohibidos).Explicación
Las primeras etapas son transliteraciones. Usamos
+
y1
como opciones para mantener el patrón, pero no afectarán el resultado de la etapa. La sintaxis esT`from`to
asignar cada carácter defrom
al personaje en la misma posición ento
. Sito
es más corto quefrom
, su carácter final se repite tanto como sea necesario. Sifrom
tiene caracteres repetidos, solo se considera la primera aparición de cada uno. Algunas letras corresponden a clases de caracteres, por ejemplo,d
es equivalente a0123456789
.Con esto, asignamos algunos caracteres a otros caracteres de la misma clase para "hacer algo de espacio" para las siguientes transliteraciones. (
a
->b
,0
->1
,space
->tab
,@
->;
). La final:D0
es solo una carita: D0Comenzamos con dígitos,
d
es la clase de caracteres0-9
, aquí estamos transformando0
->a
,1-9
->2
,space
->2
: las transliteraciones para0
yspace
son incorrectas, pero esos caracteres han sido eliminados por la transliteración previa.Los espacios en blanco, transformar
a
->a
, (9
,tab
,\n
,space
) ->4
.9
ya se eliminó en la etapa anterior.Letras, aquí usamos dos clases de caracteres diferentes (por falta de una más completa):
l
para letras minúsculas yL
para letras mayúsculas. Todos se asignan1
, junto con algunos otros personajes que se han tratado en las etapas anteriores.Símbolos Como todas las demás clases se han convertido en un dígito, aquí asignamos todos los dígitos a sí mismos con
d
->d
, y luego todos los caracteres imprimibles3
conp
->3
. Los dígitos también se encuentran entre los caracteres imprimibles, pero gana la primera transliteración.Ahora necesitamos asignar
0
caracteres de control, pero no he encontrado una forma válida de abordar explícitamente esa clase. En su lugar, convertiremos cada dígito a unario: los caracteres de control no son dígitos y, por lo tanto, se consideran como la cadena vacía, que es igual0
a unario. Desafortunadamente, el comando de conversión unaria en retina es$*
, que son dos símbolos cerca uno del otro, por lo que en su lugar convertiremos "manualmente" usando sustituciones.Nuestro dígito unario es
$n
, que es un patrón de reemplazo para las nuevas líneas.\b
coincide con un "límite", donde una palabra alfanumérica comienza o termina: en nuestro caso, siempre coincidirá antes de cualquier número. Básicamente, estamos reemplazando cada númeron
con una nueva línea másn-1
.Al final, contamos el número de nuevas líneas y obtenemos el resultado deseado.
fuente
Cardenal
22402224 bytesPlantilla utilizada LSNW
El código tiene una nueva línea final.
Cómo funciona:
Este código tiene muchos caracteres que no se usan.
% libera un puntero en todas las direcciones. 3 de ellos simplemente llegan al final de una línea y mueren.
El último puntero toma una entrada en:
Esta entrada se compara con cada valor de 0 a 127.
Impresiones:
0 para 0-8
4 para 9-12
0 para 13-31
4 para 32
3 para 33-47
2 para 48-57
3 para 58-64
1 para 65-90
3 para 91-96
1 para 97-122
3 para 123-126
0 para 127
Operaciones utilizadas:
J = Saltar la siguiente operación si no es cero
^ = Cambiar la dirección hacia arriba
> = Cambiar la dirección hacia la izquierda
- = Disminuir
+ = Incrementar
: = Tomar la entrada
% = Crear punteros al inicio del programa
x = Eliminar el puntero
0 = Establecer activo valor del puntero a 0
Pruébalo en línea
fuente
Perl 5 , 293 bytes
Código de 291 bytes + 2 para
-0p
.Me han informado que los indicadores de la línea de comandos son gratuitos, pero los he agregado aquí para mayor visibilidad, ya que el enlace TIO no incluye
-0
, para facilitar las pruebas.Pruébalo en línea!
Este es un desafío particularmente difícil de resolver en casi cualquier idioma, por lo que estoy muy contento de haber podido (finalmente, un montón de retoques durante bastante tiempo) hacer que esto funcione en Perl. Esperemos que el espacio en blanco adicional antes y después del número no sea un problema.
Seleccionar el orden de la secuencia fue particularmente complicado, pero por suerte
s///
yy///
puede aceptar cualquier otro carácter como delimitador, por lo que fue posible usar letras, espacios, números, símbolos, que permitens 0...0...0;
yy 0...0...0;
.El primero que se requiere para la appraoch era sustituir
_
con!
de modo que\w
sólo habría que coincida[0-9a-zA-Z]
, vuelva a colocar todos los espacios en blanco (\s
) con\t
, todos los dígitos con\r
y todos los caracteres de palabra restantes (\w
) con\n
una fácil adaptación más adelante. Luego, usando ely///
operador, todos los símbolos restantes se convierten a caracteres de palabra!
a_
y todos los demás caracteres (entre9
ya
) se desplazan hacia abajo 9 lugares, convirtiéndolos en letras o números. Estos se reemplazan a través de\w
con3
y el otro, las sustituciones realizadas anteriormente se reemplazan con sus valores numerados.fuente
Espacio en blanco , 1332 bytes
El orden es
1234
/LNSW
(letra, dígito, símbolo, espacio en blanco).Pruébelo en línea (ingrese como número entero que representa el unicode de un carácter).
Explicación:
El espacio en blanco es un lenguaje basado en la pila donde se ignoran todos los caracteres, excepto los espacios, las pestañas y las nuevas líneas. Aquí está el mismo programa sin el
YO!
( 333 bytes ):Se agregaron letras
S
(espacio),T
(tabulación) yN
(nueva línea) solo como resaltado.[..._some_action]
agregado solo como explicación.Pruébalo en línea.
Programa en pseudocódigo:
fuente