Hacer palabras octogonales

14

El jueves pasado, el usuario @SpookyGengar nos deleitó con su primer desafío sobre Making Squared Words . ¿Qué pasa si duplicamos el número de lados?

El reto

Tome una cadena como entrada en cualquier formato razonable que necesite ( string, charmatriz ...) y envíe una representación octogonal de la entrada (también en cualquier formato razonable:, stringlista de strings, charmatriz ...) como en los siguientes ejemplos:

Input: golf
Output:

   golf
  o    l
 l      o
f        g
l        o
o        l
g        f
 o      l
  l    o
   flog


Input: HelloWorld
Output:

         HelloWorld
        e          l
       l            r
      l              o
     o                W
    W                  o
   o                    l
  r                      l
 l                        e
d                          H
l                          e
r                          l
o                          l
W                          o
o                          W
l                          o
l                          r
e                          l
H                          d
 e                        l
  l                      r
   l                    o
    o                  W
     W                o
      o              l
       r            l
        l          e
         dlroWolleH


Input: a
Output:

a


Input: ab
Output:

 ab
b  a
a  b
 ba


Input: code golf
Output:

        code golf
       o         l
      d           o
     e             g

   g                 e
  o                   d
 l                     o
f                       c
l                       o
o                       d
g                       e

e                       g
d                       o
o                       l
c                       f
 o                     l
  d                   o
   e                 g

     g             e
      o           d
       l         o
        flog edoc

Notas

  • La entrada consistirá solo en caracteres ASCII imprimibles.
  • Se permiten espacios en blanco iniciales y / o finales y líneas nuevas siempre que se mantenga la forma octogonal.
  • Este es el , ¡así que puede ganar el programa / función más adecuado para cada idioma!
Charlie
fuente
55
"¿Qué pasa si duplicamos el número de lados?" <- entonces el carbón todavía ganaría
Leaky Nun
Caso de prueba sugerido:code golf
Leaky Nun
@LeakyNun se <Space>considera imprimible?
V. Courtois
2
@ V.Courtois
Leaky Nun
@LeakyNun agregó un caso de prueba.
Charlie

Respuestas:

10

Carbón , 16 bytes (10 bytes sin competencia)

F⁸«✂θ⁰±¹↷¹A⮌θθ»θ

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

F⁸«                 Repeat for each side of the octagon
   ✂θ⁰±    ¹        Print the input except the last character
        ↷¹          Rotate 45° clockwise
          A⮌θθ      Reverse the input string
              »θ    Print the input again, to handle the length 1 case

Corrección alternativa de longitud 1, también 16 bytes: versión detallada.

PθF⁸«✂θ⁰±¹↷¹A⮌θθ

Una corrección de errores de carbón significa que ahora funciona el siguiente código de 10 bytes: versión detallada.

F⁴«θ←↘⮌θ↖⟲
Neil
fuente
Parece que debería hacer esto. Lol
Urna de pulpo mágico
1
Umm, no creo que code golffuncione, ¿verdad?
Erik the Outgolfer
Ah, y esto es de hecho 16 bytes (reemplazar θθθcon θθ»θ).
Erik the Outgolfer
@EriktheOutgolfer Oops, perdón por eso, no pensé en probar mi solución para el caso de longitud 1 ... mi registro de prueba en la pregunta no ha sido muy bueno, ¿verdad?
Neil
@Neil Pero, ¿qué pasa con el problema code golf? Creo que tiene que ver con la forma en que Charcoal toma aportes, lo que, desafortunadamente, lo descalifica por completo de este desafío, ya que no se puede eludir.
Erik the Outgolfer
5

JavaScript (ES6), 156 bytes

f=
s=>[...Array((l=s.length-1)*3+1)].map((_,i,a)=>a.map((_,j)=>s[i+j-l?l*5-i-j?i+l*2-j?j+l*2-i?i%(l*3)?j%(l*3)?-1:j?i-l:l+l-i:i?l+l-j:j-l:j:l-i:l*3-i:i]||` `))
<input oninput=o.textContent=this.value?f(this.value).map(function(a){return(a.join``)}).join`\n`:``><pre id=o>

Devuelve una matriz de caracteres.

Neil
fuente
1
Parece funcionar solo con cadenas de longitud 4.
Charlie
1
@CarlosAlejo Lo siento, no lo revisé con suficiente cuidado. Convenientemente, arregle 2 bytes guardados!
Neil
¡Oh, eso es un montón de ternarios ?:!
Erik the Outgolfer
@EriktheOutgolfer, bueno, no es Python o eso sería realmente detallado: P
Stephen
3

Mathematica, 247 bytes

(T=Table;k=Length[s=Characters@#];If[k==1,#,Column[Flatten@{#,T[""<>{s[[i]],T["  ",k/2-2+i],s[[-i]]},{i,2,k}],T[""<>{s[[-i]],T["  ",k+k/2-2],s[[i]]},{i,2,k}],T[""<>{s[[i]],T["  ",3k/2-1-i],s[[-i]]},{i,2,k-1}],StringReverse@#},Alignment->Center]])&
J42161217
fuente
No necesita Alignmenty guardaría bytes usando delayedset ( :=) para reducir la repetición de s[[i]]y s[[-i]], obtiene 224 bytes con estas ideas: (T = Tabla; q: = s [[i]]; r: = s [[- i]]; k = Longitud [s = Caracteres @ #]; Si [k == 1, #, Columna [Flatten @ {#, T ["" <> {q, T ["", k / 2-2 + i], r}, {i, 2, k}], T ["" <> {r, T ["", k + k / 2-2], q}, {i, 2, k}], T ["" <> {q, T ["", 3k / 2-1-i], r}, {i, 2, k-1}], StringReverse @ #}, Centro] ]) & Además, tengo una solución alternativa que solo tiene 145 bytes en el momento de este comentario.
Mark S.
2

Pyth , 79 69 65 bytes

j++K+]+*dJtlzzm+++*;-Jd@zd*;+ytdlz@z_hdSJjL*;t*3tlztC_B_zt__MC.tK

Banco de pruebas .

Monja permeable
fuente
2

Japt , 84 79 bytes

-5 bytes gracias a @ETHproductions.


Ål
VoA{A?(UÅw +Uê)£Y¥V*2+AªY¥V-A?X:SÃ:Vç +U+Vç
Wf cU¬£V?(V*3 ç hUg~Y)+X:XÃcWz2

La nueva línea líder es parte del programa. Toma una cadena como entrada y devuelve una matriz de cadenas.

Pruébalo en línea!con la -Rbandera para unir la matriz resultante con nuevas líneas.

No es mi trabajo más orgulloso, pero al menos lo obtuve de ~ 100 bytes. Mi idea aquí era crear las partes superior y media, luego agregar la parte superior, girada 180 °.

Justin Mariner
fuente
Agradable. No veo un montón de mejoras de inmediato, pero se puede cambiar Ul Éa UÅl, y el interruptor V y W para guardar 2 bytes más: codepen.io/justinm53/full/...
ETHproductions
Además, AnV ?-> V-A?, y Uq £->U¬£
ETHproductions
@ETHproductions ¡Genial, gracias! No puedo creer que me haya olvidado ¬.
Justin Mariner
1

Python 2 , 220 213 bytes

  • Sorprendentemente más largo de lo que había imaginado.
a=input()
l=len(a)
r=range(l)
print'\n'.join(p.center(l*3-2)for p in[a]+(l>1)*([a[i]+(2*i-2+l)*' '+a[~i]for i in r[1:-1]]+[a[~i]+(l*3-4)*' '+a[i]for i in r]+[a[i]+(3*l-2*i-4)*' '+a[~i]for i in r[1:-1]]+[a[::-1]]))

Pruébalo en línea!

officialaimm
fuente
1

PHP 7.1, 230 156 155 bytes

for($x=$e=strlen($s=$argn)-1;$n<9;$r[$y][$x+=$n+1&3?$n&4?-1:1:0]=$s[$i],$i+=($n+=!$i||$i==$e)&1?:-1)$r[$y+=$n-1&3?$n<6?:-1:0]=$r[$y]?:"";echo join("
",$r);

Ejecutar como tubería -nRo probarlo en línea .

Descompostura

for($x=$e=strlen($s=$argn)-1;   # import to $s, set $e to length-1, init $x
    $n<9;                       # loop through 8 repetitions of string
    $r[$y][
        $x+=$n+1&3?$n&4?-1:1:0      # 3. increment/decrement $x depending on $n
    ]=$s[$i],                       # 4. copy character to current position
    $i+=(
        $n+=!$i||$i==$e             # 5. if first or last character of string, increment $n
    )&1?:-1                         # 6. if odd repetition next, else previous character
)
    $r[
        $y+=$n-1&3?$n<6?:-1:0       # 1. increment/decrement $y depending on $n
    ]=$r[$y]?:"";                   # 2. if empty, init row to string
echo join("\n",$r);             # output
Titus
fuente
1

Mathematica, 168 166 147 127 bytes

(n=Length@#;b=Array[" "&,3{n,n}-2];Do[l={{1,n+k-1},{k,n-k+1}};l=Join[l,Cross/@l];b=ReplacePart[b,Join[l,-l]->#[[k]]],{k,n}];b)&

Esto toma una lista de cadenas de un carácter y genera una matriz de cadenas de un carácter.

Ahorré 18 bytes explotando la simetría de usar -ly Cross/@lque toma algo así como un producto cruzado de cada uno de los dos individuales 2D vectores para llevar {x,y}a {-y,x}. Básicamente, las dos direcciones iniciales son Este (borde superior) y Suroeste (borde superior derecho). Luego agregamos rotaciones de 90 grados en sentido antihorario con Cross: Norte para el borde izquierdo y Sureste para el borde inferior izquierdo. Luego agregamos las otras cuatro piezas usando-l para voltear las cuatro que cubrimos.

Puedes probarlo en el sandbox con algo como:

(n=Length@#;b=Array[" "&,3{n,n}-2];Do[l={{1,n+k-1},{k,n-k+1}};l=Join[l,Cross/@l];b=ReplacePart[b,Join[l,-l]->#[[k]]],{k,n}];b)&[{"H","e","l","l","o"," ","G","o","l","f"}]//MatrixForm
Marcas.
fuente