Achatar o CUBO

17

Você já viu formas 3D e acha que temos duas dimensões? Então, vamos transformar 3D em 1D! (Veja o que eu fiz lá?)

Tarefa

Dada uma representação 2D de um cubo (layout abaixo), alise-o em uma única sequência, com base em ponteiros.

O cubo

Esse é o layout do cubo preenchido com no-ops ( ,) e ponteiros nos cantos ( <>v^/). O ponteiro de navegação (NP) inicia o programa onde mostrado.

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

O NP continua se movendo desde o início até encontrar um canto. Cada canto tem uma direção padrão que, a menos que seja substituída no canto por um ponteiro, apontará o NP para uma nova direção. Eles são mostrados no diagrama acima. Os ponteiros do programa são v^<>/(os /pontos em baixo ou em cima, devido ao layout, nunca haverá confusão entre os dois)

O NP para de se mover quando atinge o símbolo (Sim, eu sei que esse é um caractere de vários bytes, lide com ele). Cada caractere sobreposto é adicionado à sequência de saída final, exceto os ponteiros, o no-op ( ,) e o símbolo.

Entrada

A entrada será uma sequência de várias linhas que corresponda ao layout do CUBO com os caracteres que não sejam espaços em branco substituídos por qualquer caractere no intervalo 0x21para 0x7Ee pelo menos uma instância do EOF.

Você pode receber informações como:

  • Uma sequência multilinha
  • Uma lista de cadeias em que cada linha é um novo elemento na lista
  • Uma lista 2D de cadeias em que cada linha é dividida em uma lista

Resultado

O cubo foi achatado em uma única linha.

Ponteiro condicional

O NP possui um valor booleano usado para algo chamado ponteiro "condicional" que começa em true.

O ponteiro "condicional" ( ?) é um ponteiro que alternará o valor NP entre truee falsetoda vez que for usado. Ponteiros condicionais só têm efeito quando usados ​​nos cantos onde 3 faixas (canto de 3 pontos) se encontram. Se o valor for truequando o NP atingir o ponteiro condicional, o NP se moverá para a direção padrão na imagem CUBE e, após ser direcionado, o valor do NP será alternado. Portanto, se estiver ativado false, o NP segue a direção não padrão.

Nunca haverá um caso em que o NP vá em direção a uma condição e a direção padrão é a direção de onde veio. Imagine que este é o canto esquerdo da face frontal e o valor NP seja atualmente true:

      NP direction
      /
     ,
    ,
,,,?
   ,
   ,

Isso nunca acontecerá, pois a direção padrão o espelhará de volta a como era.

Se o ponteiro condicional estiver em um canto de 3 pontos:

  • Não é adicionado à sequência final
  • O valor do NP é alternado entre truee false após o NP ter sido direcionado.
  • Se o valor NP for true, o NP será redirecionado para a direção padrão . Caso contrário, ele será redirecionado para a direção não padrão .

Se estiver em uma pista ou em uma esquina de 2 pontos:

  • É adicionado à sequência final
  • o valor é alternado
  • O IP não é direcionado

Algo a observar

Se um ponteiro estiver em uma trilha e não apontar para espaços, o NP é direcionado para a nova trilha, adiciona o próximo caractere à sequência final e gira o NP 90 graus para a direita.

 abcd
   >e
  g f
 /
NP direction

achataria para

(...) gef (...)

NÃO

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

Um /ponteiro não redireciona o NP nesta instância, pois pode redirecionar para um espaço para que

     f
     e
> ab/d

se tornaria ab/def

Regras

  • A largura, altura e profundidade do cubo podem mudar
  • A altura e a profundidade do cubo sempre serão as mesmas e terão metade da largura, portanto a largura será sempre uniforme.
  • A largura estará entre (inclusive) 6 e 60.
  • Sempre haverá um EOF ( ) que pode ser alcançado pelo NP. Por exemplo, nunca haverá algo assim no cubo: <¶>como o NP nunca seria capaz de alcançá-lo.
  • Como um espaço não pode ser inserido nas faixas do cubo, a sequência final nunca deve ter um espaço nele.
  • Se um ponteiro for colocado em uma das faixas (não em um canto) e direcionar o NP para espaços, o NP permanecerá constante e o caractere será adicionado à sequência final.
  • No entanto, se o ponteiro o mantiver na faixa, o NP será direcionado e o caractere do ponteiro não será adicionado.
  • Como no-ops ( ,) não é adicionado à sequência final, a sequência final não deve conter nenhum ,.
  • Você pode assumir que a entrada estará correta.
  • Este é um e o código mais curto em bytes vence!

Exemplos

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
fonte
Não tem problema :) Realmente bom desafio btw! :)
HyperNeutrino
@HyperNeutrino Eu meio que me sinto culpada agora que a recompensa começou. Este era um projeto em que eu estava trabalhando, mas desisti e decidi postar. Para que eu possa polir minha solução antiga e publicá-la como recompensa! Eu só vou fazer isso se não houver nenhuma resposta até o final da semana, embora
Caird coinheringaahing
@RandomUser, vá em frente e poste uma resposta agora, as pessoas estarão mais inclinadas a responder quando tiverem algo a superar. E não se alimente culpado, é o equivalente a 5 respostas positivas.
Programmer5000
@ programmer5000 Ele não está terminado e não onde perto golfed mas eu deveria fazê-lo em poucos dias
caird coinheringaahing
@RandomUser derp
Stephen

Respostas:

8

Python 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

Experimente online!

Guardado 5 bytes graças a @sagiksp

Economizou 20 bytes graças a @ Mr.Xcoder e @totallyhuman no chat

Economizou 128 bytes graças a vários truques de golfe

Guardado 72 bytes graças a @JonathanFrech

Guardou outros 89 bytes graças a @ Mr.Xcoder

caird coinheringaahing
fonte
Bom golfe, embora você tenha perdido alguns deles not(p[0] == 0), poderia ser justo p[0]!=0.
2331717
você pode cortar muitos bytes por diferentes níveis de recuo com apenas um único byte
Uriel
@Uriel as guias realmente ir spaceem seguida, \t(guia), em seguida, space\tetc. Seus do jeito SE formatos mensagens
Caird coinheringaahing
@Ilikemydog oh great
Uriel
Por que recuar?
Shaggy