Bu telleri çözmeme yardım et!


12

Kablolarım karışık!

Kablolar birbirine dolandığında sinir bozucu değil mi? Bu benim başıma geldi, bu yüzden onları çözmeme yardım etmek istiyorum! Size kolaylık sağlamak için, hepsini cihazdan çıkardım, ancak hepsi hala prize bağlı. Sizin meydan okuma onları çözmek nasıl çözmek için!

Giriş

Girdi boşluklardan, borulardan ve X'lerden (her iki durumda) oluşacaktır. Girdi şöyle görünecektir:

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

Büyük X harfi, sol kablonun sağ kablonun üzerinden geçtiği ve küçük x harfi ise tam tersinin geçtiği anlamına gelir. İlk ve son satırlar her zaman olacaktır | | | |.... Girdiyi virgülle ayrılmış bir dize, bir dizeler dizisi vb. Olarak alabilirsiniz. Biçim, anlamlı olduğu ve fazladan bilgi içermediği sürece katı değildir.

Çıktı

Bu meydan okuma için sadece ne kadar süreceğimi bilmekle kalmamalı, aynı zamanda ne yapacağımı da bilmeliyim. Bu nedenle, R veya L karakteriyle büyük / küçük harfe duyarlı olmayan, hangi iki kablonun çözüleceğini ve hangi şekilde gösterileceğini temsil eden bir tamsayı çifti listesi verin (R, soldan sağa ve L için tersi anlamına gelir). Bana onları geçmenin hangi yolunu söylemelisin; Bunu kendim anlayamıyorum. Tamsayı çiftleri + karakterin tümünü doğru sırayla çıkardığınız ve ekstra saçmalık metin (parantez, virgül vb.) Çıkmadığınız sürece çıktı da oldukça esnektir. Teller sıfır veya bir dizinlenmiş olabilir, ancak dizin soldan başlamalıdır. Yukarıdan değil alttan çözmeniz gerektiğini unutmayın. Çıktı stili tutarlı olmalı ve lütfen belli değilse çıktıyı nasıl verdiğinizi belirtiniz. Karakterin durumu tutarlı değil,

Örnek Çıktı

Yukarıdaki örnek girdi için çıktı aşağıdaki gibi olacaktır:

2 3 R
3 4 L
1 2 R

Buradaki çıktı formatı, boşlukla ayrılmış değerlerin satır satırından ayrılmış bir listesidir. Bu 1 endekslidir.

Diğer özellikler

Her iki sırayla X ve x'in üst üste dikey olarak istiflenmesi geçerlidir. Tembel olduğum için, kabloları gereksiz yere değiştirmek istemiyorum, bu yüzden bu durumlar için hiçbir şey çıkarmayın; bunu bulursam, telleri düz bir şekilde almak için hafifçe çekeceğim.

Birden fazla X ve x'in dikey olarak istiflenmesi de geçerlidir ve hiçbir tel diğer geçişlere dahil olmadığı sürece, fazladan hareket istemiyorum (tembel olduğum için). Bu nedenle, karakterler X X x X x xbaşka bir geçiş olmadan bir sütunda görünürse, çıktı yine de boş olmalıdır!

Bunun net olmaması durumunda R, X'i ve L, x'i ortadan kaldırır.

Aynı sırada iki tel geçişi olabilir, bu durumda bu iki değişimin sırası önemli değildir. Asla böyle bir şey elde | X X |edemezsiniz (bu mantıklı değil çünkü orta telin hem sol hem de sağdaki teller üzerinden geçtiğini ima eder).

Her zaman geçiş yoktur ...

Giriş tek bir boru olabilir. Ancak, giriş asla boş olmaz.

En kısa geçerli çözüm 20 Aralık'ta kazanıyor!

Daha fazla örnek

Söz verdiğim gibi:

örnek 1

Giriş

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

Çıktı

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

ÖRNEK 2

Giriş

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

Çıktı

2 3 L
1 2 R

ÖRNEK 3

Giriş

|

Çıktı boş. Evet, bu dava ile ilgilenmelisin.

Örnek 4

Giriş

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

Çıktı boş. Sadece eğlence için :).

Örnek 5

Giriş

| |
 X 
 X 
 x 
 X 
 x 
 x 
| |

Çıktı hala boş ...


4
Aynı sıraya iki çift tel takılabilir mi?
James Holderness

1
@JamesHolderness Evet, öyle. Bu durumda, sipariş önemli değil. Bunu soruda açıklığa kavuşturacağım. Teşekkürler!
HyperNeutrino

@JamesHolderness Yapıldı!
HyperNeutrino

Yanıtlar:


1

Befunge, 173 bayt

Girdi, her satırın doğru uzunlukta olması ve son satırın bir satırsonu içermesi (yani, satırın sonundaki EOF değil) önemli olmasına rağmen, stdin'den meydan okuma tanımında verilen formatta okunur.

$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:<

Çevrimiçi deneyin!

Bu çözüm için temel fikir, her tel için büküm sayılarını takip eden bir "dizi" ye sahip olmamızdır. Bu nedenle, bir yönde her bükülme ile karşılaştığımızda, ilişkili tel için sayıyı artırırız, diğer yönde bir bükülme sayıyı azaltır.

Belirli bir tel için bükümü işlerken aynı zamanda sol ve sağdaki teller için bükülme sayısına da bakarız. Bunlardan herhangi biri sıfır değilse, bu bükülmeleri yığına "boşaltmamız" gerekir, çünkü artık ters yönde daha sonraki bükülmelerle çözülmeleri mümkün olmayacaktır.

Son giriş satırından sonra, giriş akışı EOF'u tekrar tekrar döndürür ve bu EOF karakterleri en azından yıkama amacıyla her telde bükülme olarak yorumlanır. Bu, programı dizideki tüm önemli sayıları temizlemeye zorlar, ancak yeni büküm sayıları oluşturmaz.

Girişi işlemeyi bitirdikten sonra, kabloları çözmek için tüm komutlar artık yığın üzerinde olacaktır. Bu, kabloları aşağıdan yukarıya doğru çözmek için gereken talimatları çıkarmak için bunları ters sırayla açabileceğimiz anlamına gelir.


Bu mükemmel çalışıyor gibi görünüyor. Aferin!
HyperNeutrino

Bu kazanan cevaptır. Aferin! Ayrıca, benim için diğer cevapları kontrol ettiğiniz için teşekkürler! :)
HyperNeutrino

@AlexL. Teşekkürler. Bu sitedeki ilk kazanan cevabım. Befunge ile bunun mümkün olacağını hiç düşünmemiştim. :)
James Holderness

Sorun değil. Tebrikler kazanıyoruz! Befunge cevabını ne kadar kısa cevapladığınıza çok şaşırdım. :)
HyperNeutrino

5

Pyth - 26 25 bayt

Çok basit, belki filtreleme golf olabilir.

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

Burada çevrimiçi deneyin .


İyi deneme. Ne yazık ki, çıktı alınan karakter doğru değil; her seferinde R gibi görünüyor. İyi olsa deneyin; rakamlar doğru çıkıyor!
HyperNeutrino

@AlexL. Ben aptalım, in
hataları düzeltip sabitlemiştim

Anlıyorum. Güzel cevap! Bir oy verin. :)
HyperNeutrino

2
Yanılmıyorsam, X ve x'in dikey olarak istiflendiği durumun üstesinden gelmez. Kabloları gereksiz yere ileri geri değiştirmenizi söyler.
James Holderness

5

JavaScript (ES6), 178 bayt

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

Girdiyi çizgileri temsil eden bir dizeler dizisi olarak alır ve bir dizi değer dizisi döndürür [[2, 3, "R"], [3, 4, "L"], [1, 2, "R"]]. Ters sıralama elemelere yardımcı olur.


Nereden geliyorsun s? Ben repl.it üzerinde çalıştırıyorum ve bana bir olduğunu söylüyor ReferenceError: s is not defined.
HyperNeutrino

@AlexL. Hata! Golf kodunu bitirmemiş olan kodumun önceki sürümüne yanlışlıkla yapıştırdım. Şimdi düzeltilmelidir.
Neil

@JamesHolderness Cevabımı gönderdiğimden beri soru değişti, güncellemem gerekecekti.
Neil

@JamesHolderness Yep. Bunun için üzgünüm Neil. Sorunun daha önce netleştirmediğim bazı kısımlarını açıklığa kavuşturmam gerekiyordu.
HyperNeutrino

@JamesHolderness Anlıyorum ki, bu yüzden cevabımı mevcut gereksinimlere güncelleyene kadar sorunun önceki bir yinelemesini yanıtladığı için rakipsiz olarak işaretledim.
Neil

3

Python 2, 244241 bayt

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

Girdi dizeleri listesi olarak alır

Misal:

Giriş: ['| | | |', ' X | |', '| | x ', '| X |', ' x | |']

Çıktı: [[1, 2, 'L'], [2, 3, 'R'], [3, 4, 'L'], [1, 2, 'R']]

Düzenleme: Durum için düzeltildi:

Giriş: ['| | |', ' X |', ' X |', ' x |', '| X', ' X |', ' x |', ' x |', '| | |']

Çıktı: [[1, 2, 'L'], [2, 3, 'R'], [1, 2, 'R']]


@JamesHolderness Şimdi düzeltilmelidir.
TFeld

Bu şimdi düzgün çalışıyor gibi görünüyor!
HyperNeutrino

@JamesHolderness Evet, bu bir sorun gibi görünüyor. Lütfen bunu düzeltin, TFeld. Aksi takdirde, iyi bir girişim!
HyperNeutrino

@AlexL. Şimdi düzeltilmelidir
TFeld
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.