TwoMega'yı yorumla


9

Bu meydan okuma olarak, sizin için bir tercüman yazacak 2 Q (olarak transkripsiyonu TwoMega ), gevşek dayalı bir dil brainfuck sonsuz boyutlu depolama alanına sahip.

Dil

2 Ω halde üç parça içerir:

  • Bant bit sonsuz listesi, tüm bu 0 durumuna getirilir bir en soldaki elemanı, ancak en sağdaki elemanı vardır.

  • Hafıza Pointer bant bir elemanın bir endeksidir negatif olmayan bir tam sayıdır. Daha yüksek bir bellek işaretçisi sağda bir bant hücresini ifade eder; 0'lık bir bellek işaretçisi en soldaki öğeye karşılık gelir. Bellek işaretçisi 0 olarak başlatılır.

  • Hypercube bir kavramsal olarak, Hypercube genişliği sadece 2 hücreleri, her boyutta bağlı, ancak boyutların sonsuz sayısı anlamına 0 olarak başlatıldı biraz içeren her hangi hücrelerin boyutlu bir "kutu", hücreleri sayılamaz .

Bir indeks hiperküp içine (bit sınırlı bir listesi sonlu boyutlu bir hiperküp atıfta için kullanılabilir, aynı şekilde) hiperküp bir hücreye karşılık gelir bit sonsuz listesidir. Bant sonsuz bir bit listesi olduğundan, tüm bant her zaman Hypercube öğesinin bir öğesini ifade eder; bu öğeye yönlendirme denir .

2 Ω 7 farklı karakterlere anlam verir:

  • < bellek işaretçisini 1 oranında azaltır. 0'ın altına düşürmek tanımsız bir davranıştır, bu yüzden işlemeniz gerekmez.
  • > bellek işaretçisini 1 artırır.
  • ! referansta biraz çevirir.
  • . başvurudaki biti verir.
  • ^kasetteki bellek işaretçisi tarafından gösterilen hücredeki biti, başvurudaki bitin tersi ile değiştirir.
  • [x]başvurudaki xbit 1 olduğu sürece kodu çalıştırır .

Meydan okuma

Göreviniz, dizeyi girdi olarak alan ve bu girdiyi 2 Ω program olarak yürüten bir program yazmaktır .

Bu Böylece, en kısa geçerli yanıt (bayt olarak ölçülür) kazanır.

notlar

  • Programın yalnızca karakterlerden oluşacağını <>!.^[]ve []düzgün şekilde yuvalanacağını varsayabilirsiniz .
  • Yorumcunuz yalnızca sistemdeki kullanılabilir bellekle sınırlı olmalıdır. Örnek programları makul bir sürede çalıştırabilmelidir.

Örnek Programlar

Baskı 1:

!.

Baskı 010:

.!.!.

Sonsuza kadar 0 yazdır:

![!.!]

Sonsuza kadar 0 veya !önceden eklenmişse sonsuza kadar 1 yazdırın :

[.]![!.!]

2
Küçük bir not: 1banttaki s sayısı her zaman sonlu olduğundan, depolama hücrelerinin sayısı aslında sayılamaz . Aslında, erişilebilir Hypercube temelde sonsuz 1D dizi olduğunu gösterir doğal sayılar ve bant durumları (bir geriye doğru ikili sayı olarak bant içeriği yorumlama) arasında oldukça basit bir bijection, orada bit saygısız bir tam sayı gösterici değerinde , beyin sıkışmasında olduğu gibi içeri / azalan yerine.
Lynn

Ayrıca, yeniden: bir catprogram yazma davetiniz : girdi alma talimatı yok gibi görünüyor.
Lynn

2
Ben komut kümesi daha fazla kullanarak örnek programlar olması gerektiğini düşünüyorum.İki basit olanlar: .- tek bir sıfır yazdırır ve sonra var; !^!.- tek bir baskı alır ve çıkar. Daha fazlası olsa iyi olurdu. Şu anda, onları doğrulamak için gönderimleri anlamalıdır (ve dolayısıyla onları oy verin!)
Jonathan Allan

@Lynn Girdi, hücre üzerinde 1 veya 0 olması [0,0,0,0,0,0,0...](yani !, programın başında a'nın varlığı ) ile verilir.
Esolanging Fruit

Sonra [.]![!.!]sonsuza kadar o hücrenin değerini yazdırmak için
Leo

Yanıtlar:


2

Python 2 , 167 bayt

t=h=I=0
m=1
E=''
for c in input():i='[<>!.^]'.find(c);E+=' '*I+'while+2**t&h: m/=2 m*=2 h^=2**t print+(2**t&h>0) t=t&~m|m*(2**t&h<1) #'.split()[i]+'\n';I-=~-i/5
exec E

Çevrimiçi deneyin!

t kasettir. t = 6 kasetin [0 1 1 0 0 0…] olduğu anlamına gelir

m , bellek işaretçisinin gücüne 2'dir. Yani m = 8 teyp bit 3'ü işaret ettiğimiz anlamına gelir.

h hiper küptür. h = 80 (bit 4 ve 6 seti), [0 0 1 0…] ve [0 1 1 0…] 'deki bitlerin ayarlandığı anlamına gelir.

Referanstaki biti okumak için 2 t & h değerini kontrol ediyoruz . Çevirmek için h ^ = 2 t yapıyoruz .

Talimatları Python koduna çeviriyoruz ve sonucu yürütüyoruz. Ben ise döngü girinti düzeyini saklar.


Ya program veya ikinci test durumu yanlış
Wastl

@wastl İkinci test durumu yanlıştı. ;)
DLosc


2

JavaScript (Node.js) , 148 bayt

x=>eval(x.replace(e=/./g,c=>({'<':'u/=2','>':'u*=2','!':'e[v]^=1','.':'alert(+!!e[v])','^':'v=(v|u)^u*e[v]','[':'while(e[v]){'}[c]||'}')+';',v=u=1))

Çevrimiçi deneyin!

Tamamlandı

BoolFuck TwoMega
< >^>^>[!]^<<<<[!]^>>[!]!^>[!]!^>[!]!^<<<<(>^>^>1<<<<1>>0>0>0<<<<)
> ^<^<[!]^>>>>[!]^<<[!]!^<[!]!^<[!]!^>>>(^<^<1>>>>1<<0<0<0>>>)

Birkaç yerde sağa init init ve 1 ( >>>>>>>>^>^<) olarak adresin geçerli ve sağ bir bit init gerekir

Çevrimiçi deneyin!

Yeri nBoolFuck olduğu gibi yazılır(0, 0, ..., 0(n*0), [1], 1, 0, 0, ...) .

İçin >, öyle n=>n+1

     0 0 0 0 0[1]1 0 0 0 0
^    0 0 0 0 0[x]1 0 0 0 0
<    0 0 0 0[0]x 1 0 0 0 0
^    0 0 0 0[y]x 1 0 0 0 0, yx != 01
<    0 0 0[0]y x 1 0 0 0 0
[!]^ 0 0 0[1]y x 1 0 0 0 0, (0yx10) = 0
>>>> 0 0 0 1 y x 1[0]0 0 0
[!]^ 0 0 0 1 y x 1[1]0 0 0, (1yx10) = 0
<<   0 0 0 1 y[x]1 1 0 0 0
[!]! 0 0 0 1 y[x]1 1 0 0 0, (1yx11) = 1
^    0 0 0 1 y[0]1 1 0 0 0
<    0 0 0 1[y]0 1 1 0 0 0
[!]! 0 0 0 1[y]0 1 1 0 0 0, (1y011) = 1
^    0 0 0 1[0]0 1 1 0 0 0
<    0 0 0[1]0 0 1 1 0 0 0
[!]! 0 0 0[1]0 0 1 1 0 0 0, (10011) = 1
^    0 0 0[0]0 0 1 1 0 0 0
>>>  0 0 0 0 0 0[1]1 0 0 0

Nasıl <çalıştığı ile aynı


Bu çevirinin geçerli olduğundan emin misiniz? boolfuck'ta !>.yazdırır 1, ancak TwoMega'da !>^.1 baskıları çevirir ( >bandı etkilemez; ^başvuru 1 olduğu için bandı etkilemez)
18'de Esolanging Fruit

@EsolangingFruit +>;yapmak [1]00... 1[0]0...(çıkış 0), !>^.yapmak (0,0,...)=1, ptr=([0],0,...) (0,0,...)=1, ptr=(0,[0],...) (0,0,...)=1, ptr=(0,[1],...)(çıkış 0), sorun nedir?
l4m2

@EsolangingFruit for !>., sadece boolfuck için >geçerli bir komuttur ...
ASCII-sadece

1
@ l4m2 TwoMega'da, !teyp hücresini değil başvuruyu tersine çevirir.
Esolanging Fruit

@EsolangingFruit yani sorun nedir?
l4m2

1

Brain-Flak Klasik , 816 bayt

<>(((<(())>)))<>{(([][][])(((({}){}[])({}))({})[]([][](({})(({}())(({}){}{}({}(<()>))<{<>({}<>)}{}>))))))(([]{()(<{}>)}{}){<((<{}>))<>(()(){[](<{}>)}{}<{({}[]<({}<>)<>>)}{}{}>)<>({()<({}<>)<>>}<<>{<>(({}){}<>({}<>)[])<>}{}<>({()<({}[]<<>({}<>)>)>}{})<>(({})<<>{({}[]<({}<>)<>>)}({}<>)<>{({}<>)<>}>)<>>)<>({}<>)<>>}{}([]{()(<{}>)}{}){{}<>({})(<>)}{}([]{()(<{}>)}{}){(<{}<>({}<{((<({}[])>))}{}{((<(())>))}{}>)<>>)}{}([]{()(<{}>)}{}){(<{}<>({}<({}())>)<>>)}{}([]{()(<{}>)}{}){(<{}<>[({})]<>>)}{}([]{()(<{}>)}{})<{((<{}>))<>{}({}<{<>(({}){}<>({}<>)[])<>}{}<>({()<({}[]<<>({}<>)>)>}{})<>(((){[](<{}>)}{})<<>{({}[]<({}<>)<>>)}{}(<>)<>{({}<>)<>}>)<>>)<>({}<>)<>}{}(<>)<>{({}<>)<>}{}>()){((({}[]<>){(<{}({}<>)>)}{}())<{({}<({}<>)<>((((((([][][]){}){}){}()){}){}({})())[][])>{[](<{}>)}{}{()(<{}>)}{})}{}({}<>)>[]){{}(<>)}}{}}

Çevrimiçi deneyin!

Bu kod sadece Turing-tamamlandığına dair bir kanıt yazmak için bir yer olurdu yazılmıştır.

Turing-tamlık kanıtı

Boolfuck'tan TwoMega'ya bir azalma gösteriyoruz:

Boolfuck   TwoMega
>          >>
<          <<
.          !^!.!^!
[          !^![!^!
]          !^!]!^!
+          !^[!]^[>!^<[!]!^>[!]!^<]

Bu çeviri Boolfuck durumunu TwoMega'daki çift sayılı bant hücrelerinde saklar. Çevrilen tüm komutlar aşağıdaki değişmezleri koruyacaktır:

  • Bellek işaretçisi çift sayılı bir hücrede.
  • Tüm tek sayılı bant hücreleri sıfırdır.
  • Tüm tek sayılı hücrelerin sıfır olduğu olası herhangi bir bant için hiper küp üzerindeki karşılık gelen değer sıfırdır.

Snippet sabit !^!kalacak ve ile[0]00[0][1]1 (dikkat bellek işaretçisi taşımadan hiperküp ulaşılabilir çizgi ile sınırlıdır) elde edilmektedir. Bu nedenle, geçerli bant değerini geçici olarak önemseyen Boolfuck komutlarının başvurusuna koymak için kullanılır.

TwoMega'ya ,beklenen anlambilim ile bir giriş komutu verilirse , Boolfuck komutu ,tercüme edilir >^<,!^>[!]!^<. Yana ,Boolfuck Turing-tam olduğunu kanıtlamak için gerekli değildir, bir giriş komutu eksikliği bu ispatı etkilemez.


Esas olarak bilgiyi küpün kendisi yerine hiperküpteki pozisyonda saklar mı?
l4m2

@ l4m2 BoolFuck'tan indirgem, küpün içinde herhangi bir veri depolamıyor. Hiperküp üzerinde yaptığım 1'ler sadece teyp hücrelerini 0'a ayarlamak için var.
Nitrodon

0

Piton 3 , 297 284 274 bayt

Ovs ve Jonathan Allan sayesinde -10 bayt

C=input()
h={}
t=set()
def f(C,p):
 c=C[0];r=hash(frozenset(t));v=h.get(r,0)
 p={"<":p-1,">":p+1}.get(c,p)
 if'"'>c:h[r]=not v
 if"."==c:print(int(v))
 if"]"<c:t.discard(p)if v else t.add(p)
 if"["==c:
  while f(C[1:],p):1
 else:return c=="]"and v or C and f(C[1:],p)
f(C,0)

Çevrimiçi deneyin!


t.discard(p)->t-={p}
shooqie

@shooqie Bu sürece çalışmaz tise global.
fergusq

Ben eminim olmama rağmen ilan etmeleri halinde @fergusq çalıştığını folarakf(C,p,t=set())
shooqie

0

Pip , 75 71 bayt

lPB0aR:^"!><[].^_""!:_
--viPU0
++v
W_{
}
O_
i@v:!_LFBilPB0
l@FBi"^n;Vau

Çevrimiçi deneyin!

2 Ω dilini çevirir eşdeğer Pip kodu ve değerlendirir bunun içine kodu.

Biz kullanmak i, bant gösteren vbant işaretçi * için, ve lhiperküp için. İlk ikisi yararlı değerlere önceden başlatılır; lbaşlar olarak [], hangi biz itmek bir 0( lPU0) indeksleme boş listem sorunları önlemek için.

* Aslında, bant işaretçisinin bitsel olarak olumsuzlanması, çünkü ondalık sayıya daha kolay dönüşüm için bandı geriye doğru saklıyoruz.

Kodun geri kalanı:

aR:...;     Do a bunch of replacements in a, translating it into Pip code
       Va   Evaluate a
         u  Suppress output of the final expression that was evaluated

Çeviri tablosu:

!  !:_
>  --viPU0
<  ++v
[  W_{
]  }
.  O_
^  i@v:!_LFBilPB0
_  l@FBi

l@FBildizindeki hypercube yönlendiren öğesidir ( iikili dosyadan dönüştür ). Sık sık görünür, bu yüzden onu ararız _ve _sonunda gerçek kodla değiştiririz .

  • !:_ referansı mantıklı bir şekilde yerinde reddeder.

  • --viPU0azalmalar v(şerit işaretçisini sağa hareket ettirmek); daha sonra şerit işaretçisinin sınırlarda kaldığından emin olmak için 0sol tarafına bir tane daha iter i.

  • ++vartışlar v(OP başına sınır kontrolüne gerek yoktur).

  • W_{başvuru doğruluktayken (yani sıfır olmayan, yani 1) bir döngü çalıştırır .

  • } döngüyü kapatır.

  • O_ yeni satır olmadan başvuru çıktısı verir.

Son olarak, için ^:

i@v:            Set the current tape cell to
    !_          The logical negation of the referent
                Now, make sure the list representing the hypercube is long enough:
      LFBi      Loop frombinary(i) times:
          lPB0  Push another 0 to the end of l
                This ensures that FBi will always be a valid index into l
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.