Aplana el CUBO

17

¿Alguna vez miras las formas 3D y crees que tenemos 2 muchas dimensiones? ¡Así que hagamos 3D en 1D! (¿Ves lo que hice ahí?)

Tarea

Dada una representación 2D de un cubo (diseño a continuación), aplánelo en una sola cadena, basada en punteros.

El cubo

Este es el diseño del cubo lleno de no-ops ( ,) y punteros en las esquinas ( <>v^/). El puntero de navegación (NP) comienza el programa donde se muestra.

         | NP begins here, moving right.
         V
         >,,,,,,,,,,,,,,,,,,v
        ,                  ,,
       ,                  , ,
      ,                  ,  ,
     ,                  ,   ,
    ,                  ,    ,
   ,                  ,     ,
  ,                  ,      ,
 ,                  ,       ,
/,,,,,,,,,,,,,,,,,,/        /
,                  ,       ,
,                  ,      ,
,                  ,     ,
,                  ,    ,
,                  ,   ,
,                  ,  ,
,                  , ,
,                  ,,
^,,,,,,,,,,,,,,,,,,<

El NP continúa moviéndose desde el principio hasta que encuentra una esquina. Cada esquina tiene una dirección predeterminada que, a menos que sea anulada en la esquina por un puntero, apuntará el NP en una nueva dirección. Se muestran en el diagrama anterior. Los punteros en el programa son v^<>/(los /puntos hacia abajo o hacia arriba, debido al diseño, nunca habrá ninguna confusión entre los dos)

El NP deja de moverse cuando llega al símbolo (Sí, sé que este es un carácter de varios bytes, trata con él). Cada carácter que pasa se agrega a la cadena de salida final, excepto los punteros, el no-op ( ,) y el símbolo.

Entrada

De entrada será una cadena de múltiples líneas que coincide con el trazado de la CUBO con los caracteres de espacio en blanco no sustituidos con cualquier carácter en el rango 0x21de 0x7Ey al menos una instancia de la EOF.

Puede tomar la entrada como:

  • Una cuerda multilínea
  • Una lista de cadenas donde cada línea es un elemento nuevo en la lista
  • Una lista 2D de cadenas donde cada línea se divide en una lista

Salida

El cubo, aplanado en una sola línea.

Puntero Condicional

El NP tiene un valor booleano que se usa para algo llamado puntero "condicional" que comienza en true.

El puntero "condicional" ( ?) es un puntero que se alternará el valor NP entre truey falsecada vez que se utiliza. Los punteros condicionales solo tienen efecto cuando se usan en las esquinas donde se encuentran 3 pistas (esquina de 3 puntos). Si el valor es truecuando el NP alcanza el puntero condicional, el NP se mueve a la dirección predeterminada en la imagen CUBE y, después de ser dirigido, el valor NP se alterna. Por lo tanto, si está activado false, el NP sigue la dirección no predeterminada.

Nunca habrá una instancia en la que el NP vaya hacia un condicional y la dirección predeterminada es la dirección de la que acaba de llegar. Imagine que esta es la esquina izquierda de la cara frontal y el valor NP es actualmente true:

      NP direction
      /
     ,
    ,
,,,?
   ,
   ,

Esto nunca sucederá, ya que la dirección predeterminada lo reflejará de nuevo a como era.

Si el puntero condicional está en una esquina de 3 puntos:

  • No se agrega a la cadena final
  • El valor de NP se alterna entre truey false después de que se haya dirigido el NP.
  • Si el valor de NP es true, el NP se redirige a la dirección predeterminada . De lo contrario, se redirige a la dirección no predeterminada .

Si está en una pista o en una esquina de 2 puntos:

  • Se agrega a la cadena final
  • el valor se alterna
  • La IP no está dirigida

Algo a tener en cuenta

Si un puntero está en una pista y no apunta a espacios, el NP se dirige a la nueva pista, agrega el siguiente carácter a la cadena final y gira el NP 90 grados a la derecha.

 abcd
   >e
  g f
 /
NP direction

aplanaría a

(...) gef (...)

NO

(...) g>def (...)

Un /puntero no redirige el NP en este caso, ya que puede redirigir a un espacio

     f
     e
> ab/d

se convertiría ab/def

Reglas

  • El ancho, la altura y la profundidad del cubo pueden cambiar.
  • La altura y la profundidad del cubo siempre serán las mismas y serán la mitad del ancho, por lo que el ancho siempre será uniforme.
  • El ancho será entre (inclusive) 6 y 60.
  • Siempre habrá un EOF ( ) que puede ser alcanzado por el NP. Por ejemplo, nunca habrá algo como esto en el cubo: <¶>ya que el NP nunca podrá alcanzar el cubo.
  • Como no se puede insertar un espacio en las pistas del cubo, la cadena final nunca debería tener un espacio.
  • Si se coloca un puntero en una de las pistas (no en una esquina) y dirigiría el NP a espacios, el NP se mantiene constante y el carácter se agrega a la cadena final.
  • Sin embargo, si el puntero lo mantiene en la pista, se dirige el NP y no se agrega el carácter del puntero
  • Como no-ops ( ,) no se agregan a la cadena final, la cadena final no debe contener ninguna ,.
  • Puede suponer que la entrada será correcta.
  • Este es un código más corto en bytes gana!

Ejemplos

Input
Output
-----
Input
Output

  abcdef
 ¶    ,g
q,,,,, h
p    ,i
onmlkj

abcdefghijklmnopq

-----

         >,,,,,,,,,,,,,,,,,,v
        ¶                  ,,
       ,                  , ,
      ,                  ,  ,
     ,                  ,   ,
    ,                  ,    ,
   ,                  ,     ,
  ,                  ,      ,
 ,                  ,       ,
/,,,,,,,,,,,,,,,,,,/        /
,                  ,       ,
,                  ,      ,
,                  ,     ,
,                  ,    ,
,                  ,   ,
,                  ,  ,
,                  , ,
,                  ,,
^,,,,,,,,,,,,,,,,,,<

nothing

-----

                   Mr/~gm,Vc!r,0cbmPC@Zg9jb)7=m^ppwN*Nuk){r
                  c                                      ¶Z
                 J                                      ; #
                e                                      j  8
               ]                                      b   "
              #                                      `    4
             h                                      $     -
            p                                      n      2
           L                                      S       P
          B                                      ;        R
         @                                      J         D
        E                                      N          <
       O                                      \           p
      B                                      y            =
     |                                      9             ;
    T                                      x              [
   6                                      o               k
  !                                      L                =
 E                                      K                 ~
>mjmz6,?A*Q)^.a:IpGP"^bK}DSXL)2F!BV|"m6/                  T
a                                      A                 6
5                                      =                p
1                                      i               R
4                                      /              ?
-                                      Z             (
1                                      "            `
'                                      0           {
N                                      p          M
O                                      *         K
Z                                      J        $
"                                      (       d
4                                      +      o
f                                      U     g
i                                      v    b
U                                      ~   L
U                                      M  h
g                                      ^ D
2                                      (g
5]u*n<Ldn</9/XQyC444Va\m}W3Rf,rp"a@5cZB0

(Newlines added for readability)
Mr/~gmVc!r0cbmPC@Zg9jb)7=m^ppwN*Nuk){rZ#8"4-2PRD<p=;[k=~T
6pR?(`{MK$dogbLhDg0BZc5@a"prfR3W}m\aV444CyQX/9/ndLn*u]52g
UUif4"ZON'1-415amjmz6?A*Q)^.a:IpGP"^bK}DSXL)2F!BV|"m6KLox9
y\NJ;Sn$`bj;

-----

       NEWYORKCITYBABY!
      ¶              ,,
     ,              , ,
    ,              ,  ,
   ,              ,   ,
  ,              ,    ,
 ,              ,     ,
,,,,,,,,,,,,,,,,      ,
,              ,     ,
,              ,    ,
,              ,   ,
,              ,  ,
,              , ,
,              ,,
,,,,,,,,,,,,,,,,

NEWYORKCITYBABY!

-----

                          /{Y!_(=-)s<e!D^<+<+1o30d>QOx9kfu?3X2I:8],t>Ye~,Y9/6;u@
                         ]                                                    >Y
                        !                                                    1 )
                       c                                                    7  8
                      ^                                                    K   &
                     f                                                    K    9
                    M                                                    }     O
                   s                                                    _      ?
                  h                                                    N       e
                 ?                                                    u        ,
                g                                                    =         s
               >                                                    Q          M
              a                                                    0           9
             b                                                    c            (
            h                                                    {             c
           [                                                    m              *
          I                                                    R               %
         K                                                    E                >
        u                                                    5                 n
       W                                                    f                  ]
      }                                                    |                   y
     F                                                    E                    q
    )                                                    <                     ;
   X                                                    L                      S
  F                                                    M                       |
 u                                                    *                        Z
>XZpJ=L`+8ONRk?T7$qVr6-U^f14{>>ABEEP`Mjx&T[/&o*F=*qq{/                         e
¶                                                    <                        ^
+                                                    P                       C
.                                                    x                      m
;                                                    ^                     >
y                                                    4                    b
5                                                    v                   `
Q                                                    B                  c
2                                                    e                 r
a                                                    x                I
3                                                    1               Y
Q                                                    v              `
w                                                    ;             o
*                                                    S            h
E                                                    b           S
r                                                    6          P
M                                                    `         l
%                                                    M        A
-                                                    `       "
j                                                    \      s
}                                                    ~     J
$                                                    h    c
%                                                    p   O
I                                                    Z  Z
]                                                    N E
`                                                    3<
x^}}SI"-a3[%7U5EV}"UM?Aov|E_yjrMt<HAQ@}QAABO&y//R0$\2p

(Newlines added for readability)
]!c^fMsh?g>abh[IKuW}F)XFuXZpJ=L`+8ONRk?T7$qVr6-U^f14{ABEE
P`Mjx&T[/&o*F=*qq{*ML<E|f5ERm{c0Q=uN_}KK71Y)8&9O?esM9(c*%
>n]yq;S|Ze^Cm>b`crIY`ohSPlA"sJcOZE3NZph~\`M`6bS;;Sb6`M`\~
hpZN3p2\$0R//y&OBAAQ}@QAHtMrjy_E|voA?MU"}VE5U7%[3a-"IS}}^
x`]I%$}j-%MrE*wQ3a2Q5y;.+

-----

   %:biv+|?
  ¶      \+
 T      c ,
?{yX<//v  "
i      [ @
Q      Tj
U8sUNl.?

%:biv+|+"@jT[[T.lNUs8UQi{yXXy{T

-----

     FCf2hoYA)&*j
    F          ¶#
   3          p (
  &          ~  w
 ;          *   t
39Hq{F'MmmO/    9
5          \   D
-          |  }
8          c l
a          25
GKa"<0/7MG[?

FCf2hoYA)&*j#(wt9D}l5[GM7/0"aKGa8-53;&3FFCf2hoYA)&*j#(wt9D}l52c|\*~p

-----

           #S^[WNk3;9v;e2\h!@CI#Il?
          G                      g`
         $                      2 \
        V                      9  S
       m                      Y   b
      6                      )    *
     U                      '     V
    [                      g      V
   I                      8       X
  <                      T        U
 K                      ¶         C
?ozMt+xxxxutvQgkx&D9I/<v          '
w                      K         p
V                      y        h
(                      R       y
e                      P      i
]                      !     x
Z                      /    s
y                      w   '
#                      X  4
c                      ~ W
Z                      E,
~IdXPYS.Lc49lC~vjULUBv.?

(Newlines added for readability)    
#S^[WNk3;9v;e2\h!@CI#Il`\Sb*VVXUC'phyixs'4WE~Xw/!PRyKKyRP!/wX~E
.vBULUjv~Cl94cL.SYPXdI~Zc#yZ]e(VwozMt+xxxxutvQgkx&D9I//I9D&xkgQ
vtuxxxx+tMzoK<I[U6mV$G#S^[WNk3;9v;e2\h!@CI#Ilg29Y)'g8T
caird coinheringaahing
fuente
No hay problema :) Realmente agradable desafío por cierto! :)
HyperNeutrino
@HyperNeutrino Me siento un poco culpable ahora que la recompensa ha comenzado. Este era un proyecto en el que estaba trabajando pero me di por vencido y decidí publicar. ¡Así que puedo pulir mi antigua solución y publicarla para obtener la recompensa! Sin embargo, solo haré eso si no hay una respuesta para el final de la semana, sin embargo
caird coinheringaahing
@RandomUser sigue adelante y publica una respuesta ahora, las personas estarán más inclinadas a responder cuando tengan algo que superar. Y no se alimente culpable, es el equivalente a 5 votos a favor.
programador 5000
@ programmer5000 No está terminado y no está cerca del campo de golf, pero debería hacerlo en unos días
caird coinheringaahing
@RandomUser derp
Stephen

Respuestas:

8

Pitón 3 , 1558 1553 1419 1417 1347 1258 bytes

L=list
M=map
Q=len
m=~0
G,H,J,K,Y,I=[0,1],[0,m],[1,0],[m,0],[m,1],[1,m]
def U(p,c,u,a):
 global F;F+=c*a
 try:u=[G,J,I,I,Y,K,H][[[0,h],[0,w],[h,w],[h,e],[h,0],[l,0],[l,e]].index(p)]
 except:0
 p=L(M(sum,zip(p,u)));return F,p,u
def f(a):
 global w,h,e,l,F;a=L(M(L,a.split('\n')));p=0,0
 for(i)in range(Q(a[0])):
  if' '<a[0][i]:p=0,~-i,;break
 c,P,F,w,h,e,l,t=a[p[0]][p[1]],'><^v/','',~-Q(a[0]),Q(a)//2,~-Q(a[m]),~-Q(a),{'v':J,'^':K,'>':G,'<':H}
 C,u,s,r,E=[[0,w],[0,h],[h,w],[h,e],[h,0],[l,0],[l,e]],[G,t.get(c,I)][c in P],0,1,[[0,w-1],[1,w-1],[1,w],[~-h,1],[h,1],[e-2,-~e],[e-2,e]]
 while'¶'!=c:
  k=p,c,u
  g=L(M(sum,zip(p,u)))
  if s:s=0;u=u[::m]
  if(c)in' ,':F,p,u=U(*k,0)
  elif(c)in P:
   if(p)in C:u=[t[c],[Y,I][p[1]==w]][c=='/'];p=g
   elif(p)in E:F,p,u,s=[(F,g,t[c],1),U(*k,1)+s][c=='/']
   else:
    o=t.get(c,u)
    try:n=a[p[0]+o[0]][p[1]+o[1]];u=[u,o][(' '<n)*~(p[0]<1<'^'==c)]
    except:0
    if u!=t.get(c):F,p,u=U(*k,1)
    else:p=g
  elif'?'==c:
   F+=c*-~(p in C!=F[m]!=c);r=~r
   if~r<1and(p)in[[0,w],[h,e],[h,0],[l,e]]:u=[[I,H][u!=G],[H,J][u!=K],[G,J][u!=K],[K,Y][u!=I]][[[0,w],[h,e],[h,0],[l,e]].index(p)];p=L(M(sum,zip(p,u)))
   elif-1>r:F,p,u=U(*k,0)
  else:F,p,u=U(*k,1)
  c=a[p[0]][p[1]]
 for(c)in'?, ':F=F.replace(c,'')
 return F

Pruébalo en línea!

Guardado 5 bytes gracias a @sagiksp

Ahorró 20 bytes gracias a @ Mr.Xcoder y @totallyhuman en el chat

Ahorro de 128 bytes gracias a varios trucos de golf.

Guardado 72 bytes gracias a @JonathanFrech

Ahorró otros 89 bytes gracias a @ Mr.Xcoder

caird coinheringaahing
fuente
Buen golf, aunque te perdiste algunos not(p[0] == 0), podría ser justo p[0]!=0.
sagiksp
puede cortar muchos bytes diferenciando los niveles de sangría con un solo byte
Uriel
@Uriel las pestañas en realidad van spaceluego \t(pestaña) y luego space\tetc. Es la forma en que SE formatea las publicaciones
caird coinheringaahing
@Ilikemydog oh genial
Uriel
¿Por qué sangría en absoluto?
Shaggy