Reto
Escriba un programa / función no vacío p
que, dada una cadena de entrada no vacía s
, muestre la posición de la primera aparición de cada carácter s
en el código fuente de p
.
Por ejemplo, si su programa es
main() { cout << magic << cin }
^0 ^5 ^10 ^15 ^20 ^25
y recibe una entrada abcd{
, la salida debe ser
[1, x, 9, x, 7] (0-based) [2, x, 10, x, 8] (1-based)
En este caso, x
representa cualquier salida que no es una salida válida para una posición de carácter (por ejemplo, un número negativo, 0
si se utiliza la indexación basada en 1, NaN
, Inf
, la cadena potato
, un número mayor que la longitud de su programa, etc.).
Restricciones
No está permitido leer el código fuente (como en una quine adecuada). El uso de comentarios está permitido, pero cuenta para su puntaje.
La entrada y la salida se pueden hacer en un formato razonable, pero deben ser inequívocas (solo delimitadores adicionales, sin rand
flujo y alegando que la respuesta está en algún lugar), consistente (por ejemplo, lo x
de arriba siempre debe ser el mismo valor) y humano. LEGIBLE ; por ejemplo, una cadena o una matriz de caracteres. Puede suponer que la entrada es una cadena (o matriz) de caracteres ASCII imprimibles; no es necesario manejar todo el conjunto Unicode.
Página de códigos personalizada o ascii no imprimible en su código?
Si su idioma utiliza una página de códigos personalizada (Jelly, APL, etc.), debe tener eso en cuenta (por lo que un programa €æÆ
debe generar [1, x, 2]
una entrada €%æ
). Usar solo caracteres no ASCII para generar -1
siempre (dado que la entrada es solo ASCII) no es una solución válida. Puede suponer que su programa acepta de forma nativa su página de códigos personalizada, es decir, si su programa tiene un método para convertir un carácter A
en un entero 65
(codificación ASCII), puede suponer que ahora convierte el 65º carácter en su página de códigos 65
.
Inspirado en el siguiente desafío: conciencia posicional
01030708070
,?Respuestas:
Python2, 55 bytes
Comienza con una cadena que contiene todos los caracteres utilizados en el código y luego busca en los índices
fuente
raw_input
.Lenguage , 56,623 bytes
A continuación hay un hexdump de los primeros 256 bytes. Los bytes restantes se pueden elegir arbitrariamente.
La salida está en bytes, como es habitual en brainfuck et al.
Cómo funciona
Este es un programa simple para gatos, específicamente
,[.,]
.El código fuente contiene todos los valores de 256 bytes en orden, por lo que el índice de cada byte coincide con su valor.
fuente
+[,.]
una puntuación mucho mejor?Lenguaje , 1.22e7 bytes
Consiste en
12263215
NUL
bytes, (Hex 0x00) .Emite un
NUL
para cada personaje que no aparece en la fuente.Esto se traduce en el siguiente programa Brainfuck
Y con un colapso ...
Esto solo muestra el gran poder de Lenguage como lenguaje de golf. Temerlo
fuente
,[>.,]
sería más corto?Jalea ,
109 bytesPruébalo en línea!
Cómo funciona
fuente
pbrain,
402356340338329 bytesUf, @KritixiLithos y yo hemos estado trabajando en esto durante 4 días.
Imprime
0x00
si input char no está en el programa, de lo contrario, el índice del char (basado en 1) en hexadecimal. Pruébalo en línea!Explicación:
Esta última función es el bucle. Recorre los caracteres seleccionados
[(:<>)+,-.]
en orden y compara la entrada con el carácter. Ahora voy a dar una explicación más profunda sobre cómo funciona este ciclo.La pila se ve así mientras está en un bucle. El bucle se ejecutará hasta que
12-n
sea0
. Luego tenemos el contador que esn+2
. Este contador también es el número de la función para cada uno de los caracteres seleccionados. Entoncesn=0
, cuandon+2
corresponderá al primer carácter, es decir[
.>[->+>+<<]>>[-<<+>>]<:
hace exactamente eso, convierte el contador en el personaje.Una vez que el puntero está donde está el cursor, compararemos el carácter producido a partir de la variable del contador con la entrada mientras los conservamos.
Z
es0
cuando el carácter es igual a la entrada, o algún otro entero distinto de cero de lo contrario.Ahora se nos ocurre una declaración if para verificar esta igualdad.
Si
Z
no es cero, es decir, el carácter y la entrada no son iguales, incrementamos el siguiente lugar de memoria.Después de salir de esta declaración if, disminuimos el siguiente lugar de memoria. Ahora este lugar de memoria contiene
!Z
. Finalmente, usando esto, sacamos el índice del carácter si coincide con la entrada y luego salimos del ciclo por la fuerza. De lo contrario, continuamos con el ciclo hasta que termine o se encuentre una coincidencia.fuente
CJam ,
1412 bytesUtiliza indexación basada en 0 y
-1
para caracteres que no aparecen en la fuente.Pruébalo en línea!
fuente
Javascript, 34 bytes
Toma la entrada como una matriz de cadenas,
x
es-1
(indexación basada en 0).fuente
s='s=%s;print s%%s';print s%s
en Python. No incluye elf=
, así que está biena
se supone que la entrada es una cadena. No haymap
función para las cadenas.C,
153152143 bytesPruébalo en línea!
fuente
Ruby,
41 88 86 71 69 67 6156 bytesThx Lynn por matar 6 bytes
fuente
a='p$<.chrsm{| #index};"';p$<.chars.map{|c|"a='#{a}".index c}
debería funcionar también, tomando la entrada de STDIN.> <> (Pescado) 70 bytes
Probablemente el más largo> <> 1 liner que he hecho.
Imprimirá la salida para cada carácter encontrado en una línea separada (0 indexado).
Un carácter no encontrado siempre imprimirá la longitud del código + 1 (podría cambiar esto si no se considera correcto en su estado actual), por lo que en este caso 71 siempre serán los caracteres "No encontrado".
Encontraré una explicación una vez que tenga tiempo.
Algunos casos de prueba;
## K = 1 \ n1 \ n71
# "# = 1 \ n69 \ n1
Pruébalo en línea
> <> idioma
fuente
Perl 6 ,
5052 bytesTraducción de la solución Ruby de GB y la solución Python de Rod .
Una lambda que ingresa una lista de caracteres y genera una lista de índices basados en cero (
Nil
para caracteres inexistentes).EDITAR: se corrigió un descuido; se requiere agregar 2 bytes :(
fuente
Clojure,
435648 bytesEditar: ¡Maldición, me olvidé
2
! Incrementado de 43 a 56.Edición 2: se actualizó el código de muestra debajo de este texto, se actualizó el número de bytes que no se incluirán
(def f ...
), sino solo la parte del mapa hash.El mapa hash consta solo de caracteres
01234{\\}
y codifica sus ubicaciones. En Clojure, los mapas hash pueden usarse para funciones, como se muestra en este ejemplo completo (f
podría reemplazarse por la definición del mapa hash):Supongo que esto cuenta :)
fuente
JavaScript, 39 bytes
fuente
[...s]
por favor?Pyth, 11 bytes
Un programa que toma la entrada de a
"quoted string"
, con las comillas en la cadena escapó con un precedente\
, e imprime una lista de valores indexados a cero con-1
caracteres que no están en la fuente.Pruébalo en línea!
Cómo funciona
fuente
05AB1E , 19 bytes
Pruébalo en línea!
Esto genera -1 en lugar de caracteres faltantes.
Luis Mendo publicó esto (ligeramente modificado) en Golf, ¡una quine para bien! , agregar "s" y "k" a ese resultado también da como resultado esta respuesta. Sin embargo, no puedo tomar el crédito por esa modificación trivial ... Luis, puedes enviarme un mensaje si deseas volver a publicar esto y lo eliminaré. Si desea ver mi progreso antes de encontrar esa pregunta, vea las ediciones. Bueno ... fue significativamente al igual que su en un punto.
fuente
SmileBASIC,
128968886 bytesUna cosa importante a tener en cuenta es que esto no es realmente un desafío quine. Solo necesita el código fuente hasta el último carácter único .
Puse al menos 1 de cada carácter al comienzo del código:
?R<3+CD,4LINPUT(S$)WHILE"
así que solo tengo que almacenar una copia del programa hasta la primera comilla.fuente
Python,
9088 bytesCaso de prueba:
fuente
Apilado , no competitivo, 36 bytes
Cuando dije que este lenguaje aún estaba en desarrollo, lo dije en serio. Aparentemente,
prompt
solía consumir toda la pila. Por eso no puedo tener cosas buenas. Pruébalo aquí!Este es el marco de trabajo estándar. Básicamente,
:
duplica la función[...]
en la pila, que luego se ejecuta con!
. Luego, el interior de se[...]
ejecuta con la función en la pila. Lo convierte en una cadena, agrega:!
(el programa en sí), luego toma una entrada de cadena conprompt
.CS
lo convierte en una cadena de caracteres. Una cadena de caracteres es un poco diferente de una cadena normal en que tiene operadores vectorizados sobre ella. En este caso, seindex
vectoriza sobre la entrada, produciendo cada índice de la cadena de entrada en el programa, finalmente seout
pone.Para la entrada
Hello, World!
, esto da:Intenté usar el que no tiene una quine (es decir, codificar la cadena de caracteres que aparecen en su fuente), pero solo hay un tipo de comillas en Apilado, a saber
'
, por lo que sería más largo hacer ese tipo de solución.fuente
Casco , 12 bytes
Pruébalo en línea!
Explicación
La explicación se usa
¨
para delimitar cadenas y'
delimitar caracteres:fuente
Java 8,
172122bytesIndexado a 0, y proporciona
-1
caracteres que no son parte del código fuente.Explicación:
Pruébalo en línea.
fuente
J ,
3122 bytesPruébalo en línea!
1 indexado, 0 para caracteres que no están presentes en el código.
''
representa una cita simple. Encuentre cada carácter en la cadena11|1+i.~&'
, agregue 1, módulo 11.fuente
> <> , 31 bytes
Pruébalo en línea!
La salida está indexada en 1, lo que
32
significa que el carácter no está en el código.fuente
Perl 5 con
-pl
43 bytesUtiliza entradas separadas por nueva línea e imprime
-1
caracteres que no aparecen en el programa.Pruébalo en línea!
fuente
Stax , 19 bytes
Ejecutar y depurarlo
Emite un índice basado en 0, un carácter por línea. Resulta que es más corto que modificar la
"34bL"34bL
quine que escribí anteriormente.fuente