Inscriptio Labyrinthica

22

En el lugar de enterramiento del Rey Silo de Asturias hay una inscripción que dice SILCI PRINCEPS FECIT (el Rey Silo hizo esto ).

FECIT DE PRINCEPS DE SILO

La primera letra se encuentra en el medio, y desde allí se lee yendo en cualquier dirección no diagonal que se irradia hacia afuera. La letra final se encuentra en las cuatro esquinas. En este desafío, generalizarás el proceso para hacerlos.

Entrada

Una cadena ( o equivalente ) y un número entero. Puede hacer los siguientes supuestos sobre la entrada:

  • La cadena tendrá una longitud impar.
  • El número entero será un número impar entre 1 y uno menos del doble de la longitud de la cadena.

Salida

Una inscriptio labyrinthica para la cadena, usando el número entero para la altura o el ancho (ver modelos para ejemplos de altura). La salida debe ser cada letra sin espacios, salto de línea como predeterminado para su sistema / idioma.

Casos de prueba

Tenga en cuenta que una entrada de 1 o (longitud * 2 - 1) dará como resultado un palíndromo horizontal o vertical.

 Input: FOO, 3    Input: BAR, 1    Input: BAR, 3    Input: BAR, 5

Output: OOO      Output: RABAR    Output: RAR       Output: R
        OFO                               ABA               A
        OOO                               RAR               B
                                                            A
                                                            R

 Input: ABCDE, 5   Input: ABCDE, 3   Input: *<>v^, 5

Output: EDCDE     Output: EDCBCDE           ^v>v^
        DCBCD             DCBABCD           v><>v
        CBABC             EDCBCDE           ><*<>
        DCBCD                               v><>v
        EDCDE                               ^v>v^

Tanteo

Este es el por lo que la respuesta más corta en bytes gana. Lagunas estándar prohibidas.

usuario0721090601
fuente
¿La entrada puede contener espacios? Si es así, ¿cómo deben manejarse?
Nitrodon
1
¿Podemos tomar la entrada como una lista de caracteres?
Robin Ryder
1
@Charlie claramente te has estado perdiendo todas mis respuestas de Perl6 :-) También espero una respuesta tuya ya que está inspirado en el quinto rey de España (bueno, de Asturies, pero Asturies ye España, y tolo demás ye tierra conquistao jaja)
user0721090601
1
¿Podemos tomar el ancho en lugar de la altura?
attinat

Respuestas:

6

J , 27 bytes

([{~]+/&(|@i:)#@[-1+])-:@<:

Pruébalo en línea!

Un ejemplo aclarará el enfoque de alto nivel.

Considerar 'ABCDE' f 3

Notamos que lo que buscamos es simplemente la tabla de "suma cruzada" de 1 0 1y 3 2 1 0 1 2 3, que se ve así:

4 3 2 1 2 3 4
3 2 1 0 1 2 3
4 3 2 1 2 3 4

A continuación, tire de los índices de la cadena original: [{~.

Todo el resto del código es aritmética aburrida y el uso de i:para construir los argumentos 1 0 1y 3 2 1 0 1 2 3.

Jonás
fuente
6

Jalea , 12 bytes

Uṡṛ‘HɗŒBŒḄZY

Pruébalo en línea!

Un enlace diádico que toma la cadena como su izquierda y la altura como su argumento derecho. Devuelve una cadena con saltos de línea. Si una lista de cadenas fuera aceptable para la salida, puedo eliminar el Yguardado final de un byte. Curiosamente, el original "SILO PRINCEPS FECIT" me parece el arte ASCII de un diamante 3D cuando lo miro en TIO.

Explicación

U            | Reverse input
 ṡ   ɗ       | All overlapping substrings of the length given by:
  ṛ          | - The right argument
   ‘         | - Incremented by 1
    H        | - Halved
      ŒB     | Concatenate to the reverse, keeping a single copy of the last character (so creating a palindrome)
        ŒḄ   | Do the same, but this time using the lists of characters generated by the last atom
          Z  | Transpose
           Y | Join with newlines
Nick Kennedy
fuente
2
Hice clic en probarlo solo para ver y sí, de hecho, hace 3D. Extraño pero genial.
user0721090601
6

R , 93 91 87 bytes

-2 bytes gracias a Giuseppe. -4 bytes ingresando el ancho en lugar de la altura, según lo permitido por OP.

function(s,W,w=W%/%2,h=length(s)-w-1)write(s[1+outer(abs(-w:w),abs(-h:h),`+`)],1,W,,"")

Pruébalo en línea!

Toma la entrada como un vector de caracteres. La parte clave es s[1+outer(abs(-w:w),abs(-h:h),'+')].

wh(2w+1)×(2h+1)

(yo,j)1+El |yo-hEl |+El |j-wEl |abs(-w:w)abs(-h:h)abs(-h:h)[h,h-1,h-2,...,2,1,0 0,1,2,...,h-1,h]outer(abs(-2:2), abs(-1:1), '+')

32123
21012
32123

(entonces necesitamos agregar 1 porque R está indexado en 1). El 0 en el centro es donde debe ir la primera letra de la entrada.

El resto es formateo.

Robin Ryder
fuente
5

Carbón , 25 19 bytes

E⊘⊕η✂θι⁺ι⁻Lθ⊘⊖η‖O←↑

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

E⊘⊕η✂θι⁺ι⁻Lθ⊘⊖η

Dibuja una cuarta parte de la inscripción.

‖O←↑

Reflexiona para completar la inscripción.

Neil
fuente
1
¡Impresionante! Soy nuevo en el sitio, me disculpo de antemano si lo que sigue son un par de preguntas tontas. 1. Esos son definitivamente 19 caracteres, pero ¿son también 19 bytes? y 2. ¿En qué codificación ese texto tomaría 19 bytes?
damix911
Sí, codificado en UTF-8, esto tomará 19 caracteres , pero en realidad 51 bytes. Con UTF-16, esto todavía requiere 39 bytes para codificar.
ruohola
1
@ damix911 El carbón tiene su propia codificación, que se puede encontrar en su wiki. Creo que los caracteres fuera de la página de códigos cuestan 3 bytes. El desverbosificador intenta calcular la longitud correcta pero no se molesta en transcribir a la codificación real, lo cual es molesto.
Neil
1
@Neil Okey, parece legítimo!
ruohola
3

Japt -R , 19 16 bytes

z
ò@VÔtXUaVÊ)êÃê

Intentalo

z\nò@VÔtXUaVÊ)êÃê     :Implicit input of integer U & string V
z                     :Floor divide U by 2
 \n                   :Reassign result to U
   ò                  :Range [0,U]
    @                 :Map each X
     VÔ               :  Reverse V
       tX             :  Substring from index X to index ...
         Ua           :    Absolute difference between U and ...
           VÊ         :    Length of V
             )        :  End substring
              ê       :  Palindromise
               Ã      :End map
                ê     :Palindromise
                      :Implicit output, joined by newlines
Lanudo
fuente
2

Wolfram Language (Mathematica) , 57 54 bytes

(g=Reverse@Rest@#~Join~#&)@BlockMap[g,#,⌈#2/2⌉,1]&

Pruébalo en línea!

Toma el ancho como entrada.

attinat
fuente
1
@lirtosiast, entonces el primero gno se evalúa la primera vez que se llama a la función. Pruébalo en línea!
attinat
Interesante, ¿alguna idea de por qué parece funcionar cuando usas @@ o @@@?
lirtosiast
@lirtosiast Piensa Print/@f[...]-> Print/@Transpose[g[...]]-> Transpose[Print@g[...]], por el cual gse define el tiempo .
attinat
2

Japt -R , 10 bytes

Ôã°Vz)mê ê

Toma ancho en lugar de altura.

Intentalo

Pseudocódigo (U es una cadena, V es un entero):

U.Reverse().AllSubstringsOfLength(++V / 2).Map(Palindromize).Palindromize
Encarnación de la ignorancia
fuente
¡Agradable! Nunca se me ocurrió intentar construirlo de lado.
Shaggy
2

Python 3, 104 bytes

No he jugado al golf en mucho tiempo ... Estoy seguro de que esto podría ser más corto.

Detalles

Este código define una función que toma dos argumentos (la cadena y la altura) y da el resultado en la salida estándar.

El índice en la cadena es la distancia de Manhattan desde el centro de la cuadrícula. Para una cuadrícula de ancho wy alto h, la distancia para la celda (x, y)es abs(x - (w - 1) / 2) + abs(v - (h - 1) / 2).

El ancho de la cuadrícula debe ser tal que la distancia de Manhattan de las esquinas (por ejemplo, (0, 0)) sea uno menos que la longitud de la cadena. Sustituyendo (0, 0)en lo anterior y simplificando, encontramos que el ancho es simple 2 * len(s) - h.

Código

def b(s,h):
 w=2*len(s)-h
 for y in range(h):print(''.join(s[abs(x-w//2)+abs(y-h//2)]for x in range(w)))

Pruébalo en línea!

Tim Pederick
fuente
1

Pyth , 19 bytes

L+_btbjyyM.:Q-lQ/E2

Pruébalo en línea!

L+_btbjyyM.:Q-lQ/E2   Implicit: Q=string, E=height
L                     Define a function, y(b):
  _b                    Reverse b
 +  tb                  Append all be first element of b
                      y is now a palindromisation function
              lQ      Length of Q
             -  /E2   Subtract floored division of E by 2
          .:Q         All substrings of Q with the above length
        yM            Palindromise each substring
       y              Palindromise the set
      j               Join on newlines, implicit print
Sok
fuente
1

C # (.NET Core) , 146 bytes

s=>n=>{int w=s.Length*2-n,i=0,j;var r=new char[n,w];for(;i<n;i++)for(j=0;j<w;)r[i,j]=s[System.Math.Abs(n/2-i)+System.Math.Abs(w/2-j++)];return r;}

Pruébalo en línea!

La respuesta más larga hasta ahora. :-) Utiliza la distancia de Manhattan al centro de la plaza. Sin embargo, debe haber un camino más corto.

Charlie
fuente
1

Tcl , 188 170 162 bytes

{{w s} {join [lmap C [lrepeat $w string] {join [$C reverse [set y [$C range $s [set x [expr abs($w/2+1-[incr i])]] end-[expr $w/2-$x]]]][$C range $y 1 end]}] \n}} bytes

Pruébalo en línea!

Parece que hay un millón de malas formas de jugar golf a este problema en TCL. Este no es el peor de ellos.

Se guardó un mínimo de 18 bytes al convertir a lambda (puede guardar hasta 13 más si el valor de retorno de una lista de líneas es aceptable)

Guardado un 8 adicional ya que el iterador lmap sirvió como una constante adicional

SmileAndNod
fuente
1

Lienzo , 18 bytes.

±X↕┌L╵┌-Y{x;1y1@]┼

Pruébalo aquí!

Canvas no hace subcadenas, por lo que debo tratarlo como un objeto de arte y obtener una subsección de esa manera. Siento que esto me cuesta 2 bytes, pero oye, ¿qué puedes hacer?

Parece que esto en realidad no funciona como pensé: las funciones palindromize de Canvas reflejan ciertos caracteres (por ejemplo, V reflejado verticalmente se convierte en ^), y no puedo deshabilitar exactamente eso ... oh bueno, supongo

hakr14
fuente