Ratakan CUBE

17

Apakah Anda pernah melihat bentuk 3D dan berpikir kami memiliki 2 banyak dimensi. Jadi mari kita buat 3D menjadi 1D! (Lihat apa yang saya lakukan di sana?)

Tugas

Diberikan representasi 2D dari sebuah kubus (tata letak di bawah), ratakan menjadi string tunggal, berdasarkan pointer.

Kubus

Ini adalah tata letak kubus yang diisi dengan no-ops ( ,) dan pointer di sudut-sudut ( <>v^/). Navigasi Pointer (NP) memulai program di mana ditampilkan.

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

NP terus bergerak dari awal sampai bertemu sudut. Setiap sudut memiliki arah default yang, kecuali diganti di sudut oleh pointer, akan mengarahkan NP ke arah yang baru. Mereka ditunjukkan pada diagram di atas. Pointer dalam program ini adalah v^<>/( /poinnya turun atau naik, karena tata letak tidak akan pernah ada kebingungan di antara keduanya)

NP berhenti bergerak ketika mencapai simbol (Ya saya tahu ini adalah karakter multi-byte, atasi). Setiap karakter yang ditambahkan ditambahkan ke string hasil akhir kecuali untuk pointer, no-op ( ,) dan simbol.

Memasukkan

Input akan berupa string multi-baris yang cocok dengan tata letak CUBE dengan karakter non-spasi putih diganti dengan karakter apa pun dalam rentang 0x21ke 0x7Edan setidaknya satu instance dari EOF.

Anda dapat mengambil input sebagai:

  • String multiline
  • Daftar string di mana setiap baris adalah elemen baru dalam daftar
  • Daftar 2D string di mana setiap baris dipecah menjadi daftar

Keluaran

Kubus, diratakan menjadi string baris tunggal.

Pointer Bersyarat

NP memiliki nilai boolean yang digunakan untuk sesuatu yang disebut pointer "kondisional" yang dimulai pada true.

Pointer "kondisional" ( ?) adalah sebuah pointer yang akan mengganti nilai NP antara truedan falsesetiap kali digunakan. Pointer bersyarat hanya berlaku ketika digunakan di sudut-sudut tempat 3 trek (sudut 3 titik) bertemu. Jika nilainya trueketika NP mencapai penunjuk kondisional, NP bergerak ke arah default pada gambar CUBE dan, setelah diarahkan, nilai NP diubah. Oleh karena itu, jika aktif false, NP mengikuti arah non-default.

Tidak akan pernah ada contoh di mana NP menuju conditional dan arah default adalah arah dari mana asalnya. Bayangkan bahwa ini adalah sudut kiri muka depan dan nilai NP saat ini true:

      NP direction
      /
     ,
    ,
,,,?
   ,
   ,

Ini tidak akan pernah terjadi karena arah default akan mencerminkannya kembali ke keadaan semula.

Jika penunjuk kondisional berada di sudut 3 titik:

  • Itu tidak ditambahkan ke string terakhir
  • Nilai NP diubah antara truedan false setelah NP diarahkan.
  • Jika nilai NP adalah true, NP dialihkan ke arah default . Kalau tidak, itu diarahkan ke arah non-default .

Jika berada di trek atau sudut 2 poin:

  • Itu ditambahkan ke string terakhir
  • nilai yang toggle
  • IP tidak diarahkan

Sesuatu yang harus diwaspadai

Jika sebuah pointer berada di trek dan tidak mengarah ke spasi, NP diarahkan ke trek baru, menambahkan karakter berikutnya ke string terakhir dan memutar NP sebesar 90 derajat ke kanan.

 abcd
   >e
  g f
 /
NP direction

akan rata

(...) gef (...)

TIDAK

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

Sebuah /pointer tidak mengarahkan NP dalam hal ini karena dapat mengarahkan ke ruang angkasa sehingga

     f
     e
> ab/d

akan menjadi ab/def

Aturan

  • Lebar, tinggi dan kedalaman kubus dapat berubah
  • Tinggi dan kedalaman kubus akan selalu sama dan akan menjadi setengah lebar, sehingga lebarnya akan selalu genap.
  • Lebar akan antara (inklusif) 6 dan 60.
  • Akan selalu ada EOF ( ) yang bisa dijangkau oleh NP. Misalnya tidak akan pernah ada sesuatu seperti ini di kubus: <¶>karena NP tidak akan pernah bisa mencapai kubus.
  • Karena spasi tidak dapat dimasukkan ke trek kubus, string terakhir seharusnya tidak memiliki ruang di dalamnya.
  • Jika pointer ditempatkan di salah satu trek (bukan di sudut) dan itu akan mengarahkan NP ke spasi, NP tetap konstan dan karakter ditambahkan ke string terakhir.
  • Namun, jika pointer menyimpannya di trek, NP diarahkan dan karakter pointer tidak ditambahkan
  • Karena no-ops ( ,) tidak ditambahkan ke string terakhir, string terakhir tidak boleh berisi apa pun ,di dalamnya.
  • Anda dapat berasumsi bahwa input akan benar.
  • Ini adalah sehingga kode terpendek dalam byte menang!

Contohnya

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
sumber
Tidak masalah :) Tantangan yang sangat bagus btw! :)
HyperNeutrino
@HyperNeutrino Saya agak merasa bersalah sekarang karena hadiah telah dimulai. Ini adalah proyek yang sedang saya kerjakan tetapi menyerah dan memutuskan untuk memposting. Jadi saya bisa memoles solusi lama saya dan mempostingnya untuk hadiah! Saya hanya akan melakukan itu jika tidak ada jawaban pada akhir minggu, meskipun
caird coinheringaahing
@RandomUser lanjutkan dan kirim jawaban sekarang, orang akan lebih cenderung untuk menjawab ketika mereka memiliki sesuatu untuk dikalahkan. Dan jangan beri makan bersalah, itu setara dengan 5 jawaban upvotes.
programmer5000
@ programmer5000 Ini belum selesai dan tidak ada tempat dekat golf tapi saya harus menyelesaikannya dalam beberapa hari
caird coinheringaahing
@RandomUser derp
Stephen

Jawaban:

8

Python 3 , 1558 1553 1419 1417 1347 1258 byte

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

Cobalah online!

Disimpan 5 byte berkat @sagiksp

Disimpan 20 byte berkat @ Mr.Xcoder dan @totallyhuman dalam obrolan

Disimpan 128 byte berkat berbagai trik golf

Disimpan 72 byte berkat @JonathanFrech

Menyimpan 89 byte lagi berkat @ Mr.Xcoder

caird coinheringaahing
sumber
Golf yang bagus, meskipun Anda melewatkan beberapa pertandingan not(p[0] == 0), itu bisa saja adil p[0]!=0.
sagiksp
Anda dapat memotong banyak byte dengan membedakan level indentasi dengan satu byte saja
Uriel
@Uriel tab sebenarnya pergi spacekemudian \t(tab) lalu space\tdll. Hanya dengan cara SE memformat posting
caird coinheringaahing
@Ilikemydog oh bagus
Uriel
Kenapa lekukan itu?
Shaggy