(Yerçekimi tabanlı) bir bilardo topu tipi bilgisayar benzetimi


12

Makine

Bilardo topu tipi bir makine sadece \ _ /büyük ve küçük harfler, boşluklar ve sayı ile birlikte sembollerden oluşur 1.

\ve /rampalardır. Yukarıdan gelen top, sırasıyla sağ veya sol tarafa saptırılacaktır. Her iki rampa için, eğer bir top her iki taraftan gelirse, aşağı doğru saptırılacaktır.

_bir mantık öğesidir. Gerçekleştirdiği mantık bilgisayarın bilardo benzeri olmayan kısmıdır. İlk olarak, soldan veya sağdan gelen bir top aynı yönde devam eder. Yukarıdan gelen bir top durdurulacaktır. Daha sonra, yürütme bittikten sonra (bkz.Aşağıdaki Makineyi Çalıştırma), üstünden geçen / inen top sayısı eşit çift sayı ise, elemanın altından tek bir top serbest bırakılır.

Bir boşluk hiçbir şey yapmaz. Herhangi bir yönden gelen toplar yerçekimi nedeniyle düz düşer.

Küçük harfler girişlerdir. Tüm girişler tek bir 1 veya 0 olacaktır.

Büyük harfler çıktılardır. Çıkarılan sayı, yerini vuran bilardo topları sayısı olacaktır.

Sayı 1, bu yerde ekstra bir bilardo topu serbest bırakır. Mantıksal bir 1'i temsil eder.

Bunun dışındaki tüm karakterler \_/, herhangi bir yönden gelen herhangi bir topun yerçekimi nedeniyle düz düşmesine neden olur.

Toplar asla birleşmez, ayrılmaz veya çarpışmaz. Yalnızca a _, veya a girişinden serbest bırakıldığında oluşturulur 1. Sadece düz bir yere düştüklerinde yok edilirler _.

Örnek makine

1 a
\_/ b
  \_/
 \/
 /\ /
_  _
A  B

Bir makinede hiçbir zaman boş satır olmayacaktır, ancak _' satırlar boş bir satır olduğunu gösterebilir.

Makineyi Çalıştırma

Bir makine katmanlar veya satırlar halinde çalıştırılır. Üst katmandaki tüm bilardo topu hareketi, ikinci katmanda herhangi bir şey olmadan önce gerçekleştirilir.

Makine

ab
\_A
 C

aşağıdaki gibi çalıştırılır:

İlk olarak, aformdaki girdiyi ister a:. Kullanıcı daha sonra 1 veya 0 (ardından enter) girecektir. Bunu giriş için tekrarlar b. Bu ilk katmanın sonudur. Kullanıcının her iki giriş için de 1 girdiğini varsayacağım.

Daha sonra a, boyunca \, boyunca _, içine Adoğru giden ve altındaki noktaya düşen ilk topun (itibaren ) yolunu izler A. Daha sonra b, doğrudan aşağıya inen _ve sona eren ikinci topun (itibaren ) yolunu izler . Bu ikinci katmanın sonu.

Şimdi, üçüncü katmandan önce, _üzerinde iki top geçtiği için, bir topu serbest bırakır. Çıktının Aüzerinde bir top çapraz vardı, bu yüzden çıktı A:1.

Üçüncü katman için, ilk topun (itibaren _) yolunu izler , ki bu da gider Cve düz düşer. (İçinden geçen A) ikinci top da aşağıya düşer.

Şimdi, dördüncü katmandan önce, çıktının Cüzerinde bir top hareketi olduğu için çıktılar C:1.

Dördüncü katman boş olduğundan program sonlandırılır.

Toplam sonuç şöyle görünmelidir

a:1     (the user entered the one)
b:1     (same here)
A:1
C:1

Amaç

Amacınız STDIN'den bir makine almak ve STDOUT'a gereken girdi ve baskı çıktılarını alarak onu simüle etmektir. Programınıza girişin ilk kısmı çalıştırılacak makineden sonra boş bir satırdan oluşur. Karşılaşılan tüm giriş harfleri, programınızın giriş adı ve ardından iki nokta üst üste şeklinde girdi sormasını sağlar. Herhangi bir çıktı, çıktı adı şeklinde ve ardından iki nokta üst üste ve ardından o noktadan geçen top sayısı şeklinde gösterilmelidir.

Bu golf.

Örnekler

Bir tel geçişi

ab
\/
AB

Bir XOR geçidi

ab1
\_/
 C

Tam bir toplayıcı

1 a
\_/ b
  \_/
 \/
 /\
_ __/
 \_/ 
  \/c
 \\_/ 
  _S1
\  \/
 __/
  /
 _
\__
 C

İlk örneğinizde, ilk top neden A'nın altına düşüyor? Topların olmayan bir karaktere geçtiklerinde durdukları yazılı olmayan bir kural var mı \_/?
Peter Taylor

@PeterTaylor Evet, topun etkilenmesi söz konusu olduğunda tüm harflerin boş bir alan olarak davrandığını eklemeliyim ve yerçekimi topu aşağı çekiyor.
PhiNotPi

1
Şans eseri, 'bilardo' değil, 'flipper' mı demek istiyorsun?
kullanıcı bilinmiyor

DIS BİR ESOLANG YAP
Matthew Roh

1
@AlexL. Ayrıca ilgili: Marbelous
PhiNotPi

Yanıtlar:


3

JavaScript ( 392 423)

Makinenin adlı bir değişkene ayarlandığını varsayar mve son çıktıyı uyarır.

l=m.split(q='\n');o='';for(r=Array(z=l[i=0].length);i<l.length;i++){L=l[i];n=Array(z);for(c=0;c<z;n[c]=N,r[c++]=R){C=L[c];N=~~n[c];R=~~r[c];if(C>'`'){N+=x=~~prompt(C);R+=x;o+=C+': '+x+q}else if(C=='\\'||C=='/'){for(d=c+(g=C=='/'?-1:1);L[d]=='_';r[d]+=R,d+=g);if(L[d]>'@'&L[d]<'[')r[d]+=r[c];n[d]=~~n[d]+R}else if(C<'2')N+=R+=~~C;else if(C!='_')o+=C+': '+R+q}for(c=0;c<z;c++)if(L[c]=='_')n[c]+=(r[c]%2)?0:r[c]>0;r=n}alert(o)

Örnek kaynak (toplayıcı makinesini çalıştırır, daha az golf sahası kaynakları için geçmişe bakın): http://jsfiddle.net/96yLj/12/

Geleceğe ait:

- rmevcut sıradaki topları # izler, nsonraki sıradaki topları # izler.
- Algoritma: her satırı karakter karakter işlemek, ancak _son işlem .
- Algoritma: \-> olmayana kadar takip edin _ve artırın . Aynı için ama ters yönde. Sonunda yerçekimi için topların aşağı çekilmesi artar . yönü tutar. - Düzenleme 1'de belirtilen hata içindir . Biz sadece diyemeyiz sebebi çünkü işlerken topları-sayımı katına çıkacak - tutacağa hem vaka ve , dönüşler 1 ile 0 içine sırasıyla.r_/ng
if(L[d]>'@'&L[d]<'[')r[d]+=r[c];r[d]+=r[c];\_//
else if(C<'2')'1'' '~~C


Düzenleme 1: Top koşarken hatayı düzeltin , örnek kod için _dahil değilA


İlginç olmayan kısıtlamalar olduğu için STDIN ve STDOUT gereksinimlerini her zaman göz ardı ettiğimi unutmayın. JavaScript :-) için oldukça standart promptgiriş ve alertçıkış için kullanıyorum :-)
mellamokb
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.