Supongamos que usamos las siguientes reglas para extraer una sola cadena de otra cadena, una que contiene solo caracteres imprimibles ASCII y se llama una *
cadena. Si la cadena se agota antes de que el proceso se detenga, eso es un error, y el resultado del proceso no está definido en ese caso:
- Empezar con
d=1, s=""
- Siempre que encuentres a
*
, multiplicad
por 2. Siempre que encuentres otro personaje, concatena al final des
y resta 1 ded
. Si ahorad=0
, deténgase y regreses
Ejemplos definidos :
d->d
769->7
abcd56->a
*abcd56->ab
**abcd56->abcd
*7*690->769
***abcdefghij->abcdefgh
Ejemplos indefinidos : (tenga en cuenta que la cadena vacía también sería uno de estos)
*7
**769
*7*
*a*b
*
Su trabajo es tomar una cadena y devolver la cadena más *
corta que produce esa cadena.
Ejemplos de programa :
7->7
a->a
ab->*ab
abcd->**abcd
769->*7*69
Su programa debe manejar cualquier cadena que contenga al menos un carácter y solo *
caracteres imprimibles que no sean ASCII. Nunca puede devolver cadenas para las cuales el proceso no está definido, ya que por definición no pueden producir NINGUNA cadena.
Se aplican las lagunas estándar y las reglas de E / S.
*
?Respuestas:
Pyth (
3627 bytes)¡Gracias a Jakube por una mejora de 9 bytes! Actualmente no es tan bueno como la respuesta de muddyfish , pero lo que sea
Banco de pruebas
Traducción a python:
fuente
JavaScript (ES6), 61 bytes
Función recursiva que hace lo siguiente:
Si
d
es menor o igual que la longitud restante de la cadena dividida por 2:Añadir
*
a la salida y multiplicard
por 2Más:
Cambia la cadena y agrega a la salida, resta 1 de
d
.Véalo en acción:
fuente
f=(s,d=2)=>s?d>s.length?s[0]+f(s.slice(1),d-2):'*'+f(s,d*2):s
Pyth,
2927(notado roto)272625 bytesExplicación por venir.
Banco de pruebas
fuente
C, 125 bytes
Esto aprovecha el patrón muy regular de las posiciones de las estrellas para generar la codificación correcta. Inicialmente probé una solución recursiva de fuerza bruta, pero en retrospectiva debería haber sido obvio que había una solución matemática más simple.
Esencialmente, siempre tendrá
2^floor(log_2(length))
estrellas al comienzo de su salida y una estrella final después de los2^ceil(log_2(length)) - length
caracteres (si eso resulta en al menos 1 carácter).La versión (ligeramente) sin golf es la siguiente
fuente
JavaScript (ES6),
8877 bytesAl principio pensé que
abcde
tenía que ser así,*a**bcde
pero resulta que**abc*de
funciona igual de bien. Esto significa que la salida se construye fácilmente utilizando estrellas principales de piso (log₂ (longitud s)), más una estrella adicional para cadenas cuya longitud no es una potencia de dos.Editar: ahorró 8 bytes calculando el número de estrellas principales de forma recursiva. Ahorré otros 3 bytes con cadenas de carcasa especial de longitud 1, para que pueda tratar las cadenas cuya longitud es una potencia de 2 como si tuviera una estrella principal adicional.
fuente
Haskell, 68 bytes
Igual que las otras respuestas, de verdad. Si EOF, genera una cadena vacía. Si la longitud restante es más de dos veces
d
, genera una estrella y el dobled
. De lo contrario, muestre el siguiente carácter y reste uno ded
.Sin golf:
fuente