Trafik kavşağı çözme


26

Görev

Trafik kavşak yapısını alan ve araçların geçeceği sırayı veren bir program veya işlev yazın.

Çıkış aşağıdaki biçimde en az dört satır içermelidir #. x->y\n, #nokta ve ardından bir sıra numarası sayıdır ., xve ykarakterlerdir ["N", "E", "S", "W"]. Karakterlerle ayrılmalıdırlar ->. Bir dizi dizisi döndürmezseniz, her satırın sisteminize \n(yeni bir satır karakteri) veya eşdeğeri ile bitmesi gerekir .

Giriş aşağıdaki formu almalıdır:

  • Bölüm 1: Her biri N, E, S, W (saat yönünde) sırayla kaynak yollar için hedef yolu olan dört karakter. İzin verilen karakterler N, S, W, Eveya . Alan, belirli bir yolda araç bulunmadığı anlamına gelir. Örneğin S WE, dize , N aracının Güney'e gitmek istediği anlamına gelir, alan E aracının olmadığı Wanlamına gelir, S'nin EBatıya gitmek istediği anlamına gelir, Batı'nın Doğu'ya gitmek istediği anlamına gelir.
  • Bölüm 2 - hangisinin acil durum aracının hangisi olduğu anlamına gelen bir boşluk veya tek harf.
  • Bölüm 3 - Hangi iki yolun önceliği olduğunu belirleyen iki karakter (örneğin NE, Kuzey ve Doğu'nun hem Güney hem de Batı'dan daha yüksek öncelikleri olduğu anlamına gelir). Sizin için daha kolaysa, daha düşük öncelikli yolları kullanabilirsiniz (bu durumda SW).

Bir çözülemeyen durumda sizin gibi, kullanıcıya açıktır tek satırlık dize dönmelerine izin verilmesi unsolvable, no solutionve benzeri. JavaScript kullanıcıları dahili undefinedsabit alabilir.

Bu bir kod golf, yani bayt cinsinden en kısa cevap kazanır.

Trafik kuralları

Lütfen bazı kuralların ülkenizdeki trafik kurallarına uymayabileceğini unutmayın. Bazıları mücadeleyi kolaylaştırmak için basitleştirildi. Bu soruyu gerçek hayattaki trafik sistemi için bir rehber olarak kullanmayın.

  1. Meydan okuma için yalnızca sağ taraftaki trafiği kullanmanıza izin verilir.
  2. Trafik kavşağı bir noktada toplanan tam dört yoldan oluşur. Onlar işaretlenmiştir N( "Kuzey" gibi), S, W, E. Bu harfler yukarıdaki çıktı örneğinin yerine xve yerine kullanılmalıdır y.

Kavşak

  1. Her yolda en fazla bir araç var. Her yolda bir taşıt olduğu garanti edilmez. Her araç dört yönden herhangi biriyle, yani; sola dönün, sağa dönün, düz gidin veya U dönüşü yapın .

S aracının muhtemel varış yerleri

  1. İki aracın yolları kesişmiyorsa (çarpışmazlar), aynı anda gidebilirler. İki araç varsa yollar çarpışmaz (liste tam olmayabilir, ancak bu yalnızca size bir ipucu vermek için kasıtlıdır):
    • zıt yönlerden gelir ve her ikisi de dümdüz gider veya en az biri sağa döner
    • zıt yönlerden gelip her ikisi de sola dönün,
    • zıt yönlerden gelir ve bunlardan biri herhangi bir yöne döner veya U dönüşü yapar, diğeri U dönüşünü yapar,
    • dik açılardan gelir, soldan biri sağa döner, diğeri U dönüşü yapmaz

      Aşağıdaki yolların çarpışmamasıyla ilgili bazı örnekler. Lütfen üçüncü çizimde, N'nin U dönüşü yapmasına rağmen herhangi bir N yolunun E yoluyla çarpışacağını unutmayın.

görüntü tanımını buraya girin görüntü tanımını buraya girin

görüntü tanımını buraya girin görüntü tanımını buraya girin

  1. İki yol çarpışırsa, diğer kuralları kullanmak gerekir. İki araç aynı öncelikli yoldaysa (aşağıya bakınız), araca şu şekilde bir hak verilir:
    • sağ taraftaki yoldan geliyorsa, ortogonal yönlerden geliyorlarsa
    • diğer sola dönerse sağa döner
    • diğeri U dönüşü yaparsa düz gider veya sağa döner.

      Aşağıdaki iki örnekte de E aracının, S aracına geçiş hakkı vardır.

görüntü tanımını buraya girin görüntü tanımını buraya girin

Aşağıdaki örnekte önce W, sonra N, sonra E ve son S gider.

görüntü tanımını buraya girin

Bu özel durum için programınızın çıktısı şöyle olmalıdır:

1. W->S
2. N->S
3. E->S
4. S->S
  1. Tüm sürücüler dönüş sinyallerini kullanır ve diğerlerinin nereye gitmek istediğini bilir (basitlik için sol ve U dönüşlerini ayırt etmenin mümkün olduğunu varsayıyoruz).

  2. Bazen yollara yukarıdaki kurallardan daha önemli olan öncelikli işaretler verilir. Önceliği yüksek olan bir yolun öncelikli bir işareti vardır ( öncelikli işaret resmi ). Öncelikli yol düz devam etmezse, ayrıca ek işaretler gibi, kullanılan bu bir . Daha düşük önceliğe sahip olan yollarda verim işareti veya dur işareti vardır (eşdeğerdir). Hiçbiri veya tam olarak iki farklı yol daha yüksek önceliğe sahip olmayacaktır. Programınızın kullanıcısı, hangi yolların daha yüksek (veya daha düşük) öncelikleri olduğunu girebilmelidir.

  3. Öncelikli yoldan gelen bir aracın sol tarafında olsa bile, düşük öncelikli yoldan gelen bir araca geçiş hakkı vardır.
  4. Aynı önceliğe sahip yollardan gelen iki aracın yolları çarpışırsa, sağ üst kurallar etkindir.

    Aşağıdaki örnekte S ve W yolları öncelik işaretlerine sahiptir, bu da N ve E üzerindeki araçların onlara yol göstermesi gerektiği anlamına gelir. S aracı, W aracına göre önceliğe sahiptir, çünkü sağ tarafındadır, önce gelir. Sonra W'ye gider, çünkü E'den daha yüksek önceliğe sahip bir yoldadır, N taşıtının E yönünden hakkı vardır, çünkü sağ tarafındadır. Sonuncusu E. olarak

görüntü tanımını buraya girin

Bu özel durum için programınızın çıktısı şöyle olmalıdır:

1. S->W
2. W->N
3. N->S
4. E->W
  1. Bir (ve daha fazla olmayan) aracın, hangi yönden geldiği veya hangi yönden geldiğine ve hangi işarete sahip olduğuna bakılmaksızın önceliği olan acil durum aracı olması olasıdır (her zaman önce gider). Program, kullanıcının hangi aracı acil durum aracı olduğunu girmesine izin vermelidir. Son örnekte N'nin acil bir araç olduğunu göz önünde bulundurarak, N önce N, sonra S, W ve son E olarak geçiyor.

N'de acil durum aracı olan bu özel durum için programınızın çıktısı şöyle olmalıdır:

1. N->S
2. S->W
3. W->N
4. E->W
  1. İki aracın aynı anda gitmesine izin verilirse (yolları çarpışmaz ve diğer araçlara yol açmak zorunda kalmazlar), programınız bunu bulmalı ve aynı sıra numarasına sahip olarak iade etmelidir.

    Aşağıdaki örnekte N ve E gibi E ve S veya W ve E yolları çarpışmaz. S'nin N'ye ve W'nin de S'ye yol vermesi gerektiği için, S E ile aynı anda gidemez. N ve E olabilir. İlk başta N ve E beraber gider, S ve W en sonuncusudur.

görüntü tanımını buraya girin

Programınızın doğru çıktısı:

1. N->W
1. E->E
2. S->W
3. W->N

Satırların sırasını seçmekte özgürsünüz 1( N->W / E->Eeşdeğerdir E->E / N->W)

  1. Bazen trafik, hiçbir aracın gitmesine izin vermeyen çözülemez bir duruma neden olabilir. Gerçek hayatta, sürücülerden birinin gönüllü olarak istifa etme hakkı istifa ettiği zaman çözülür. Burada, unsolvablesorunuzun ilk bölümünde belirtildiği gibi programınız çıktı vermelidir .

    Aşağıda çözülemez durumlara bir örnek verilmiştir. E, W'ye yol vermeli, W, S'ye yol vermeli ve S, E'ye yol vermelidir.

görüntü tanımını buraya girin


3
Tutarlı bir giriş formatının tanımlanması gerektiğini düşünüyorum. "Girdi, istediğiniz herhangi bir yapıya sahip olabilir" büyük kırmızı bir bayraktır. Girdi çözüm olabilir mi?
Calvin'in Hobileri

@ Calvin'sHobbies Ben soruyu güncelledik
Voitcus

1-2 vaka için örnek girdi / çıktı alma şansımız var mı?
Charlie Wynn

Öyleyse, soru (ve ben çözüme katılıyorum), söz konusu yolun / yolların doğru sürüş olduğunu varsaymaktadır ?
Tersosauros

Bu tam olarak Google Cars’ın çalışma şekli
Haziran’da

Yanıtlar:


8

Q, 645 Bayt

r:{(1_x),*x}                                                    /rot
R:{x 3,!3}                                                      /-rot
A:4 4#/:@[16#0;;:;]'[(&0100011001111100b;&0001111101100010b;&0010001111000100b;0);(&0 6 2;&0 1 7;&0 3 3;0)]
K:,/{,'/A x}'3 R\3 0 2 1                                        /Konflick matrix
G:3 R\|E:"NESW"                                                 /E:NESW  G:WSEN NWSE ENWS SENW    
m:{x-y*_x%y}                                                    /mod
t:{1=+/m'[_x%4;2]}                                              /orthogonal
w:{-1($x),". ",y[0],"->",y 1;}                               /write
b:{_x%4}                                                        /n-> base dir.
g:m[;4]                                                         /n-> turn
e:(!4)in                                                        /exists
d:{s:r a:e b x;R s&~a}                                       /right free
I:{(G[a]?x 1)+4*a:E?*x}                                         /"dd"->n
O:{E[a],G[a:b x]g x}                                            /n-> "dd"
P:{N::(y=4)&z~4 4;a@&0<a:(@[4#0;b x;:;4-g x])+(5*d x)+(24*e z)+99*e y}          /priority
H:{a::K ./:/:x,/:\:x; if[N&2 in *a;:,0N]; x@&{~|/x[;z]'y}[a]'[!:'u+1;u:!#x]}    /each set of concurrent movements
f:{i:I'(E,'a)@&~^a:4#x; i:i@p:>P[i;E?x 4;E?x 5 6]; {0<#x 1}{a:H x 1;$[a~,0N;-1"unsolvable";w[*x]'O'a];$[a~,0N;(0;());(1+*x;x[1]@&~x[1] in a)]}/(1;i);}

YORUMLAR

Kesinlikle, kısa (ya da basit) kod değil. Sıkıştırılabilir, ancak okuyucunun alıştırması olarak bırakılmıştır (Bu soruna çok fazla zaman ayırdım).

Çok satırlı yorumlu çözümü ekledim, ancak boyutlarını saymak için yeni satırları 1 Bayt olarak kabul et ve yorumları (satırdan sonuna kadar) at

Asıl zorluk, tüm kuralları tam olarak anlamaktır. Kod uzunluğunun erken optimizasyonu, karmaşık bir sorun için bir çözüm geliştirmekle bağdaşmaz. Aşağıdan yukarıya veya yukarıdan aşağıya yaklaşımlar, okunamayan kodlarla iyi başa çıkmaz.

Sonunda, 16 satır ve 16 sütundan oluşan bir karar tablosu (çatışma matrisi) geliştirdim (her bir dönüş için her bir yön için). Maddelerin değerleri 0 (uyumluluk), 1 (satır için tercih) veya 2 (sütun için tercih) şeklindedir. Tüm testleri yerine getiriyor, çünkü tüm olası durumların iyi karşılandığından emin değilim.

Kaynak dosya k uzantılı olmalıdır. Etkileşimli tercüman başlat (ticari olmayan kullanım için ücretsiz, kx.com) ve hızlıca değerlendir ('test' paragrafında gösterildiği gibi)

ÖLÇEK

q)f " WN    "
1. E->W
2. S->N

q)f " SW    "
1. E->S
2. S->W

q)f "SSSS   "
1. W->S
2. N->S
3. E->S
4. S->S

q)f "SWWN WS"
1. S->W
2. W->N
3. N->S
4. E->W

q)f "SWWNNWS"
1. N->S
2. S->W
3. W->N
4. E->W

q)f "WEWN   "
1. N->W
1. E->E
2. S->W
3. W->N

q)f " SWE   "
unsolvable

AÇIKLAMA

Temel yapı 'öncelik matrisidir'

   N       E       S       W   
   W S E N N W S E E N W S S E N W
NW 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1
 S 0 0 0 0 0 1 1 0 0 0 1 1 2 2 2 2
 E 0 0 0 0 0 1 1 1 2 2 0 0 0 2 2 0
 N 0 0 0 0 2 2 0 0 0 2 0 0 0 0 2 0
EN 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0
 W 2 2 2 2 0 0 0 0 0 1 1 0 0 0 1 1
 S 0 2 2 0 0 0 0 0 0 1 1 1 2 2 0 0
 E 0 0 2 0 0 0 0 0 2 2 0 0 0 2 0 0
SE 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0
 N 0 0 1 1 2 2 2 2 0 0 0 0 0 1 1 0
 W 2 2 0 0 0 2 2 0 0 0 0 0 0 1 1 1
 S 0 2 0 0 0 0 2 0 0 0 0 0 2 2 0 0
WS 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0
 E 0 1 1 0 0 0 1 1 2 2 2 2 0 0 0 0
 N 0 1 1 1 2 2 0 0 0 2 2 0 0 0 0 0
 W 2 2 0 0 0 2 0 0 0 0 2 0 0 0 0 0

Anlam (örnek olarak)

  • m[NW][SE] 0 değeri vardır (her iki hareket de uyumludur - eşzamanlı)
  • m[EW][SN] 1 değeri var (EW SN'ye göre önceliğe sahip) NOT.- diğer cümle faktörleri bu cümleyi değiştirebilir (acil durum araçları, öncelikli yol, ..)
  • m[NE][SE] 2 değeri var (SE NE'ye göre önceliğe sahip) NOT.- diğer cümle faktörleri bu cümleyi değiştirebilir (acil durum araçları, öncelikli yol, ..)

Matris dört alt matris (4x4) tipi kullanılarak oluşturulabilir

  NESW  A    B    C    D
N DACB  0100 0001 0010 0000
E BDAC  0110 2222 0011 0000
S CBDA  0111 0220 2200 0000
W ACBD  2200 0020 0200 0000

Matris, her harekete öncelik veren bir fonksiyonla tamamlanmaktadır. Bu fonksiyon, acil durum taşıtlarını, öncelikli yolları, ortogonal yönleri, dönüş türünü ve 'sağdan gelen' araçları dikkate alır

Hareketleri önceliğe göre sıralıyoruz ve matris değerlerini uyguluyoruz. Ortaya çıkan alt matris her hareketin çatışmalarını ve önceliğini içerir.

  • çözülemeyen olayları analiz ediyoruz (karşılıklı çatışmalar)
  • değilse, en öncelikli öğeyi ve onunla uyumlu olan tüm hareketleri seçeriz ve önceki uyumsuz hareketlerle uyumlu değiliz ve eşzamanlı olarak gitmesine izin verilen bir hareketler kümesi oluştururuz.
  • Bu hareketler kümesini yazın ve kalan adayları tekrarlayın
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.