Bantu saya melepaskan kabel ini!

12

Kabel saya semua kusut!

Bukankah itu menjengkelkan saat kabel-kabel tersangkut? Yah, itu baru saja terjadi pada saya, jadi saya ingin membantu saya melepaskan mereka! Demi kenyamanan Anda, saya telah memutus semuanya dari perangkat, tetapi semuanya masih terhubung ke outlet. Tantangan Anda adalah mencari cara untuk menguraikannya!

Memasukkan

Input akan terdiri dari spasi, pipa, dan Xs (kedua kasus). Masukan akan terlihat seperti ini:

| | | |
 X  | |
| |  x 
|  X  |
| | | |

Huruf kapital X berarti bahwa kawat kiri memotong kawat kanan, dan huruf kecil x berarti sebaliknya. Baris pertama dan terakhir akan selalu | | | |.... Anda dapat mengambil input sebagai string yang dipisahkan koma, array string, dll. Formatnya tidak ketat, asalkan masuk akal dan tidak mengandung informasi tambahan.

Keluaran

Untuk tantangan ini, saya tidak hanya perlu tahu berapa lama saya akan mengambil, saya perlu tahu persis apa yang harus dilakukan. Jadi, keluarkan daftar pasangan integer dengan karakter R atau L, case-sensitive, yang mewakili dua kabel untuk dilepaskan dan ke arah mana (R berarti kanan atas kiri, dan sebaliknya untuk L). Anda perlu memberi tahu saya cara untuk membukanya; Saya tidak bisa memikirkannya sendiri. Output juga cukup fleksibel, selama Anda menampilkan semua karakter pasangan integer + dalam urutan yang benar dan Anda tidak menampilkan teks omong kosong tambahan (tanda kurung, koma, dll. Baik-baik saja). Kabel bisa nol atau satu diindeks, tetapi indeks harus mulai dari kiri. Perhatikan bahwa Anda harus melepaskan dari bagian bawah, bukan bagian atas. Gaya keluaran harus konsisten, dan sebutkan bagaimana Anda menghasilkan jika tidak jelas. Kasus karakter tidak harus konsisten,

Output Sampel

Untuk contoh input di atas, hasilnya akan seperti:

2 3 R
3 4 L
1 2 R

Format keluaran di sini adalah daftar nilai-nilai yang dipisahkan spasi baris baru. Ini 1-diindeks.

Spesifikasi lebih lanjut

Adalah sah untuk memiliki X dan x ditumpuk secara vertikal satu sama lain dalam urutan apa pun. Karena saya malas, saya tidak ingin mengganti kabel secara tidak perlu, jadi jangan mengeluarkan apapun untuk kasus ini; jika saya menemukan itu, saya hanya akan menarik kabel dengan lembut untuk meluruskannya.

Ini juga berlaku untuk memiliki beberapa X dan x ditumpuk secara vertikal, dan selama tidak ada kawat yang terlibat dalam penyeberangan lainnya, saya tidak ingin ada gerakan tambahan (karena saya malas). Jadi, jika karakter X X x X x xmuncul di kolom tanpa penyeberangan lain, hasilnya harus tetap kosong!

Dalam hal ini tidak jelas, R menghilangkan X dan L menghilangkan x.

Mungkin ada dua penyeberangan kawat di baris yang sama, dalam hal ini urutan kedua swap ini tidak masalah. Anda tidak akan pernah mendapatkan sesuatu seperti | X X |(ini tidak masuk akal karena menyiratkan bahwa kawat tengah sedang dilintasi kabel di kedua sisi kiri dan kanannya).

Tidak selalu ada persimpangan ...

Input bisa berupa satu pipa. Namun, input tidak akan pernah kosong.

Solusi valid terpendek menang pada 20 Desember!

Lebih banyak contoh

Seperti yang saya janjikan:

Contoh 1

Memasukkan

| | | | | |
| |  X   x 
 X  |  x  |
|  x  |  X 
 X   X  | |
| | | | | |

Keluaran

1 2 R
3 4 R
2 3 L
5 6 R
1 2 R
4 5 L
3 4 R
5 6 L

Contoh 2

Memasukkan

| | |
 X  |
|  x 
| | |
|  X 
|  x 
| | |

Keluaran

2 3 L
1 2 R

Contoh 3

Memasukkan

|

Output kosong. Ya, Anda harus berurusan dengan kasus ini.

Contoh 4

Memasukkan

| |
 X 
 x 
 X 
 x 
 X 
 x 
 X 
 x 
 X 
 x 
| |

Output kosong. Hanya untuk bersenang-senang :).

Contoh 5

Memasukkan

| |
 X 
 X 
 x 
 X 
 x 
 x 
| |

Output masih kosong ...

HyperNeutrino
sumber
4
Apakah mungkin untuk memiliki dua pasang kawat terjerat dalam barisan yang sama?
James Holderness
1
@ JamesHolderness Ya, benar. Dalam hal ini, urutannya tidak masalah. Saya akan mengklarifikasi itu dalam pertanyaan. Terima kasih!
HyperNeutrino
@JamesHolderness Done!
HyperNeutrino

Jawaban:

1

Befunge, 173 byte

Input dibaca dari stdin dalam format persis yang diberikan dalam deskripsi tantangan, meskipun sangat penting bahwa setiap baris menjadi panjang yang benar dan baris terakhir harus menyertakan baris baru (yaitu bukan hanya EOF di akhir baris itu).

$1>>05p~$~:55+-#v_
$_^#`"N":+1g50$<>:2+3%1-05g6g+0v>!#:v#
vg50-1*2p51:-1_^#:<*2!!-*84p6g5<
 +#,.#$"R"\#\-#+5<^g51$_:0`6*\25g\v@_:#!.#:1#,
>+::25p6g\48*\6p48 *-:!^!:--1*2`0:<

Cobalah online!

Ide dasar untuk solusi ini adalah bahwa kami memiliki "array" yang melacak jumlah twist untuk setiap kabel. Jadi setiap kali kita menemukan twist di satu arah, kita menambah hitungan untuk kabel terkait, sementara twist di arah lain akan menurunkan hitungan.

Pada saat yang sama ketika kami memproses lilitan untuk kabel tertentu, kami juga melihat jumlah lilitan untuk kabel di sebelah kiri dan kanannya. Jika salah satu dari mereka bukan nol, kita perlu "menyiram" tikungan-tikungan itu ke tumpukan, karena tidak mungkin lagi bagi mereka untuk diurai oleh tikungan-tikungan kemudian ke arah yang berlawanan.

Setelah baris input terakhir, aliran input mengembalikan EOF berulang kali, dan karakter EOF ini ditafsirkan sebagai tikungan di setiap kawat, setidaknya untuk keperluan pembilasan. Ini memaksa program untuk mem-flush jumlah yang beredar di array, tetapi tidak akan menghasilkan jumlah twist yang baru.

Setelah kami selesai memproses input, semua perintah untuk melepaskan kabel sekarang akan berada di stack. Ini berarti kita cukup mematikannya dalam urutan terbalik untuk mengeluarkan instruksi yang diperlukan untuk melepaskan kabel dari bawah ke atas.

James Holderness
sumber
Ini tampaknya bekerja dengan sempurna. Kerja bagus!
HyperNeutrino
Ini jawaban yang menang. Kerja bagus! Juga, terima kasih telah memeriksa jawaban lain untuk saya! :)
HyperNeutrino
@AlexL. Terima kasih. Ini adalah jawaban kemenangan pertama saya di situs. Tidak mengira itu akan mungkin terjadi dengan Befunge. :)
James Holderness
Tidak masalah. Selamat atas kemenangan! Saya agak terkejut juga betapa singkatnya Anda membuat jawaban Befunge. :)
HyperNeutrino
5

Pyth - 26 25 byte

Sangat mudah, mungkin saya bisa memfilter penyaringan.

fhhT_m+hB/xrdZ\x2@"RL"}\x

Cobalah online di sini .

Maltysen
sumber
Usaha yang bagus. Sayangnya, karakter yang dihasilkan tidak benar; tampaknya menjadi R setiap kali. Selamat mencoba; jumlahnya keluar dengan benar!
HyperNeutrino
@AlexL. Aku bodoh, aku membalik argumen ke in, memperbaiki, dan itu menyelamatkan saya byte juga
Maltysen
Saya melihat. Jawaban bagus! Dapatkan upvote. :)
HyperNeutrino
2
Jika saya tidak salah, ini tampaknya tidak menangani kasus di mana Anda memiliki X dan x ditumpuk secara vertikal. Ini memberitahu Anda untuk menukar kabel bolak-balik tanpa perlu.
James Holderness
5

JavaScript (ES6), 178 byte

f=([t,...a],r=[])=>a[0]?t.replace(/x/gi,(c,i)=>(c=c<'x'?'R':'L',i=++i/2,r.reduce((f,[j,,d],n)=>f||i<j+2&&j<i+2&&(j-i|c==d||r.splice(n,1)&&2),0)<2?r=[[i,i+1,c],...r]:r))&&f(a,r):r

Mengambil input sebagai array string yang mewakili baris dan mengembalikan array array nilai misalnya [[2, 3, "R"], [3, 4, "L"], [1, 2, "R"]]. Pemesanan terbalik membantu dengan eliminasi.

Neil
sumber
Darimana Anda sberasal? Saya menjalankannya di repl.it dan ia memberi tahu saya bahwa ada ReferenceError: s is not defined.
HyperNeutrino
@AlexL. Ups, saya tidak sengaja menyisipkan kode versi sebelumnya, yang belum selesai bermain golf. Harus diperbaiki sekarang.
Neil
@JamesHolderness Pertanyaan telah diubah sejak saya mengirimkan jawaban saya, saya harus memperbaruinya.
Neil
@JamesHolderness Yap. Maaf soal itu, Neil. Saya hanya perlu mengklarifikasi beberapa bagian dari pertanyaan yang tidak saya klarifikasi sebelumnya.
HyperNeutrino
@ JamesHolderness Saya menyadari bahwa, itulah sebabnya saya telah menandai jawaban saya sebagai tidak bersaing karena menjawab iterasi sebelumnya dari pertanyaan, sampai saya dapat memperbaruinya ke persyaratan saat ini.
Neil
3

Python 2, 244 241 byte

m=[]
for l in input():
 for i in range(len(l)):
  c=l[i];a=i/2+1;L,R=[a,a+1,'LR'[c>'v']],[a,a+1,'RL'[c>'v']];x=m.index(L)if L in m else-1;M=zip(*m[:x+1])
  if c in'xX':
   if x>=0and(a in M[1]or a+1in M[0])<1:del m[x]
   else:m=[R]+m
print m

Mengambil input sebagai daftar string

Contoh:

Memasukkan: ['| | | |', ' X | |', '| | x ', '| X |', ' x | |']

Keluaran: [[1, 2, 'L'], [2, 3, 'R'], [3, 4, 'L'], [1, 2, 'R']]

Sunting: Diperbaiki untuk kasus:

Memasukkan: ['| | |', ' X |', ' X |', ' x |', '| X', ' X |', ' x |', ' x |', '| | |']

Keluaran: [[1, 2, 'L'], [2, 3, 'R'], [1, 2, 'R']]

TFeld
sumber
@ JamesHolderness Harus diperbaiki sekarang.
TFeld
Sepertinya ini berfungsi dengan baik sekarang!
HyperNeutrino
@ JamesHolderness Ya, sepertinya itu masalah. Harap perbaiki itu, TFeld. Kalau tidak, usaha yang bagus!
HyperNeutrino
@AlexL. Harus diperbaiki sekarang
TFeld