Un "zorro marrón rápido" celoso "saltó" a lo largo de la espiral Groovy

12

Introducción

Escriba un programa para generar la espiral saliente del famoso pangrama siguiendo las reglas dadas.

Desafío

Un pangrama es una oración que usa cada letra de un alfabeto dado al menos una vez. Uno de los pangramas más famosos es el que se usa ampliamente en el visor de fuentes de Windows, a saber, " El rápido zorro marrón salta sobre el perro perezoso ". El desafío es generar una espiral basada en este texto.

Su tarea genera este texto exacto:

heeeeellllllllllllazzzzzzzzzzz
hummmmmmmmmmmmmppppppppppppppy
hubrrrrrrrrrrrrrrrrrrooooooosy
hukyddddoooooooooooooooggggwsy
hukyveeeeerrrrrrrrrrrrrrrrtwsy
hukyvxjjjjjjjjjjuuuuuuuuuttwsy
hukyvxkbbrrrrrrrrrrrrrrrmttwsy
hukyvxkogggggggttttttttomttwsy
tukyvokoellllllllllllahomttwsy
tukyvokoeovvvvvvvvvvvzhomttwsy
tukyvocoeoummmmmmmmmezhomttwsy
tukyvocoeoufooooooopezhomttwsy
tukyvocohoufroooooxpezhomttwsy
tukyvoiohoufrquuuwxpezhomttwsy
tucyvoiohoufbqttiwxpezhomttwsy
tucyvoiohoufbeehiwxprzhomttwsy
tucyvoiohoufkccciwxprzeomttwsy
tjiyvoidhounnnnnnwxprzeomttwsy
tjiyvoidhojjjjjjjjxprzeomttwsy
tjiyvoidhssssssssssprzeopttwsy
tjiyvoidttttttttttttrzeopttwsy
tjiyvoiyyyyyyyyyyyyyyzqopttwoy
tjiyvouuuuuuuuuuuuuuuuqwpttwoy
tjiyvffffnnnnnnnnnnnnnnwpttwoy
tjiyossssssssssssssssssspthwoy
tjizzzzalllllllllllleeeeehhwoy
tjuuqqqqqqqqqqqqqqqqqeeeeehnod
txxxxxoooooooooooooooffffffnod
reeeeevvvvvvvvvvvvvvvvvvvvvvod
       gggggggoooooooooooooood

Así es como se genera,

  • Hubo un zorro celoso que disfrutó del pangrama "El rápido zorro marrón salta sobre el perro perezoso". Un día estaba en el centro de una espiral exterior y decidió saltar y pintar.
  • Le gustaría pasar por el pangrama desde el principio hasta el final, y si una letra es la enésima letra del alfabeto, le gustaría pintarla n veces.
  • Sin embargo, el zorro no era muy bueno para hacer giros en las esquinas, por lo que al llegar a cada esquina también tuvo que detenerse y pasar a la siguiente letra.
  • También decidió repetir el pangrama tres veces para enfatizar que él es el zorro marrón rápido.
  • Tu trabajo es mostrar cómo se vería la espiral después de que el zorro pintara todas esas letras.

(Versión simple sin contar historias)

  • El famoso pangrama "El rápido zorro marrón salta sobre el perro perezoso" se repite tres veces, con los espacios eliminados y todas las letras en minúsculas, para generar

    thequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydog
    
  • La espiral comienza desde el centro y comienza con la letra "t", comienza yendo hacia la derecha y sale hacia la derecha. Si el carácter actual es la enésima letra del alfabeto, entonces cambia al siguiente carácter siempre que

    • la espiral llega a una esquina, o
    • Las letras actuales se imprimen exactamente n veces.

Para ilustrarlo mejor, explicaré cómo se genera la espiral relacionada con las tres primeras palabras "thequickbrown".

 rooooo
 rquuuw
 bqttiw
 beehiw
 kccciw
nnnnnnw

El zorro comienza desde "t", va a la derecha, llega a la primera esquina, lo pinta con la "t" y luego cambia a "h" y baja, llega a la segunda esquina, cambia a "e" y va a la izquierda, llega a la Tercera esquina, cambia a "q" y sube, llega a la cuarta esquina, cambia a "u" y va a la derecha, llega a una esquina y cambia a "i", baja, llega a una esquina y cambia a "c", va izquierda, pinta con éxito 3 "c" s antes de llegar a la siguiente esquina , cambia a "k" y continúa hacia la izquierda , llega a una esquina de inmediato, cambia a "b" y sube, pinta 2 "b" s antes de llegar la siguiente esquina, cambia a "r"y sigue hacia arriba , llega a una esquina y cambia a "o", va a la derecha, luego a "w", abajo, "n", a la izquierda.

Especificaciones

  • Puede tomar una entrada opcional que contenga cualquier forma estándar de la cadena

    thequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydog
    
  • Su salida debe estar formateada como una cadena y debe ir a STDOUT en lugar de archivos o STDERR, con líneas nuevas colocadas correctamente. El encabezado y el final de las líneas vacías no importan. Se permiten espacios de encabezado y final en cada línea, pero deben ser consistentes. Entonces, si agrega 5 espacios antes de una línea del texto dado, deberá agregar exactamente 5 espacios antes de cada línea para que la espiral se vea igual.

  • Este es el , gana el menor número de bytes.

  • Como de costumbre, las lagunas predeterminadas se aplican aquí.


Las explicaciones son bienvenidas, aunque no necesarias.

Título editado para que sea un pangrama por comentario por caird coinheringaahing.

El perro perezoso es demasiado perezoso para aparecer en la historia.

Mi objetivo es crear un desafío de cadena en el que la letra de salida no se pueda calcular mediante funciones simples de las coordenadas.

Weijun Zhou
fuente
2
Es una pena que el título no sea un pangrama
caird coinheringaahing
@cairdcoinheringaahing Buen punto, intentaré llegar a uno. ¿Alguna sugerencia?
Weijun Zhou
44
@cairdcoinheringaahing Actualizado
Weijun Zhou
Punto menor: ¿no debería repetirse dos veces la 'h' en la primera 'la', no la 't'?
mudkip201
@ mudkip201 La esquina está pintada con la letra original antes de cambiar al siguiente carácter. Quizás debería aclararlo.
Weijun Zhou

Respuestas:

5

Stax , 35 34 33 32 bytes

é╛îá%ⁿ┌○iê}→Ug=╩◙╘Ç⌐)QX↑L╓₧╗▌╧▬q

Ejecútelo y depúrelo en línea

Stax es un idioma en el que he estado trabajando durante aproximadamente 6 meses. Este es el primer golf público con él. Vamos a ir al grano.

Stax normalmente se escribe en el conjunto de caracteres ASCII imprimible. Este envío de 34 bytes está empaquetado en una variante del juego de caracteres CP437. La representación ascii correspondiente es

't],{]_96-*~cHT,+nh%^(XUs&xH{rM}MF|<mr

Stax es un lenguaje basado en pila, pero tiene dos pilas de datos, "principal" y "entrada". La mayoría de las operaciones usan la pila principal, pero la entrada comienza en la pila de entrada. Las instrucciones Stax son principalmente secuencias ascii de uno o dos caracteres. La mayoría de ellos están sobrecargados, lo que significa que su comportamiento está determinado por los pocos valores superiores en la pila (s).

En un nivel alto, este programa crea una cuadrícula agregando repetidamente cadenas a la última fila. Cuando la última fila se llena, gira la cuadrícula en el sentido de las agujas del reloj. Al final, refleja la cuadrícula horizontalmente. Con más detalle, el programa funciona así.

't],{]_96-*~cHT,+nh%^(XUs&xH{rM}MF|<mr
't]                                         ["t"]
   ,                                        Pop from input, push to main ("thequick...")
    {                            F          For each character in input, execute block...
     ]_96-*                                 Produce string using character appropriate
                                                number of times (a=1, b=2, etc)
           ~                                Pop from main, push to input for use later
            cH                              Copy last row from grid.
              T                             Right-trim whitespace
               ,+                           Pop from input stack and append
                 nh%                        Get the width of the first row of the grid
                    ^                       Add 1
                     (                      Right-pad/truncate string to this length
                      X                     Store in the x register
                       Us&                  Overwrite last row of the grid with new value.
                          xH                Get the last element from x.
                                                Basically, the lower right corner.
                             {  }M         Conditionally execute block.  This will happen 
                                                when the bottom right corner isn't a space.
                              rM            Reverse and transpose (aka rotate clockwise)
                                  |<        Left-justify grid; give all rows equal size.
                                     m      For each row, execute the rest of the program
                                               and then print the result to output
                                      r     Reverse the row
recursivo
fuente
Wow, estoy realmente sorprendido de que el desafío sea la primera aparición pública en el golf para un idioma de golf. ¡Muchas gracias por tu apoyo! ¿Interesado en el idioma del mes? ¡Espero ver más usuarios usándolo y que aparezca en la lista de candidatos pronto!
Weijun Zhou
@WeijunZhou: ¿Te refieres a esto ? No sabía que era una cosa hasta ahora. No me importaría una nominación. Parece que podría ser más adecuado para idiomas más establecidos, pero no me opongo.
recursivo
Si. Puedo nominarlo cuando esté mejor establecido, como usted dice. Espero que no sea largo.
Weijun Zhou
Como "el espacio de encabezado en cada línea no importa siempre que sean consistentes", puede guardar otro byte si lo desea.
Weijun Zhou
1
Acabo de hacer una presentación usando Stax. Puede dar consejos sobre eso si lo desea. Editar: Qué casualidad. Intentaré aprender de tu presentación.
Weijun Zhou
11

Carbón , 66 40 36 bytes

≔²ηFS«F¬η«¶↷⊞υη≔⊕÷Lυ²η¶»F⊕⌕βι¿η«≦⊖ηι

Pruébalo en línea! El enlace es a la versión detallada del código. Editar: guardado 16 bytes tomando el texto como entrada. Explicación:

≔²η

Comience con 2 ts por alguna razón.

FS«

Recorre todas las letras del pangrama.

F¬η«

¿Ya hemos llegado a una esquina?

Mover hacia abajo (o cualquiera que sea la próxima dirección) una línea.

Gire la dirección de impresión 90 ° en sentido horario.

⊞υη≔⊕÷Lυ²η

Calcule la longitud del siguiente lado.

¶»

Termine de arreglar la posición del cursor. (El carbón hubiera preferido que el lado terminara justo antes de la esquina, de modo que girara en la esquina misma).

F⊕⌕βι

Repite tantas veces como la posición actual de la letra en el alfabeto.

¿η«

Si no hemos llegado a la esquina,

≦⊖ηι

Disminuya el conteo e imprima la letra actual.

Neil
fuente
Gracias. Buen trabajo y bien explicado. Un pequeño error tipográfico: hay veces -> tres veces.
Weijun Zhou
Esta versión de 43 bytes también es aceptable según las especificaciones. tio.run/##rY7NTsMwEITPzlNYPW2kcumVExJCikRRhLgBh9Rx4oV4nfon/…
Weijun Zhou
1
@WeijunZhou Gracias, no noté esa cláusula en la pregunta antes.
Neil
2

Rubí , 217 212 209 208 bytes

->s{s+=' '*8
x=0
a=[""]*30
i=14
a[i]=?t
l=->{a[i]=s[x]+a[i]}
r=->{a[i]+=s[x]}
(0..58).map{|g|c=0
(0..g/2).map{c>s[x].ord-97&&(x+=1;c=0)
c+=1
eval %w{r i+=1;r l i-=1;l}[g%4]+"[]"}
x+=1}
a[-1].slice!0
$><<a*$/}

Pruébalo en línea!

Pasa una buena cantidad de tiempo manejando punteros, por lo que puede haber espacio para más golf.

-5 bytes: Triplique el pangrama antes de ingresar. Gracias a Weijun Zhou .

-3 bytes: rellena la cadena de entrada y recorta el último tramo, en lugar de generar el último tramo desde cero.

-1 bytes: se utiliza en &&lugar de un operador ternario con un valor de descarte.

Explicación:

->s{
  s += " " * 8                             # These spaces will show on the bottom row
  x = 0                                    # x is a pointer into s
  a = [""] * 30                            # a is an array of row strings
  i = 14                                   # i is a pointer into a
  a[i] = ?t                                # "Starts with two t's for some reason"
  l = ->{ a[i] = s[x]+a[i] }               # lambda to prepend char x to row i
  r = ->{ a[i] += s[x] }                   # lambda to append char x to row i
  (0..57).map{|g|                          # There are 58 "legs" to the spiral
    c = 0                                  # c is the print count of s[x]
    (0..g/2).map{                          # Leg g has g/2+1 characters
      c > s[x].ord-97 && (x+=1;c=0)        # Possibly switch to next letter
      c += 1
      eval %w{r i+=1;r l i-=1;l}[g%4]+"[]" # Call the appropriate lambda
    }
    x += 1                                 # Definitely switch to next letter
  }
  a[-1].slice!0                            # Remove the first char from the bottom row
  $> << a*$/                               # Join with newlines and print
}
benj2240
fuente
1
Buena presentación y claramente explicada. Aprecio el uso de ry llambdas. Según las respuestas actuales, el último tramo parece ser problemático, aunque no fue cuando escribí mi fragmento C para generar la salida de muestra ...
Weijun Zhou
1
Parece que puede guardar el s*=3conjunto y también omitir el 0en el ?:operador. tio.run/…
Weijun Zhou
1
@WeijunZhou Ahh, gracias por el consejo. Sin 0embargo, necesito eso , o Ruby sacará el c+=1de la siguiente línea y solo lo ejecutará la mayor parte del tiempo. Y bonito desafío!
benj2240
Tienes razón. No me vi lo suficientemente cuidadoso. Gracias por tu apreciación. Me alegra que lo hayas disfrutado.
Weijun Zhou