Labirent , 28 25 24 23 22 bayt
" >
?!?:|}\{@
@\?"":)!
Bu çok eğlenceliydi! :) Bu, şu ana kadar yazdığım en yoğun sıkıştırılmış Labirent programı. Neredeyse işe yarayan 20 ve 21 baytta pek çok sürümü vardı, bunun hala optimal olduğundan şüpheliyim ...
Bu, girdiyi pozitif tamsayıların bir listesi olarak alır (isteğe bağlı bir sınırlayıcıyla birlikte) ve sonucu satırdan ayrılmış tamsayılar olarak STDOUT'a yazdırır.
20/21 bayt için av: formun tüm programlarını kontrol ettim
" XX
?!?X}\{@
@\?XX)!
X
kaba kuvvet tarafından makul herhangi bir karakter nerede , ancak geçerli bir çözüm bulunamadı. Elbette bu, daha kısa bir çözümün olmadığı anlamına gelmez, ancak 20 baytlık programları yapısına uygun bir varsayım olmadan zorlamak mümkün değildir.
açıklama
(Açıklama biraz eski ama hala çözümün optimal olduğuna ikna olmadım, bu yüzden bunu güncellemeyi bekleyeceğim.)
Yani, normalde labirent programları labirent gibi görünmesi gerekiyordu. Talimat göstericisi bir koridordayken, o koridoru izleyecektir. IP herhangi bir kavşağa çarptığında, yön Labyrinth'in ana yığınının en üst değerine göre belirlenir (Labyrinth'in alt kısmında sonsuz miktarda sıfır bulunan iki yığına sahiptir). Bu normalde önemsiz olmayan herhangi bir döngünün oldukça pahalı olacağı anlamına gelir, çünkü her yerde duvar dışı hücreler varsa, her şey bir bağlantıdır ve çoğu durumda yığının üstü IP için doğru değere sahip olmaz yolu almak için onu almak istiyorum. Yani yaptığınız şey, döngülerinizi merkezde bir bütün olacak şekilde, her birinin yalnızca iyi tanımlanmış bir giriş ve çıkış noktası olacak şekilde büyütmesidir.
Fakat bu sefer çok şanslıydım ve her şey birbirine çok yakışıyordu, hepsini bir büyük kümeye ezebildim. :)
Kontrol akışı güneye doğru başlar _
. _
Ana istifi üzerine bir sıfır iter. Bu bir operasyon dışı gibi görünebilir, ancak bu 1
daha sonra ihtiyaç duyacağımız (örtük olmayan) yığın derinliğini arttırır .
?
STDIN'den bir tamsayı okur. Okunacak daha fazla tam sayı yoksa, bu sıfırı zorlar. Bu durumda IP Güney'e @
doğru ilerlemeye devam eder ve programı derhal sonlandırır (çünkü giriş listesi boş). Aksi takdirde, IP Doğu'ya döner.
Şimdi iki çıkış noktasıyla çok sıkı bir döngüye giriyoruz:
!?;
\?
;
!
tamsayıyı STDOUT'a geri yazdırarak istif üzerinde yalnızca sıfır bıraktı. IP Doğu'ya ilerlemeye devam ediyor ve bir ?
sonraki tamsayıyı okuyor. Eğer bu sıfır değilse, bir hakkı alırız ve Güney'e taşınırız. ?
başka bir tane okur (bir sonraki çift indeks). Yine, eğer bu sıfır değilse, bir hakkı alırız ve Batıya gideriz.
Sonra \
yığını değiştirmeden bir satır beslemesi yazdırır, bu yüzden bir diğer hakkı alırız; !
sonraki çift indeksli tamsayıyı yazdırır. Şimdi yığında en az bir (pozitif) tek indeksli tamsayı olduğundan, sağa dönmeye devam ediyoruz ve döngü tekrar ediyor.
Bunlardan ?
biri listenin sonuna geldiğinde, bir sıfıra basar ve karşılık gelen üzerine doğrudan ;
gider, ki bu sıfırı atar.
Listede sadece tek bir unsur olması durumunda, işimiz bitti (çünkü bunu hemen bastık), böylece IP tümüyle Doğu'ya ilerlemeye devam edecekti @
, programı tekrar sonlandırıyor (izini sürüyor) yolda linefeed).
Aksi takdirde, tek indeksli tamsayıları da yazdırmamız gerekir. Bu durumda, iki yol (ilk döngünün iki çıkış noktasından itibaren) ortada birleşerek "
her iki durumda da Doğu'ya döner.
_
içine bir sol alarak önlemek için sıfır iter @
ve ;
atar sıfır olduğunu. Şimdi yeni bir döngüye giriyoruz:
"}
""
IP, sol alt hücreye girerek, kuzeye hareket ederek döngünün etrafında saat yönünde hareket ediyor. }
Yardımcı yığınına doğru ana yığının üst kaydırır. Yığında hala bir element varken, IP işini yapmaya devam ediyor. Her şey yardımcı yığına kaydırıldıktan sonra (ve işlem sırasında tersine çevrilir), IP yerine son çevrime girerek Doğu'ya doğru hareket etmeye devam eder:
\{@
#!
\
tekrar satır yazdırır, {
bir öğeyi yardımcı yığından anaya geri taşır. Eğer bu hala listenin bir maddesiyse pozitif olur ve IP, maddenin basıldığı yer olan Güneye döner !
. Ardından #
yığın derinliğini iter (ve ilk nerede şimdi bu _
önemli olan bu, çünkü #
pozitif bir yığın derinliği sağlar), IP hala aracılığıyla, sağa döner böylece, \
ve {
tekrar.
Her şeyi yazdırdıktan sonra {
, yardımcı yığının altından bir sıfır çeker, IP Doğu'ya devam eder ve @
programı sonlandırır.