... al menos para alguna definición de "auto-modificación".
La tarea
En este desafío, su tarea es escribir tres cadenas A
, B
y C
que satisfagan las siguientes propiedades.
La cadena
B
tiene una longitud de al menos 1.Para cada
n ≥ 0
, la cadena es un programa válido (es decir, definición de función o programa ejecutable completo) en el lenguaje de programación de su elección. La repetición de superíndice denota, por lo que este medio de las cuerdas , , , etc. Cada programa tiene una cadena como entrada y devuelve una cadena que como salida.ABnC
AC
ABC
ABBC
ABBBC
Para cualquiera
m, n ≥ 0
, si el programa se ejecuta con entrada , vuelve . Para las entradas que no son de esta forma, el programa puede hacer cualquier cosa, incluido el bloqueo.ABmC
ABnC
ABm*n+1C
Algunos ejemplos en el formato program(input) -> output
:
AC(AC) -> ABC
ABC(AC) -> ABC
ABBBBBC(AC) -> ABC
AC(ABC) -> ABC
AC(ABBBBC) -> ABC
ABC(ABC) -> ABBC
ABBC(ABC) -> ABBBC
ABBBBC(ABBBC) -> ABBBBBBBBBBBBBC
ABBBC(ABBBBBBC) -> ABBBBBBBBBBBBBBBBBBBC
Reglas y puntuación
Su puntaje es la longitud total de A
yC
, menor puntaje es mejor. Tenga en cuenta que si bien B
no se cuenta para la puntuación, debe producirse por A
y C
como en el primer ejemplo.
Las lagunas estándar no están permitidas. Los programas no pueden acceder directa o indirectamente a su propio código fuente (excepto cuando se les da como entrada). Se requiere que identifique las cadenas y A
, en su respuesta, de alguna manera, y se le anima a explicar su solución.B
C
fuente
Pyth, 10
Dividimos la fuente en dos líneas. La primera línea es A, la segunda línea son los Bs. Como A está en la primera línea, la primera
w
simplemente imprime A: fácil, listo.En Pyth, los ceros a la izquierda son tokens separados, así que en
[00)
realidad lo son[0, 0]
. Tenga en cuenta que la primera línea termina enl[
, y la segunda línea consiste en0000...
. Entonces, enl[
realidad cuenta el número de Bs en este programa. La segunda sew
lee en la segunda línea de la entrada: este es el número de Bs de la entrada. Desde aquí es una simple multiplicación, incremento y salida de tantos ceros.fuente
Retina ,
2519 bytesABC
Código de ejemplo :El código tiene dos pasos sustitutos:
cambie la entrada
AB^mC
enAB^(m*n)C
cambiando cadaB
aB^n
:]\]
coincide con cadaB
entrada y nada más gracias al escape en las líneas del patrón]]...]]
esB^n
cambiar
B^(m*n)
aB^(m*n+1)
porm`^]*$
tomar la línea con sólo]
's]$0]
agregando un par adicional de]]
manera que esta línea no coincida con la primera expresión regularHe agregado 3 bytes a la puntuación para el
-s
indicador de varias líneas que se necesita para que todo el código Retina pueda estar en un archivo.2 bytes guardados gracias a @ MartinBüttner.
fuente
Python 3, 51 bytes
Ejemplo de uso:
La función calcula
n*m+1
con(1+len("xxx")*(len(s)-51))
dónde haym
x
's en la cadena (xxx
parte es elB^m
). Multiplicar la cadena"x"
con este número daB^(n*m+1)
y la función tomaA
yC
sale de la entrada y concatena todo esto para obtenerAB^(n*m+1)C
.El mismo enfoque en J:
J, 35 bytes
fuente
CJam, 22
Ejemplo de ejecución:
lo que se traduce en
con entrada como
que da el siguiente resultado:
Cómo funciona :
Veamos qué programas
AC
y quéABC
aspecto tenemos:Notamos que
C
=B_~
Veamos lo que
B
está haciendo:Ahora veamos qué
AC
hará sin ninguna entrada:Wow, la salida es
ABC
.Básicamente contamos cuántos
B
existen en el código. Entonces, ¿cuántos hay en la entrada (usando longitud). Multiplíquelos, incremente dos veces (ya queC
también tieneB
) y agregue_~
para obtenerC
Pruébalo en línea aquí
fuente
Haskell , 50 bytes
f
es una función que toma y devuelve aString
.La cadena B es solo un espacio único, mientras que C comienza con uno.
Pruébalo en línea!
_:b=" "
asigna todos menos el primero de los espacios en la cadena literal ab
, haciendo que sea igual a las copias m B del programa .s
es la cadena de entrada.a:c<-words s
lo divide en palabras separadas por espacios, de modo que sea
convierte en A y sec
convierte en una lista de las palabras que comprenden C. Las copias B se ignoran ya quewords
exprime múltiples espacios (que el resto del programa evita).drop 50s
es una cadena con una longitud igual al número n de copias B en la entrada.drop 50s>>b
concatena esa cantidad de copiasb
, dando mn espacios.unwords$a:(drop 50s>>b):c
une todas las cadenas nuevamente con espacios. Como hay una "palabra" adicional(drop 50s>>b)
insertada en la lista, también hay un espacio de unión adicional, que agrega automáticamente el +1 a la multiplicación.fuente
Matlab, 85
La primera vez que hice un desafío tan abstracto, ¡para mí fue más un desafío de codificación que un desafío de código de golf!
Las tres cadenas son, sin las comillas:
Cómo funciona: divido el argumento de entrada en el espacio en blanco, por lo que
n
se puede determinar a partir del número de partes de la cadena. B funciona como una especie de contador para obtenerm
. Para reconstruir la respuesta, uso A y C de la división, repito B m * n + 1 veces e inserto los espacios usando su valor ASCII, para que no se produzcan divisiones no deseadas en C.EDITAR: whoops, accidentalmente contado A + B
fuente
C (gcc) , 81 bytes
El requisito de identificar las cadenas parece estar en desacuerdo con que se nos permita un comportamiento arbitrario para la entrada ilegal, a menos que tengamos estándares bastante laxos de lo que implica la identificación. Naturalmente, tomé la interpretación que arroja la mayor cantidad de bytes.
Pruébalo en línea!
fuente
TI-Basic (serie 83), 65 bytes
Segmento A (33 bytes):
Segmento B:
Segmento C (32 bytes):
¡Estoy realmente emocionado de encontrar este desafío parecido a una quine! La mayoría de las quines no funcionan en TI-Basic sin al menos un poco de trampa, porque no hay forma de escapar del
"
símbolo. (En ambos sentidos de la palabra "escape".) Pero aquí, obtenemos una cadena de entrada a través delInput
comando, y al escribir a"
está perfectamente bien.Todavía hay una cierta cantidad de tonterías de TI-Basic para trabajar por aquí: una cadena vacía no es válida, por lo que la solución ingenua de insertar la cadena
"XXX...XX"
en un bucle no funcionará cuando n = 0. En cambio, calculamos manualmente el valor de mn + 1 e insertamos la cadena"X"
muchas veces.Las constantes de magia
27
y28
en el programa son un poco fuera de la cantidad de bytes 33 y 32, porqueStr1
,sub(
ylength(
son tokens de dos bytes que sólo contribuyen 1 a la longitud de una cadena.Si usamos nuevas líneas en lugar de
:
, parece que podemos ahorrar algunos bytes al dejar las comillas finales, pero esto en realidad no funciona. En primer lugar, necesita un editor hexadecimal antes de poder agregar el carácter de nueva línea en una cadena: no puede simplemente escribirlo, porque si presiona ENTRAR durante unInput
comando, envía la entrada. Cuando probé el enfoque del editor hexadecimal, terminé obteniendo un extraño error de desbordamiento del búfer que modificó el contenido de mi programa, así que no intentes esto en casa con tu costosa calculadora.fuente
Java 11,
13565 + 26 = 91 bytesUNA
si
do
Pruébelo en línea aquí (TIO todavía no tiene Java 11, por lo que se basa en un método auxiliar en lugar de
String::repeat()
).Sin golf:
fuente