Texto de sabor
El esolang basado en pila baja carga tiene algunos vínculos interesantes a la programación funcional. Uno de ellos es su tratamiento del tipo de datos numéricos: como el cálculo lambda, usted representa el número natural N por una función que realiza una acción N veces.
Para simplificar las cosas, solo consideraremos el siguiente subconjunto de comandos de Subcarga:
:
- Este comando duplica el elemento superior en la pila.*
- Este comando concatena los dos primeros elementos de la pila en un solo elemento.
Definimos un número N de subcarga como una cadena de :
y *
que, cuando se ejecuta, consume el elemento superior de la pila y produce N copias de ese elemento concatenados juntos. Algunos ejemplos:
- No hay números de subcarga 0, -1, 1/2, π.
- La cadena vacía
es el número 1 de baja carga, porque deja la pila intacta.
:*
es el número 2 de Subcarga, porque duplica el elemento superior y luego concatena esas dos copias en un solo elemento:(A):*
=(A)(A)*
=(AA)
.::**
es el número de subcarga 3:(A)::**
=(A)(A):**
=(A)(AA)*
=(AAA)
.:::***
es el número de subcarga 4.:*:*
es también el número de subcarga 4:(A):*:*
=(AA):*
=(AA)(AA)*
=(AAAA)
.
En general, encontrará que, si M
y N
son los números de Subcarga M y N, entonces :N*
es el número N + 1, y MN
es el número M × N.
El reto
Su tarea es escribir el programa más corto (tomando entrada en STDIN) o la función (tomando entrada a través del argumento) que produce la representación más corta del número de Subcarga para su entrada como una cadena. Es decir, si la entrada es un número natural positivo N> 1, debe producir un número de subcarga N cuya longitud en caracteres es menor o igual que la de cualquier otro número de subcarga N.
Muestra de entradas y salidas: ("Entrada - OUTPUT
.")
- 1 -
.
- 2 -
:*
. - 5 -
::*:**
(2 × 2 + 1). - 7 -
::*::***
(2 × 3 + 1) o:::**:**
(3 × 2 + 1). - 33 -
::*:*:*:*:**
(2 × 2 × 2 × 2 × 2 + 1). - 49 -
::*:*:*:*::***
(16 × 3 + 1, longitud 14) pero no::*::***::*::***
(7 × 7, longitud 16).
Si la entrada no es un número natural positivo, puede devolver un error, producir un comportamiento indefinido o incluso no terminar. Se agradece una explicación del método de su presentación para encontrar la respuesta.
Se aplican restricciones de laguna estándar: sin entrada adicional, sin solicitudes web, el valor de salida / retorno debe ser exactamente la respuesta y no un flujo aleatorio infinito de :
y *
, etc.
x
es2*A117498(x)
donde A117498 proporciona la combinación óptima de métodos binarios y factoriales para encontrar una cadena de suma.Respuestas:
GolfScript (
61 60 55 5453 caracteres)Esto es menos complicado que mi versión anterior y adopta un enfoque ligeramente diferente, pero sigue siendo la fuerza bruta. Sabemos que
':'X*'*'X*+
es una solución candidata, por lo tanto, si generamos todas las cadenas bien equilibradas hasta esa longitud y tomamos la más corta que evalúa lo correcto, podemos estar seguros de encontrar una.Gracias a Howard, de cuya solución he robado un par de ajustes de 1 char.
fuente
.&
justo después del bucle interno (es decir, entre~}%
y}*
.GolfScript (
5453 caracteres)Este es un enfoque que está en el espíritu de Howard (crea cadenas que evalúan el valor correcto y selecciona la fuerza más corta, en lugar de la fuerza bruta, a través de las cadenas candidatas para encontrar las que evalúan el valor correcto), pero es lo suficientemente diferente como creo pertenece en una respuesta separada.
La demostración en línea no está disponible porque ejecuta una versión con errores del intérprete.
fuente
3+
con)
(explotando el hecho de que[]0=
no deja nada en la pila) si no fuera eso[]2>
conduce a un error.[]2>
rinde[]
sin error.'1'
.((=
lugar de-1=
.Python 2.7 -
878492Explicación:
Esta es una solución bastante sencilla. Prueba recursivamente todas las representaciones posibles de n como producto de dos números o como
:(n-1)*
, y luego encuentra la solución de longitud mínima. El rango (2, n) es necesario para que la recursión tenga una profundidad acotada, y n <2 da el caso base.Notas:
i y n / i son los dos factores de n. El ... y ... o ... reemplazo de ... si ... más ... no funciona porque '' se evalúa como falso. min of strings da una de las cadenas más cortas. Python 2.7 guarda 1 carácter usando / en lugar de //.
Editar: moví el caso base a la parte posterior de la expresión, permitiéndome usar ... y ... o ... y afeitarme un par de espacios.
Casos de prueba:
fuente
key=len
. Da la cadena lexicográficamente más temprana. ( Ejemplo ) Dado que'*' < ':'
esto significa que tiene un sesgo hacia soluciones que involucran potencias de 2, pero ¿son siempre las más cortas?u(33)
, para el cual la clasificación lexicográfica le da 14 caracteres,::**::*::*:***
pero la clasificación por longitud le da los 12 caracteres::*:*:*:*:**
GolfScript,
635856 caracteresEl código toma entrada en STDIN e imprime el resultado.
Ejemplos:
Puede probar sus propios casos en línea .
fuente
:x(=
. Además, +1 por poder ejecutar 49 en un período de tiempo razonable.x,2>{x\%!},
da todos los divisores verdaderos dex
,{.v=x@/v=+}/
luego concatena las soluciones parad
yx/d
para todos los divisoresd
.{,}$
los ordena por longitud y0=
toma el más corto de ellos (más el:(x-1)*
caso inicial ).Brachylog 2 , 30 (quizás eventualmente 26) bytes, desafío de fechas posteriores al idioma
Aquí hay una función que funciona con la implementación actual de Brachylog 2 (y devuelve una lista de códigos de caracteres porque la implementación actual tiene algunos problemas con el manejo de cadenas):
Pruébalo en línea!
El idioma aún es muy nuevo. Aquí hay una versión de 26 bytes del programa que debería funcionar de acuerdo con la especificación, pero utiliza algunas características no implementadas y, por lo tanto, aún no es válida, pero tal vez lo sea en el futuro (también es aún menos eficiente):
Explicación
La idea básica es bastante simple: alternamos entre descomponer el número en (1 o más) factores (no necesariamente factores primos, pero los factores de 1 no están permitidos) y expresar cada uno de ellos como 1 + (una representación obtenida de un recursivo llamada). Esto garantiza la búsqueda de todas las representaciones posibles de Subcarga del número (podemos aplicar una etapa de multiplicación "dos veces seguidas" multiplicando juntos más de 2 números, y una etapa de incremento dos veces seguidas separándolos con una etapa de multiplicación que multiplica juntos solo un número). No necesitamos un caso base explícito, porque descomponer 1 en factores primos nos da una lista vacía y, por lo tanto, la construimos con una etapa de multiplicación que multiplica los números cero.
El programa es bastante ineficiente, especialmente porque la sugerencia de orden de evaluación que di (generar respuestas más cortas a más largas en términos del tamaño del resultado final), mientras resuelve la parte "más corta" de la pregunta, no es tan buena en términos de en realidad, hacer que el programa se complete rápidamente (una pista mucho más útil sería "generar solo la respuesta más corta en cada etapa recursiva", pero eso requiere más bytes ...). Además,
ḋp~c×ᵐ
puede generar particiones multiplicativas varias veces cada una, haciendo que el programa haga mucho trabajo redundante.fuente
J - 81 char
Para la posteridad, esto fue lo mejor que pude hacer en J.
Creamos una lista de resultados, comenzando con dos cadenas vacías (que es el
,~
ya:
) que representa 0 (nunca utilizado) y 1, y luego iteramos un verbo sobre ellos (uso furtivo de ganchos, trenes y&
) que agrega la representación más corta del siguiente número.El verbo real que iteramos utiliza la longitud de la lista como un indicador de en qué número estamos operando. Primero, factorizamos este número en pares de factores (
#(#~]-:"1<.)@(],.%)2}.i.@#
), y recuperamos cada par tirando de la matriz ({~
). Convertimos cada uno de esos pares (podría haber 0 de ellos si el número es primo) en cadenas simples (<@;"1
).Luego anexamos a esa lista la entrada para el resultado anterior entre corchetes entre
:
y*
, y ordenamos esta lista por longitud ((/:#&>)
). Finalmente, tomamos el primer resultado de esta lista (0{
) y lo agregamos al final de la matriz base ([,
). Cuando el ciclo termina de iterar, tenemos una lista de longitud 2 más que la entrada, comenzando en 0. Entonces, lo que tenemos que devolver es la cadena de penúltimo (_2{::
).fuente
Jelly , 33 bytes, desafío de fechas posteriores al idioma
Pruébalo en línea!
Una solución directa de fuerza bruta.
Explicación
Programa principal
El programa principal usa la función auxiliar para enumerar todas las formas posibles de producir el valor mediante la multiplicación, luego intenta producir el valor por suma y devuelve la posibilidad más corta. También maneja el caso base (una entrada de
1
).Función auxiliar
La función auxiliar intenta todos los métodos posibles de expresar la entrada como una multiplicación de dos números, y recursivamente recursivamente llama al programa principal para llegar a sus representaciones más cortas.
fuente
GNU Prolog, 96 bytes
La primera línea es una gramática que implementa la evaluación de baja carga y funciona en la dirección inversa (en realidad, no funciona en la dirección hacia adelante debido a la
A#<B
restricción; cámbielo aA#<N
un programa más lento que funcione en ambos sentidos). La segunda línea define el predicado similar a una funcións
(que es la función que se implementa como una solución para este programa) que encuentra la cadena más corta posible que evalúa el número dado como entrada (esto es frustrantemente detallado para lo que es una tarea relativamente simple, pero eso es Prolog para ti ...).El programa debería explicarse por sí mismo, dado que es más o menos una traducción directa de la especificación a una gramática y luego a la sintaxis de Prolog; la definición de
v
dice queN
es 1 en una cadena vacía, oN
esA
×B
(conA
menos deB
menos queN
) y la cadena es la concatenación dev(A)
yv(B)
, oN
esM
+ 1 y la cadena se:
concatena conv(M)
concatenada con*
. La segunda línea es un poco más sutil;length(S,_)
significa "S tiene algo de longitud", pero especificar esto como lo primero en la línea actúa como una pista para la implementación de Prolog de que primero debe verificar las longitudes más cortas (lo que significa que obtendremos la longitud más corta posible para un valor de retorno) .fuente