Kod Slidey Puzzle Kod!


12

En çok tanınan bulmaca sürgülü olup Onbeş . 4 x 4 ızgara, 15 kiremit ve bir boş ızgara alanı vardır. Fayanslar sadece boş alana hareket edebilir ve her zaman ızgara ile aynı hizada olmalıdır.

Genelleştirilmiş bir kayan bulmacayı, iki adet W genişliğinde H yüksek ızgarası ( W , H her iki pozitif tamsayı) olarak , ızgaraya tutturulmuş bazı aynı işaretlenmemiş karoları (0 ile G × H arasında) içeren, herhangi bir şekilde (üst üste binmeden), alanın geri kalanını dolduran boş ızgara boşlukları ile.

Örneğin, W ve H 3 ise ve bir kutucuk Tve boş bir alan Eolası birçok dış cephe kaplaması bulmaca düzenlemelerinden biridir.

TTT
TET
EET

Bu bulmacalar için 4 olası hareket vardır: her şeyi yukarı it, her şeyi aşağı it, her şeyi sola it veya her şeyi doğru it . Bir yöne 'itmek', tüm karoları başka bir karo veya ızgara sınırına çarpana kadar mümkün olduğunca bu yönde hareket ettirir. Bazen itmek ızgaranın düzenini değiştirmez,

Örnek ızgara doğru itilirse sonuç

TTT
ETT
EET

Sonuçta sola itildi

TTT
TTE
TEE

Sonuç aşağı itildi

EET
TET
TTT

(her ikisinin de en solda Ttaşındığına dikkat edin)

Yukarı itmek bu durumda ızgara düzenini değiştirmez.

Fayans ayırt edilemez olduğundan, bu bulmacalar 'çözüldü' devletleri yoktur. Ayrıca, bir bulmacanın bir itişme yapıldıktan sonra geri dönmesi imkansız bir düzende başlayabileceğini unutmayın (örn. 3'e 3 ızgaranın ortasında bir taş).

Meydan okuma

Yalnızca yazdırılabilir ASCII kullanarak , hem M karakter genişliğinde hem de N karakter yüksekliğinde iki dikdörtgen kod bloğu yazın ( M , N pozitif tamsayıları için ). Bir kod bloğu kayan bir bulmacanın döşemesini, diğer kod bloğu boş bir ızgara alanını temsil edecektir.

Bu iki kod bloğunu bir W by H ızgarasına yerleştirmek, bir metin dosyası olarak kaydedilebilen ve normal bir program olarak çalıştırılabilen, kodla temsil edilen kayan bir bulmaca oluşturacaktır. Çalıştırıldığında, bu tür programlar kullanıcıyı 1'den 4'e kadar bir sayı için stdin aracılığıyla istemelidir; 1 yukarı, 2 aşağı, 3 sol, 4 sağ içindir . Kullanıcı numaralarını yazıp isabet girdiğinde, program kaynak kod döşemelerini bu yönde nasıl iteceğini hesaplar ve yeni bulmaca düzenini bir dosyaya (yeni bir dosya veya aynı dosya) kaydeder, ardından sonlandırır.

Bu işlem, her itişten sonra oluşturulan yeni kayan bulmaca kod dosyası ile süresiz olarak tekrarlanabilir.

Misal

Döşeme kodu bloğumun aşağıdaki gibi olduğunu varsayalım

//   my
// tile

ve boş ızgara alan kod bloğum şöyle görünüyor

//empty
//space

( M = 7, N = 2, bu elbette gerçek kod değil)

Bu iki bloğun herhangi bir geçerli sürgülü bulmaca düzenlemesi, kullanıcının bir yönde kıpırdamasına izin vermek için çalıştırılabileceğim bir program oluşturmalıdır.

Örnek kılavuzun kod gösterimi:

//   my//   my//   my
// tile// tile// tile
//   my//empty//   my
// tile//space// tile
//empty//empty//   my
//space//space// tile

Bu yüzden bunu çalıştırıp 2'ye (aşağı doğru) basarsanız Enter bunu başka bir dosyaya (veya aynı dosyaya) yazar:

//empty//empty//   my
//space//space// tile
//   my//empty//   my
// tile//space// tile
//   my//   my//   my
// tile// tile// tile

Bu dosya daha sonra aynı şekilde çalıştırılabilir ve itilebilir.

notlar

  • W tarafından H kayan bulmacanın herhangi bir kod temsili çalıştırılabilir olmalı ve kendini doğru şekilde itebilmelidir. Bu, 1'den 1'e kadar bazı makul maksimumlara (2 16 x 2 16 veya daha fazla) tüm ızgara boyutlarını içerir .

  • Bir program olabilir , kendi kaynak kodunu okuyun. Ayrağa dayalı kısıtlamalar yoktur. Her türlü yorum da iyidir.

  • Kırılacak kiremit olmasa veya kiremit itilemese bile, program kıpırdatmak için bir yön sormalıdır. Bilgi istemi sadece bir sayı yazmak için bir yerdir, mesaj gerekmez.

  • Girişin her zaman geçerli olduğunu varsayabilirsiniz (1, 2, 3 veya 4).

  • Kod bloklarınızı boşluklarla doldurmak iyidir. Yalnızca yazdırılabilir ASCII olabileceğini unutmayın, bu sekme ve yeni satır (kod bloklarını oluşturmaya yardımcı olan yeni satırların yanı sıra) anlamına gelmez.

  • Diliniz stdin'i desteklemiyorsa, en yakın giriş yöntemini kullanın.

  • Kod-bulmaca dosyalarınızın sonunda bir satırsonu olmasını isteyebilirsiniz. (Veya orada olmamasını isteyin.)

  • Yeni dosyaları nasıl adlandırdığınız önemli değildir. f.txtya da sadece fiyi.

  • İki kod bloğu aynı olmayabilir.

puanlama

Amaç bunu en küçük kod boyutuyla yapmaktır (bu yüzden kod golfü olarak etiketlenmiştir). En küçük kod bloğu alanına ( M × N ) sahip gönderim kazanır. Tie-breaker en yüksek oyu alan cevaba gider.

İlgili: Hayat Oyununu kendisi üzerinde çalıştıran kod


Yani program sadece boş alanlar olduğunda ve döşeme blokları olmadığında çalışmalıdır (ya da tam tersi)?
grc

@grc Evet, ilk sorunuz için ve tamamen boş veya dolu olsa bile bir itme değeri istemesi gerektiğini unutmayın. Hayır, bloklar aynı olamaz. Sanırım onlar oldukça önemsiz bir cevap olduğunu iddia edebilir misiniz? Bundan bahsedeceğim.
Calvin'in Hobileri

Orijinal kaynak dosyanın adını belirtebilir miyim?
feersum

@feersum Her zaman olduğunu varsayabilir misin f.txt? Evet.
Calvin'in Hobileri

Kod blokları her zaman 1 satır olmayacak mı? Çok satırlı kod blokları benim için gerçekten karmaşık görünüyor ve 2D esolanguages ​​muhtemelen dosya yazma desteğine sahip değil.
Def

Yanıtlar:


5

TECO , 153

Boş blok:

0T@^Ux#EBx#27@:^Ux##MxA1^QUq^T%d/51%w"G153UsZ/QqUlQq/153Un|Qq%s/153UlZ/QqUn'Qd&1UhQl<.UpQn<Qh-\"F%c'TRQs:C>QpJQn<D-%c"L%c1-Qh\|Qh\'RQs:C>Qw"GC|153%pJ'>EX

Fayans bloğu:

1T@^Ux#EBx#27@:^Ux##MxA1^QUq^T%d/51%w"G153UsZ/QqUlQq/153Un|Qq%s/153UlZ/QqUn'Qd&1UhQl<.UpQn<Qh-\"F%c'TRQs:C>QpJQn<D-%c"L%c1-Qh\|Qh\'RQs:C>Qw"GC|153%pJ'>EX

Kendini yerinde değiştiren programın adlı bir dosyaya kaydedilmesi gerekir x. Komut ile çalıştırılabilir tecoc mung x.. Nokta önemlidir; onsuz, TECO adlı bir dosya bulmaya çalıştı x.tec. Sondaki yeni satır mevcut olmalıdır.

Yazdırılabilir ASCII kısıtlaması, dil yazdırılamayan birçok karakter kullandığından bunun için biraz acı vericiydi. Bunların çoğu bir düzeltme işareti ile başlayan iki baytlık bir diziyle değiştirilebilir, ancak "Escape" (ASCII 27) "kaçınılmaz" olan bir karakterdir, bu yüzden bunu elde etmek için ASCII değerini bir dizeye koymak zorunda kaldım ve yürütmek. Böylece 4 bayt EBx<Esc>patladı @^Ux#EBx#27@:^UX##Mx.

Bu, özellikle programı iki parçaya bölerek, dize olarak saklayarak ve yalnızca her ikisi de mevcutsa çalışarak büyük ölçüde azaltılabilir.

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.