Aynalar Odası


18

(Bu meydan okuma çok benzer, ancak şu anki meydan okuma ek komplikasyonlara sahiptir.)


Duvarların düz aynalarla kaplandığı 2 boyutlu bir oda düşünün.

Aniden, bir duvar parçasının eksik olduğu odaya bir ışık demeti çarpıyor! Işık demeti odanın etrafında dans eder, duvar aynalarıyla yansıtılır ve sonunda odayı tekrar terk eder.

Mantık

: 5 adet değişken verilmiştir W, bir H, X, Y ve Z, .
Şimdi, ne demek istiyorlar?

W, H odanın büyüklüğü (duvarlar dahil), W genişliği ve H yüksekliği.
X, Y, duvarın deliğe sahip olduğu koordinattır. Bunun her zaman bir duvar karosu üzerinde olduğunu varsayabilirsiniz. Koordinatlar, X ekseni sağa ve Y ekseni aşağıya bakacak şekilde 0 tabanlıdır.
Z, ışığın odaya düştüğü yönü temsil eden tek bir karakter ya \da /.

Oda aşağıdaki karakterlerden oluşmalıdır:

  • | yatay duvarlar için
  • - dikey duvarlar için
  • + köşeler için

Örnek: (W = 7, H = 4)

+-----+
|     |
|     |
+-----+

Artık bir odamız var, duvar karolarından birini yok edelim, böylece odaya bir ışık demeti düşer. Işığın kalaslar ile temsil diyagonal çizgiler vardır \ve /karakter.

X = 2, Y = 0'daki duvar karosunu bir \ışık demeti ile değiştirelim.

+-\---+
|     |
|     |
+-----+

Gelen ışık, bir ayna duvarına çarpana kadar odanın çaprazından geçer. Bir duvara çarpılırsa, yön duvarın ekseni boyunca ters çevrilir ve ışın ilerler.

+-\---+
|\ \/\|
| \/\/|
+-----+

Bu örnekte, ışık huzmesi, duvarın bir köşesinin vurulduğu bir noktaya ulaşır, bu da hüzmenin tamamen ters çevrildiğini ve geriye doğru gittiğini ve sonunda odadan ayrıldığını gösterir.

Senin görevin

Odayı ve ışık demetinin tüm yolunu, odadan tekrar ayrılana veya sonsuz bir döngüye kadar tekrarlayana kadar basan bir program yazın.

Giriş

Giriş herhangi bir makul formatta alınabilir, ancak 4 W, H, X, Y tamsayısını ve Z karakterini içermelidir [10, 8, 0, 3, \].

Şunu varsayabilirsiniz:

  • W, H> = 3
  • X, Y her zaman bir duvara yerleştirilir
  • Z sadece değerleri içeren mümkün olacak \ve /.

Çıktı

Bir dizeyi döndürüp döndürmeyeceğinize veya doğrudan çıktıya mı karar verebilirsiniz stdout.
Odanın duvarını ve ışık huzmesini içermelidir (yukarıdaki ASCII karakterleri ile tanımlanmıştır).

kurallar

  • Standart boşluklar yasaktır.
  • Bu , bu nedenle bayt cinsinden en kısa kod herhangi bir dilde kazanır.
  • Bu zorluğun yayınlanmasından önce oluşturulan tüm kodlama dillerine izin verilir.

Örnekler

Giriş: [5, 4, 2, 0, /]

+-/-+
|/ /|
|\/ |
+---+

Giriş: [20, 3, 0, 1, \]

+------------------+
\/\/\/\/\/\/\/\/\/\|
+------------------+

Giriş: [10, 8, 0, 3, \] (Odadan tekrar ayrılmayacak sonsuz bir döngü örneği.)

+--------+
|/\/\/\/\|
|\/\/\/\/|
\/\/\/\/\|
|\/\/\/\/|
|/\/\/\/\|
|\/\/\/\/|
+--------+

İyi şanslar!

Yanıtlar:


5

Kömür , 55 bayt

BNNJNNPψ↷⎇⁼δ/⎇∧⁻⁻θ¹ζIε⁷I3⎇∧IζIε⁵I1W¬℅KK«¹F³¿∧κ℅KK«↷κ¶↷κ

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Düzenleme: Neden bilmiyorum ama bu kod şu anda çalışmıyor. İşte bunun yerine düzeltilmiş bir sürüm. Orijinal kodun açıklaması:

BNN

Dış kutuyu çizin.

JNNPψ

İmleci giriş noktasına getirin ve bu noktada kutuda bir delik açın, böylece bu arka plan olur.

↷⎇⁼δ/⎇∧⁻⁻θ¹ζIε⁷I3⎇∧IζIε⁵I1P

İlk çizgi parçasını yazdırmak için uygun yöne çevirin.

W¬℅KK«¹

İmleç bir deliğin üzerindeyken, sonraki çizgi parçasını çizin.

F³¿∧κ℅KK«↷κ¶↷κ

Bir sonraki çizgi parçasının çizileceği bir delik olup olmadığına bakın. Bu, aynı kodu üç kez tekrarlayarak çalışır. İlk seferinde hiçbir şey olmuyor. İkinci kez, imleç bir deliğin üzerinde değilse, sağa 45 ° döner, sonra bir adım sağa döner, sonra sağa 45 ° döner. Bunun bir eksene yansıtma etkisi vardır. Üçüncü kez, imleç hala bir deliğin üzerinde değilse, 90 ° sağa döner, sonra bir adım sağa döner, sonra 90 ° sağa döner. Bunun yansımayı diğer eksene değiştirme etkisi vardır. Hala bir delik yoksa, bir köşe veya sonsuz döngüye ulaşılmıştır, bu nedenle dış döngü durur.


1
İnsanların kodlarınızı test etmeleri için, ayrıntılı sürümün ayrı olarak çevrimiçi golf koduna bir bağlantıya sahip olmasına yardımcı olacaktır.
trichoplax


@trichoplax kolaydı
MD XF

@trichoplax TIO bağlantısı çıktıdaki golf kodunu gösteriyor, bu da kopyalayıp yapıştırdığım yer ...
Neil

1
@trichoplax Kullandığınızda -v -sl, aslında yazdırılan şekliyle çevrilmiş özlü kod çalıştırılır. Bu elbette doğru özlü kod üreten deverbosifier'a bağlıdır, çünkü değilse, orijinal ayrıntılı kod teknik olarak doğru olsa bile üretilen kod başarısız olur.
Neil
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.