2 giriş ve 1 çıkış ile tüm 16 mantık kapısını golf yapın!


63

Örneğin, geçit A and B2 giriş ve 1 çıkış ile bir mantık geçididir.

Tam olarak 16 tanesi var, çünkü:

  • Her bir mantık geçidi, bize 4 olası girdi sağlayan, truthy veya falsey olabilen iki girdi alır.
  • 4 olası girişten, her biri bir gerçek ve falsey çıktısına sahip olabilir.
  • bu nedenle, 16 olan 2 ^ 4 olası mantık geçidi vardır.

Göreviniz, hepsini ayrı ayrı uygulayan 16 program / fonksiyon yazmaktır.

İşlevleriniz / programlarınız bağımsız olmalıdır .

Onlar uygulayabilir, yani onlar çıktı truthy / Falsey değerler sürece geçerlidir A or Bolarak Python lambda a,b:a+bbile 2için üretilir A=Trueve B=True.

Puan, her fonksiyon / program için kullanılan toplam bayttır.

Mantık kapılarının listesi

  1. 0,0,0,0 ( false)
  2. 0,0,0,1 ( and)
  3. 0,0,1,0 ( A and not B)
  4. 0,0,1,1 ( A)
  5. 0,1,0,0 ( not A and B)
  6. 0,1,0,1 ( B)
  7. 0,1,1,0 ( xor)
  8. 0,1,1,1 ( or)
  9. 1,0,0,0 ( nor)
  10. 1,0,0,1 ( xnor)
  11. 1,0,1,0 ( not B)
  12. 1,0,1,1 ( B implies A)
  13. 1,1,0,0 ( not A)
  14. 1,1,0,1 ( A implies B)
  15. 1,1,1,0 ( nand)
  16. 1,1,1,1 ( true)

Birinci sayı için çıktı A=false, B=false, ikinci sayı için çıktı A=false, B=true, üçüncü sayı için çıktı A=true, B=false, dördüncü sayı için çıktıdır A=true, B=true.

Liderler Sıralaması


2
İşlevleriniz / programlarınız kodu paylaşabilir. Ne anlama geliyor? Ayrıca, programlar farklı dillerde olabilir mi?
Lynn

2
Açıklamayı kafa karıştırıcı buluyorum: "her birinin alabileceği 4 girdiden biri ve gerçeğin ve sahtekarlığın çıktısı". Bu, 8 (4 * 2) durum anlamına gelmez mi?
DavidC,

4
Kaçırdığınız isimler, AND-NOT geçitleridir (A VE DEĞİL B ve B VE DEĞİL A).
Mego

14
Böylece tekrar oldu. Çoğunlukla basit ve doğru 18 cevap var, o zaman hiçbir yerde soru "ne sorduğunuzu belli etmedi" oldu. Ben bir meydan okumayı sevmiyorum, devam et, bir başkasını al, kapatmayın!
edc65

4
@dorukayhan Bkz: boş hakikat
Sp3000

Yanıtlar:


110

Domino , 122.000 bayt veya 72 fayans

Bayt sayısı boyutudur kaydedilen dosyanın olduğunu 0.122 MB.

Domino hesaplama ilham kaynağıydı. Bunların hepsini Masa Üstü Simülatörü adı verilen sanal gerçeklik Steam oyunuyla simetriye (ve ötesi!) Kadar test ettim .

ayrıntılar

  • I / O
    • Başlat - Bu netlik için dahil edilmiştir (toplam sayılmaz) ve işlevi 'çağıran' veya 'yürüten' şeydir. Giriş verildikten sonra 'basılmalıdır' [Sarı] .
    • Giriş A - Bu, netlik için dahil edilmiştir (toplam olarak sayılmamıştır) ve 1aksi belirtilmedikçe "belirtilir" ve " Yeşil " olarak gösterilir .
    • Giriş B - Bu, netlik için dahil edilmiştir (toplamda sayılmaz) ve 1aksi belirtilmedikçe ' mavi ' basılır ' .
    • Çıktı - Bu toplam olarak sayılır. [Black] mantık kapısının sonucunu ilan eden domino .
  • D / Y
    • Düşmüş bir çıktı domino sonucu Trueveya1
    • Duran bir domino domeni sonucu Falseveya0
  • basma
    • Girdiyi vermek veya zinciri başlatmak için metal mermeri doğrayın
    • Kaldırma gücünü 100%
    • Mermeri istenen domino üzerinde kaldırın
    • Mermer bırak

görüntü tanımını buraya girin

kapıları

  • yanlış, 1
    • görüntü tanımını buraya girin
  • ve, 6 4
    • görüntü tanımını buraya girin
  • A ve B değil, 4 3
    • görüntü tanımını buraya girin
  • Bir, 1
    • görüntü tanımını buraya girin
  • A ve B değil, 4 3
    • görüntü tanımını buraya girin
  • B, 1
    • görüntü tanımını buraya girin
  • xor, 15 11
    • görüntü tanımını buraya girin
  • veya, 1
    • görüntü tanımını buraya girin
  • ya da 3 2
    • görüntü tanımını buraya girin
  • xnor, 17 13
    • görüntü tanımını buraya girin
  • B değil, 2
    • görüntü tanımını buraya girin
  • B, A, 7 6 anlamına gelir.
    • görüntü tanımını buraya girin
  • A, 2 değil
    • görüntü tanımını buraya girin
  • A, B, 7 6 anlamına gelir.
    • görüntü tanımını buraya girin
  • nand, 16 15
    • görüntü tanımını buraya girin
    • doğru, 1
    • görüntü tanımını buraya girin

TL; DR

Domino dostu bir meydan okuma bekliyordum / istiyordum ve bunu görünce üstesinden gelemedim. Tek sorun, görünüşe göre artık kimsenin domino sahibi olmamasıydı! Sonunda pes ettim ve iki on iki tane aldım . Bu set, normal (uzun) 'zaman gecikmesi' yöntemi yerine 'fonksiyon çağrısı' / domino başlangıcı fikrini veren 91 karoya sahip. 90 derece dönüş için kredi dominoesdouble07 kanalına aittir .

Bunları fiziksel dominolarla kurduktan sonra geçerli çözümlerin dijital olması gerektiği konusunda meta hükmedildi . Bu yüzden bu kapıları Masaüstü Simülatöründe yeniden yarattım . Ne yazık ki, TS ve gerçeklik domino fiziği üzerinde hemfikir değil. Bu bana 11 domino eklememi istedi ama ben de 8 kazandım. Genel olarak, sanal domino x150 yapımı ve denenmesi bakımından daha etkili ( Ctrl+ Z).

Güncelleme

  • -9 [17-03-13] Kısaltıldıxor xnor nand
  • [17-03-04] Atölye dosyasına bağlantı eklendi
  • +11 [17-03-03] Eklenen dijital xnorvexor
  • -8 [17-03-03] Tüm kapıları sayısallaştırdı ( xorve hariç xnor). Masaüstünde engelleme 2 yerine sadece 1 domino gerektirir.
  • [16-09-23] Shrunk görüntüler
  • -11 [16-09-18] Xor'u neredeyse yarı yarıya kesin. Teşekkür etmek @DJMcMayhem XNOR ve için Joe xor için.
  • -31 [16-08-31] bazı resimler Güncelleme ve bazı fayans traş ve kesilmiş xor yarısında
  • [16-08-28] Eklenen resimler

43
+1 PPCG'de daha fazla domino golfüne ihtiyacımız var
Beta Decay


7
Vay. Bu, bu sitede gördüğüm en özgün cevaplardan biri.
DJMcMayhem

3
Eğer xnor'ı birlikte ezip 5 yerine 4 üste çıkarsanız bir domino çıkarabildiğiniz görülüyor. Sonra yine de hiç test etmedim.
DJMcMayhem

2
Bunu geçerli bir cevap haline getirmek için zaman ayırdığınız için teşekkür ederiz. Ancak, kaynak dosyaya bağlantı bulmak biraz zor. Normalde, başlıktaki bağlantı dilin kendisine yönlendirilir. Bu yüzden bunu birinciyi buhar oyununa bağlar, sonra da asıl "kaynak dosyaya" bağlantısını, cevabın gövdesinde bir yerde, açıkça etiketlenmiş bir bağlantıya koyardım.
Martin Ender

45

Altıgen , 89 bayt

XOR çözümü için gerekli bazı ilham kaynakları için FryAmTheEggman'a teşekkürler.

0000 !@
0001 ?.|@!
0010 #?#!)@
0011 ?!@
0100 +?|@!?
0101 ??!@
0110 ?<@!!<_\~(
0111 ?<<@!
1000 )\!#?@{
1001 (~?/@#!
1010 ??|@!)
1011 \#??!1@
1100 ?(~!@
1101 ?.|@!)
1110 ?$@#)!<
1111 1!@

Tüm programlar 0yanlış ve 1doğru için kullanır .

Çevrimiçi deneyin! Bu bir test paketi değildir, farklı programlara kopyalamanız ve kendiniz girmeniz gerekir.

Yukarıdaki çözüm 2-bayt optimallik içindedir (sanırım truthy / falsy yorumunu gevşetmezsek). Ben yani en fazla 7 bayt (değil, yan uzunluğu 2 sığacak tüm programları üzerinde iki gün yakın bir kaba kuvvet arama çalışmasına izin ettik oldukça tüm programlar - Bilirim her geçerli programı ihtiyaçlarına ve ne üzerinde birkaç varsayımlar yapılmış hiçbir geçerli program olabilir). Arama, 16 olası kapıdan 15'i için çözüm buldu - ve çoğu zaman birden fazla değil. Tüm alternatif çözümlerin bir listesini bu pastebin içinde bulabilirim, burada bunları eşdeğer davranışlara göre gruplandırdım. Yukarıda gösterdiklerimi seçtim çünkü bunlar en basit ya da en ilginç çözüm, ve yarın onlar için açıklamalar ekleyeceğim.

16. kapıya gelince: XOR, görünüşte 7 bayta uygulanamayan tek kapıdır. Büyük programlar üzerinde kaba bir kuvvet araştırması maalesef şu anda sahip olduğum kodla mümkün değil. Yani XOR elle yazılmış olması gerekiyordu. Şimdiye kadar bulduğum en kısa süre, FryAmTheEggman'ın başarısız (ancak çok yakın) bir girişimini temel alan 10 baytlık program. 8 baytlık veya 9 baytlık bir çözüm mevcut olabilir, ancak bunun dışında tüm çözümlerin gerçekten optimum olması gerekir.

açıklamalar

Uyarı: metin duvarı. Bu yüksek oranda sıkıştırılmış Hexagony programlarının gerçekte nasıl çalıştıklarını ilgilendiren birinin şansını kaybetme ihtimaline karşı, her biri için açıklamalar getirdim. Açıklamaları oldukça kısa tutmak için birden fazla optimal programın bulunduğu durumlarda her geçit için en basit çözümü seçmeye çalıştım. Ancak, bazıları hala akıllara durgunluk veriyor, bu yüzden biraz daha fazla detaylandırma hak ettiklerini düşündüm.

0000: Yanlış

Bunun için bir şemaya ihtiyacımız olacağını sanmıyorum:

 ! @
. . .
 . .

Tüm bellek ızgarası sıfırlanmaya başladığından, !sadece sıfır yazdırır ve @programı sonlandırır.

Bu aynı zamanda sadece 2 baytlık bir çözümdür.

0001: Ve

 ? .
| @ !
 . .

Bu temelde kısa devre uygular . Aşağıdaki gri diyagram, ilk girişin okunduğu ?ve komut göstergesinin (IP) |aynanın yansıtdığı sol köşeye dolandığı programın başlangıcını göstermektedir . Şimdi köşe koşullu olarak hareket ediyor, ilk girişin değerine bağlı olarak iki farklı yürütme yolu var. Kırmızı şema için kontrol akışını A = 0ve şunun için yeşil diyagramı gösterir A = 1:

ben ben ben

Gördüğünüz gibi, ne zaman Aolduğunu 0, o zaman basitçe (bütün unutmayın yazdırmak ve sonlandırmak .no-op vardır). Ama Aise 1, bu durumda IP okuma, yine ilk satırı geçtiği Bve bunun yerine baskı söyledi.

Toplamda bu kapı için on altı 5 baytlık çözüm bulunmaktadır. Bunların on dördü esasen yukarıdakiyle aynıdır, ya etkin biçimde etkin olmayan bir komutu >yerine |ya da yerine .koyarak ya ?da ikinci pozisyona koyarak :

?.|@!    .?|@!    ?=|@!    =?|@!    ?_|@!    _?|@!    ?0|@!
?.>@!    .?>@!    ?=>@!    =?>@!    ?_>@!    _?>@!    ?0>@!

Ve sonra diğer iki çözüm var (bunlar birbirine eşdeğer). Bunlar aynı kısa devre mantığını da uygularlar, ancak yürütme yolları biraz daha çılgıncadır (ve okuyucuya bir egzersiz olarak bırakılmıştır):

?<!@|
?<!@<

0010: A ve B değil

 # ?
# ! )
 @ .

Bu aynı zamanda bir kısa devre şekli de uygulamaktadır, ancak #kontrol akışının kullanılması nedeniyle daha zorlayıcıdır. #koşullu bir IP anahtarıdır. Hexagony aslında etiketli altı IP ile birlikte 0için 5kendi saat kenarı boyunca işaret ızgara altı köşe başlar (ve programı her zaman IP ile başlar 0). A #ile karşılaşıldığında, mevcut değer modulo alınır 6ve kontrol akışı ilgili IP ile devam eder. Ne çılgınlık uyumunun bana bu özelliği eklediğinden emin değilim, ama kesinlikle bazı şaşırtıcı programlara (bunun gibi) izin veriyor.

Üç vakayı ayırt edeceğiz. Ne zaman A = 0değeri her zaman olduğundan, program, oldukça basittir 0zaman #hiçbir IP anahtarlama gerçekleşecek şekildedir karşılaşıldığında:

ben

#hiçbir şey yapmaz, ?okur A(yani hiçbir şey yapmaz), #yine de hiçbir şey yapmaz, !yazdırır 0, )arttırır (bu önemlidir, aksi takdirde IP üçüncü satıra atlamaz), @programı sonlandırır. Yeterince basit. Şimdi durumu ele alalım (A, B) = (1, 0):

ben

Kırmızı yol hala IP'ye karşılık geliyor 0ve ben IP için yeşil yolu ekledim 1. ?Okuduktan sonra A( 1bu sefer) #sağ üst köşeden başlayan IP’ye geçiş yaptığını görüyoruz . Bunun anlamı ?okuyabilir B( 0). Şimdi bunu )arttırır 1, öyle ki #sol üst köşedeki hiçbir şey yapmaz ve IP ile kalırız 1. !Baskılar 1ve IP sol çapraz sarar. #hala hiçbir şey yapmaz ve @programı sonlandırır.

Son olarak, her iki girdinin de bulunduğu garip durum 1:

ben

Bu kez, ikinci giriş de 1ve )bu için artırır 2. Bunun anlamı #sol üst köşede neden başka IP IP anahtarını 2, mavi göstermektedir. Bu yolda, ilk önce onu daha da 3arttırırız (ilgisiz olmasına rağmen) ve sonra ?üçüncü kez geçiririz. Şimdi EOF'ye (yani giriş bitmiştir) çarptığımız için programı ?geri döndürür 0, !yazdırır ve @sonlandırır.

Özellikle, bu kapı için tek 6-byte çözüm budur.

0011: A

 ? !
@ . .
 . .

Bir şemaya ihtiyacımız olmayacak kadar basittir: ?okur A, !yazdırır, @sonlandırır.

Bu, bu kapı için tek 3-byte çözümdür. (Prensip olarak, yapmak da mümkün olacaktı ,;@, ama arama dahil değildi ;, çünkü !bu iş için baytları hiçbir zaman kurtarabileceğini sanmıyorum .)

0100: B ve A değil

 + ?
| @ !
 ? .

Bu, "kardeşinden" çok daha basittir 0010. Kontrol akışı aslında yukarıda 0001(And) için gördüğümüz aynıdır . Eğer A = 0öyleyse, IP, son çizgiden geçer, Bsonlandırmadan önce bunu okur ve yazdırır. Eğer A = 1o zaman IP ayrıca okuma, yine ilk satırı geçtiği B, ancak +iki kullanılmayan bellek öyle herkese geçerli değerini sıfırlamak yani kenarları ekler 0, böylece !her zaman baskılar 0.

Buna oldukça 6-byte alternatif var (toplamda 42). İlk olarak, yukarıdakilere denk bir tonluk çözüm var. Tekrar arasında serbestçe seçebilir |ve >ve +bize boş bir avantaj sağlar başka komutuyla değiştirilebilir:

"?|@!?    &?|@!?    '?|@!?    *?|@!?    +?|@!?    -?|@!?    ^?|@!?    {?|@!?    }?|@!?
"?>@!?    &?>@!?    '?>@!?    *?>@!?    +?>@!?    -?>@!?    ^?>@!?    {?>@!?    }?>@!?

Ayrıca ]yerine de kullanabiliriz ?. ]bir sonraki IP'ye gider (yani IP'yi seçer 1), böylece bu dal yerine ?sağ üst köşeyi yeniden kullanır . Bu da 18 çözüm daha veriyor:

"?|@!]    &?|@!]    '?|@!]    *?|@!]    +?|@!]    -?|@!]    ^?|@!]    {?|@!]    }?|@!]
"?>@!]    &?>@!]    '?>@!]    *?>@!]    +?>@!]    -?>@!]    ^?>@!]    {?>@!]    }?>@!]

Ve sonra farklı çılgınlık seviyelerinde farklı şekilde çalışan altı başka çözüm var:

/[<@!?    ?(#!@]    ?(#>@!    ?/@#/!    [<<@!?    [@$\!?

0101: B

 ? ?
! @ .
 . .

Woohoo, basit bir tane daha: oku A, oku B, yazdır B, sonlandır. Aslında buna alternatifler var. Yana Asadece tek bir karakter, biz de bunu birlikte okuyabilir ,:

,?!@

Ayrıca tek ?kullanma ve iki kez çalıştırmak için bir ayna kullanma seçeneği de var :

?|@!    ?>@!

0110: Xor

  ? < @
 ! ! < _
\ ~ ( . .
 . . . .
  . . .

Yukarıda söylediğim gibi, bu, 2. tarafa sığmayacak tek geçitti, bu yüzden FryAmTheEggman ve kendimin el yazısıyla yazdığı bir çözüm. Ayırt etmek için iki durum var. Eğer A = 0kontrol akışı (bu durumda sadece yazdırmak gerekiyor çünkü oldukça basittir B):

ben

Kırmızı yoldan başlıyoruz. ?okur A, <sola sıfır saptırıcı bir daldır. IP dibe sarılır, sonra _başka bir ayna olur ve IP köşeye çarptığında sol üst köşeye sarılır ve mavi yolda devam eder. ?okur B, !yazdırır. Şimdi (onu azaltır. Bu önemlidir, çünkü değerin pozitif olmadığını garanti eder (ya 0ya -1şimdi ya da şimdi). Bu, IP sargısını @, programı sonlandırdığı sağ köşeye kaydırır .

Ne zaman A = 1işler biraz yanıltıcıdır olsun. Bu durumda not B, kendi içinde çok zor olmayan bir baskı yapmak istiyoruz , ancak uygulama yolu biraz trippy.

ben

Bu sefer, <IP'nin yönünü saptırıyor ve sonra bir sonraki adım <sadece ayna gibi davranıyor. Böylece IP aynı yolu tersten çevirir ve tekrar Bkarşılaştığında okur ?. IP sağ köşeye dolanır ve yeşil yolda devam eder. Daha sonra (~, “değişim, -1 ile çarpma” olan 0ve takas eden 1ve dolayısıyla hesaplayan karşılaşmalar ortaya çıkıyor not B. \sadece bir aynadır ve !istenen sonucu basar. Sonra ?başka bir numara döndürmeye çalışır, ancak sıfır döndürür. IP şimdi mavi yolun sol alt köşesinde devam ediyor. (azalmalar, <yansıtır,(IP köşeye çarptığında geçerli değer negatif olacak şekilde yeniden azalır. Sağ alt köşegen boyunca hareket eder ve sonunda @programı sonlandırmak için vurur .

0111: Veya

 ? <
< @ !
 . .

Daha kısa devre.

ben ben

A = 0Vaka (kırmızı yol) burada biraz çelişkilidir olduğunu. IP sola saptırılır, sol alt köşeye kaydırılır, hemen yansır <ve ?okumaya geri döner B. Daha sonra, rigt köşeye sarar yazdırır Bile !ve sonlandırır.

A = 1Vaka (yeşil yol) biraz daha basittir. <Biz sadece yazdırmak böylece şube, IP sağ saptırarak !, başa dön sola kaydırmak ve en sona @.

Sadece bir tane 5 baytlık çözüm var:

\>?@!

Esasen aynı şekilde çalışır, ancak gerçek yürütme yolları oldukça farklıdır ve a yerine dallanma için bir köşe kullanır <.

1000: Nor

 ) \
! # ?
 @ {

Bu, bu aramada bulunan en sevdiğim program olabilir. En güzel şey, bu uygulamanın noraslında 5 girişe kadar çalışmasıdır. Bunu açıklamak için biraz bellek modelinin ayrıntılarına girmem gerekecek. Hızlı bir tazeleme olarak, Hexagony'nin bellek modeli, her bir kenarın bir tamsayı değeri tuttuğu ayrı bir altıgen ızgaradır (başlangıçta hepsi sıfırdır). Bu kenar boyunca bir kenarı ve yönü belirten bir bellek işaretçisi (MP) vardır (öyle ki, geçerli solun önünde ve arkasında, anlamlı sol ve sağ komşularıyla birlikte iki komşu kenar vardır). İşte, MP ile kırmızı renkte gösterildiği gibi başlayarak, kullanacağımız kenarların bir şeması:

ben

Öncelikle her iki girişin olduğu durumu düşünelim 0:

ben

Biz sadece kenar artırır gri yolu, günü başlayacak A için 1böylece #IP'ye anahtarlar 1, mavi yolunu olduğunu sağ üst köşede başlayan. \orada hiçbir şey yapmaz ve ?bir girdi okur. Sol üst köşeye )kaydırarak girişleri artırır. Giriş sıfır olduğu sürece, bu a ile sonuçlanır 1, bu #hiçbir şey yapmaz. Daha sonra {birinci yineleme yani sola, MP hareket bir üzere B . Bu kenar hala ilk sıfıra sahip olduğundan, IP sağ üst köşeye ve yeni bir bellek kenarına geri sarılır. Bu yüzden bu döngü ?sıfır okur, MP'yi B'den altıgen etrafında hareket ettirir.ila C arasında D ve benzeri. ?Girdi olduğu için sıfır mı yoksa EOF olduğu için mi önemi yok .

Bu döngüdeki altı yinelemeden sonra, A'ya{ geri döner . Bu kez, kenar zaten ilk yinelemenin değerini tutar , böylece IP sol köşeye kaydırılır ve bunun yerine yeşil yolda devam eder. sadece bunu yazdırır ve programı sonlandırır.1!1@

Şimdi, girişlerden herhangi biri ne olacak 1?

ben

Sonra bir noktada bunu ?okur 1ve )arttırır 2. Bu #, şimdi IP'leri tekrar değiştirecek ve kırmızı yolda sağ köşeye devam edeceğiz demektir . ?gerçekten önemli olmayan ve {bir kenarı daha ileriye taşıyan başka bir girişi (varsa) okur . Bunun kullanılmayan bir kenar olması gerekir, bu nedenle 5 girişe kadar çalışır. IP, hemen yansıdığı ve sağ köşeye sarıldığı için sağ üste sarılır. kullanılmayan kenara !basar ve IP'ye geri döner . O IP hala devam ediyor , güneybatıya gidiyordu (gri yol), bu yüzden hemen vurur ve programı sonlandırır.0#0#@

Toplamda bu kapı için yedi adet 7 baytlık çözüm bulunmaktadır. 5 tanesi bununla aynı şekilde çalışır ve kullanılmayan bir kenara geçmek için basitçe başka komutlar kullanır (ve farklı bir altıgen etrafında veya farklı bir yönde yürüyebilir):

)\!#?@"    )\!#?@'    )\!#?@^    )\!#?@{    )\!#?@}

Ve yalnızca iki girdiyle çalışan, ancak yürütme yolları aslında daha da karmaşık olan bir başka çözüm sınıfı var:

?]!|<)@    ?]!|<1@

1001: Eşitlik

 ( ~
? / @
 # !

Bu ayrıca koşullu IP seçimini çok akıllıca kullanır. Biz arasına tekrar ayırmak gerekir A = 0ve A = 1. İlk durumda basmak istiyoruz not B, ikincisinde basmak istiyoruz B. Çünkü A = 0bu iki durumu da ayırt ediyoruz B. İle başlayalım A = B = 0:

ben

Gri yoldan başlıyoruz. (~göz ardı edilebilir, IP (hala gri yolda) sol köşeye sarar ve okur Aile ?. (azalır, böylece biz almak -1ve IP sol alt köşeye kaydırın. Şimdi daha önce de söylediğim gibi, IP'yi seçmeden önce #modulo değerini alır 6, bu yüzden -1aslında 5kırmızı yolun sol köşesinde başlayan IP değerini alır . ?okur B, yeniden vurduğumuzda (IP’de 5kalmamızı sağlar #. IP'nin sağ alt köşeye sarılması, yazdırması ve sonlandırması için ~olumsuzlar .-11

ben

Şimdi ise B, 1geçerli değer ikinci kez 0çarptığımız #zaman olacaktır, bu yüzden IP'ye geri dönelim 0(şimdi yeşil yoldayız). Bu ?üçüncü kez vurur , verir 0, !yazdırır ve @sonlandırır.

ben

Son olarak, nerede durum A = 1. Bu kez, #ilk defa vurduğumuzda mevcut değer zaten sıfırdır , bu yüzden bu asla 5ilk etapta IP'ye geçmez . Hemen yeşil yol üzerinde devam ediyoruz. ?Şimdi sadece sıfır vermek değil, Bbunun yerine döner . !yazdırır ve @tekrar sonlandırır.

Toplamda bu kapı için üç adet 7 baytlık çözüm bulunmaktadır. Diğer ikisi çok farklı bir şekilde çalışıyor (birbirlerinden bile) ve daha da tuhaf kullanıyorlar #. Özellikle ,(bir tamsayı yerine bir karakter kodunu okuyarak) ile bir veya daha fazla değer okurlar ve daha sonra bir IP seçmek için bu modulo 6 değerini kullanırlar. Güzel fındıklar.

),)#?@!

?~#,~!@

1010: B değil

 ? ?
| @ !
 ) .

Bu oldukça basittir. Yürütme yolu, anddaha önce bildiğimiz yatay koldur. hemen ??okur Ave sonra B. |Yansıttıktan ve dallanmadan sonra B = 0, alt dalı uygulayacağız, burada )değerin artırılacağı değer 1artmaktadır !. Üst dalda (eğer ise B = 1) basılacak ?kenarı kolayca sıfırlayın .0!

Bu kapı için sekiz adet 6 baytlık program var. Bunlardan dördü hemen hemen aynıdır, >yerine |ya da 1yerine )(ya da her ikisini de) kullanarak:

??>@!)    ??>@!1    ??|@!)    ??|@!1

İki ?ayna nedeniyle iki kez kullanılan bir tek kullanın . Olumsuzluk sonra xorya (~da ile yaptığımız gibi olur ~).

?>!)~@    ?>!~(@

Ve son olarak, iki çözüm koşullu bir IP anahtar kullanmaktadır, çünkü kıvrımlı olanın da çalışması durumunda neden basit bir yöntem kullanıyorsanız:

??#)!@    ??#1!@

1011: B, A anlamına gelir.

 \ #
? ? !
 1 @

Bu, bazı oldukça ayrıntılı IP anahtarlama kullanır. A = 1Bu sefer dava ile başlayacağım , çünkü daha basit:

görüntü tanımını buraya girin

Biz okur gri yolu, günü başlayacak Aolan ?ve daha sonra vurur #. Yana Aolan 1bu IP geçer 1(yeşil yol). !Hemen, IP sol üst sarar ki okur yazdırır B(gereksiz yere) ve sonlandırır.

Ne zaman A = 0işler biraz daha ilginç olsun. İlk önce düşünelim A = B = 0:

görüntü tanımını buraya girin

Bu sefer, #hiçbir şey yapmıyor ve IP üzerinde kalıyoruz 0(o noktadan itibaren kırmızı yol). ?okur Bve 1a'ya dönüştürür 1. Sol üst köşeye kaydırdıktan sonra #tekrar vururuz, bu yüzden sonuçta yeşil yola son buluruz ve 1sonlandırmadan önce olduğu gibi yazdırırız .

Son olarak, işte, (A, B) = (0, 1)sahte dava:

görüntü tanımını buraya girin

Açıklık için başlangıçtaki gri yolu kaldırdığımı unutmayın, ancak program aynı şekilde başlar ve daha önce olduğu gibi kırmızı yola çıkarız. Yani bu sefer ikinci ?döner 1. Şimdi karşılaşıyoruz 1. Bu noktada Hexagony'de rakamların gerçekte ne yaptığını anlamak önemlidir (şimdiye kadar yalnızca sıfırlarda kullandık): bir rakamla karşılaşıldığında, geçerli değer 10 ile çarpılır ve sonra rakam eklenir. Bu normalde kaynak koduna yazılan ondalık sayıları yazmak için kullanılır, ancak bunun B = 1aslında değere eşlendiği anlamına gelir 11. Böylece, vurduğumuzda #, bu 6vermek için modulo alınır 5ve dolayısıyla IP'ye 5( 1daha önce olduğu gibi) geçip mavi yolda devam ederiz . İsabet?üçüncü bir zaman sıfırı döndürür, bu nedenle !yazdırır ve başka bir ikisinden sonra ?IP, programın sonlandırıldığı sağ alt köşeye kaydırılır.

Bunun için dört 7 baytlık çözüm var ve hepsi farklı çalışıyor:

#)/!?@$    <!?_@#1    \#??!1@    |/)#?@!

1100: A Değil

 ? (
~ ! @
 . .

Sadece basit doğrusal bir: okumak Aile ?birlikte etkisiz hale (~ile yazdırmak !ile sona, @.

Alternatif bir çözüm var, ~)bunun yerine olumsuz geliyor :

?~)!@

1101: A, B anlamına gelir.

 ? .
| @ !
 ) .

Bu, henüz bahsettiğimiz zıt imadan çok daha basittir. Yine bu gibi yatay dal programlarından biri and. Eğer Abir 0, sadece artırılır alır 1alt dalda ve baskılı. Aksi halde, üst dal tekrar ?okunur Bve !bunun yerine onu yazdırır.

Çoğunlukla etkili no-op seçeneklerinden dolayı burada bir ton alternatif var (toplamda 66 çözüm). Bir başlangıç ​​için yukarıdaki çözümü değiştirebildiğimiz gibi değiştirebiliriz ve andayrıca )ve arasında seçim yapabiliriz 1:

?.|@!)    .?|@!)    ?=|@!)    =?|@!)    ?_|@!)    _?|@!)    ?0|@!)
?.|@!1    .?|@!1    ?=|@!1    =?|@!1    ?_|@!1    _?|@!1    ?0|@!1
?.>@!)    .?>@!)    ?=>@!)    =?>@!)    ?_>@!)    _?>@!)    ?0>@!)
?.>@!1    .?>@!1    ?=>@!1    =?>@!1    ?_>@!1    _?>@!1    ?0>@!1

Daha sonra, ilk komutun neredeyse keyfi bir şekilde seçilebildiği koşullu IP seçimini kullanan farklı bir sürüm var )ve 1bu seçeneklerin bazıları için ve arasında bir seçenek var :

"?#1!@    &?#1!@    '?#1!@    )?#1!@    *?#1!@    +?#1!@    -?#1!@    .?#1!@    
0?#1!@    1?#1!@    2?#1!@    3?#1!@    4?#1!@    5?#1!@    6?#1!@    7?#1!@    
8?#1!@    9?#1!@    =?#1!@    ^?#1!@    _?#1!@    {?#1!@    }?#1!@

"?#)!@    &?#)!@    '?#)!@              *?#)!@    +?#)!@    -?#)!@    
0?#)!@              2?#)!@              4?#)!@              6?#)!@    
8?#)!@                        ^?#)!@    _?#)!@    {?#)!@    }?#)!@

1110: Nand

 ? $
@ # )
 ! <

Son karmaşık olanı. Hala okuyorsan, neredeyse başardın. :) A = 0İlk önce bakalım :

görüntü tanımını buraya girin

?okur Ave sonra vururuz $. Bu, bir #sonraki komutu atlayan , böylece sonlandırmamamız gereken bir atlama komutudur (Befunge'ninki gibi ) @. Bunun yerine IP devam ediyor #. Ancak bu yana Ais 0bu bir şey yapmaz. IP , yazdırıldığı alt yolda devam edecek şekilde )artar . Tarafa döner sola köşeye sarar ve program sonlanır sağa IP.11<

Ardından, girdi olduğunda (A, B) = (1, 0)bu durumu anlarız:

görüntü tanımını buraya girin

Aslında #biz IP'ye 1(yeşil yol) geçtikten sonra öncekiyle aynı , ancak o zamandan beri Bolduğu gibi ikinci kez (şimdi mavi yoldan) bastığımızda 0IP'ye geri dönüyoruz .0#1

Sonunda A = B = 1durum:

görüntü tanımını buraya girin

Bu kez, #ikinci kez olduğumuzda , geçerli değer hala 1IP'yi tekrar değiştirmememiz için geçerlidir. <Bunu yansıtır ve biz vurmak üçüncü kez ?bir sıfır olsun. Bu nedenle IP !, sıfırı yazdırdığı ve programın bittiği alt solda kaydırır.

Bunun için toplam dokuz adet 7 baytlık çözüm var. İlk alternatif, 1bunun yerine sadece kullanır ):

?$@#1!<

Daha sonra, devam eden IP anahtarlama miktarını kafanıza sokacak iki çözüm var:

)?#_[!@    1?#_[!@

Bunlar aslında aklımı başımdan aldı: ilginç olan kısım IP değişiminin ertelenmiş bir şartlı olarak kullanılabileceği. Dilin IP anahtarlama kuralları, geçerli IP anahtar gerçekleşmeden önce bir adım daha atar. Eğer bu adım bir köşeden geçerse, o zaman geçerli değer IP'ye geri dönersek IP'nin hangi dalda devam edeceğine karar verir. Tam olarak giriş olduğunda bu olur A = B = 1. Her ne kadar bu dili nasıl tasarladığımla tutarlı olsa da, spekülasyonun bu anlamının hiçbir zaman farkında değildim, bu yüzden dilimin bana yeni püf noktaları öğretmesi güzel: D.

Öyleyse, IP değişim miktarı daha da kötü olan üçüncü bir çözüm var (bu ertelenmiş koşullu etkiden faydalanmasa da):

>?1]#!@

Ve sonra bir tane daha var:

?$@#)!<

Ve sonra bazı koşulsuz IP anahtarlama kullanan ve bunun yerine tüm mantığı dallar ve köşelerden alan dört eşdeğer çözüm var:

]<?<@!)    ]<?<@!1    ]|?<@!)    ]|?<@!1

1111: Doğru

 1 !
@ . .
 . .

Sonu için kendinize basit bir şey kazandınız: kenar koymak 1, yazdırmak !, sonlandırmak @. :)

Tabii ki, bir alternatif var:

)!@

Her zamanki gibi, Timwi'nin HexagonyColorer'ı ile oluşturulan tüm kontrol akış şemaları ve Ezoterik'siyle hafıza şeması .


9
Aaaaa ve tl; dr ödülü ... (açıkça şaka, büyük cevap ve çok iyi yazılmış, +1)
Bassdrop Cumberwubwubwub

4
Artık sohbette aktif olmamanın nedeni bu mu?
Doktor

Geç sıralama, ancak kaba kuvvet kodunuza bir link ekleyebilir misiniz?
nedla2004

@ nedla2004 Genelde onları etrafta tutmuyorum ama bu her zaman bu betiğin değiştirilmiş bir versiyonudur .
Martin Ender

40

APL, 22 20 18 bayt

Doğru ve yanlış girişler tam programlardır ve diğer 14'ü işlevdir. (Adám'a teşekkürler.)

0000 false              0 (complete program)
0001 p and q            ∧
0010 p and not q        >
0011 p                  ⊣
0100 not p and q        <
0101 q                  ⊢
0110 xor                ≠
0111 p or q             ∨
1000 not p and not q    ⍱
1001 eq                 =
1010 not q              ~⊢
1011 p or not q         ≥
1100 not p              ~⊣
1101 not p or q         ≤
1110 not p or not q     ⍲
1111 true               1 (complete program)

Burada dene.


1
+1 Atopların iyi kullanımı! İki bayt'ı 0000 ve 1111 kodunu trad-fns 0ve 'ye dönüştürerek kaydedebilirsiniz 1.
Adám

TNS'lere izin verecek, ancak ilk satırı saymayacak bir fikir birliği var. Bu, dosya adı, program adı = dosya adı olan program kapsayıcıları olarak kullanan dillerdeki sayılmamasına karşılık gelir.
Adám


10
Jöle: 19 bayt. Bu: 18 bayt. Bu, Dennis'i aştığın anlamına gelmiyor mu? Bunun için +1.
NoOneIsHere

29

Satranç / vasat satranç oyuncusu oyunsonda, 70 parça

Bu domino cevabından esinlenerek, başka bir oyunun bu onura sahip olması gerektiğine karar verdim.

Parçaların nasıl hareket ettiği ile ilgili birkaç kural aldığımı unutmayın. Her durum için en uygun hareketleri çalışmak gibi hissetmediğim için, beyazların taşınması için kurallar basittir: Kontrolden çıkmayın, alabileceği en yüksek rütbeli parçayı yakalayın, mümkün olduğunca az malzeme kaybederken ve bir piyonu durdurun Bu öncelik sırasına göre teşvik etmek. Hareket edebileceği iki boşluk varsa, eşit avantajlı bir şekilde, her ikisine de gidebilir (bu nedenle, birden fazla kareye geçebilirse, bunlar aynı renktedir). Beyaz, yakalansa bile bir şeyle yakalayacağını, saldırdığı parça kaybedenden daha yüksek değerde olacağını unutmayın. Değerler burada:pawn<knight=bishop<rook<queen

Girdi, kalenin olup olmadığı. Kancaların yalnızca A ve B isimleri ile etiketlendiğine dikkat edin: Kanatlar anahtarlandığı zaman kapı aynı şekilde davranırsa, etiketlenmemişlerdir.

Çıktı, beyaz kralın bittiği renktir: Beyaz = 1, siyah = 0

Resimlerden önce, zayıf görüntüler için özür dilemek istiyorum. Bir kamerayı sabit tutmada pek iyi değilim.

Yanlış, 4:

Yanlış

VE, 4:

görüntü tanımını buraya girin

A ve B, 5 değil (Sanırım bunu üçe indirebilirim, ancak şu anda yönetim kuruluna sahip değilim):

görüntü tanımını buraya girin

A, 4:

görüntü tanımını buraya girin

A ve B, 5 değil (Sanırım bunu üçe indirebilirim, ancak şu anda yönetim kuruluna sahip değilim):

görüntü tanımını buraya girin

B, 4:

görüntü tanımını buraya girin

Xor, 5 (4 yapmanın bir yolunu biliyorum, ancak şu anda yönetim kuruluna sahip değilim):

görüntü tanımını buraya girin

Veya, 4:

görüntü tanımını buraya girin

Ayrıca, 4:

görüntü tanımını buraya girin

Xnor, 5 (4 yapmanın bir yolunu biliyorum, ancak şu anda yönetim kuruluna sahip değilim):

görüntü tanımını buraya girin

B, 4 değil:

görüntü tanımını buraya girin

B, A, 5 anlamına gelir (Sanırım bunu üçe indirebilirim, ancak şu anda yönetim kuruluna sahip değilim):

görüntü tanımını buraya girin

A, 4 değil:

görüntü tanımını buraya girin

Bir B, 5 anlamına gelir (Sanırım bunu üçe indirebilirim, ancak şu anda yönetim kuruluna sahip değilim):

görüntü tanımını buraya girin

Nand, 4:

görüntü tanımını buraya girin

Doğru, 4:

görüntü tanımını buraya girin


1
Vay canına, satrançta programlamanın mümkün olduğunu bilmiyordum ... Bunlardan bir kaçı hakkında bir video / simülasyon yayınlayabilir misiniz?
Beta Ayı

2
hmmm, şu anda satranç tahtasına erişimim yok. Muhtemelen, A'nın B / B'nin, piyonların krallar hareketi üzerindeki etkisinden dolayı anlaşılması en zor olduğu anlamına geldiğini söyleyebilirim. Muhtemelen bu ikisi için daha iyi bir açıklama eklemeliyim
Yıkılabilir Limon

İlham vermekten memnun oldum: D Doğru anlıyorsam, pano ve parça konumları bir programa eşdeğerdir. Aşçılar giriştir, bu yüzden doğru renk olduğu sürece herhangi bir kareye yerleştirebilirim?
NonlinearFruit

Hayır, çubukların girişi tahtada bulunup bulunmadıklarıdır. Simetrik kapılar olmadıklarında a ve b olarak etiketlenirler (farklı a ve b ile ilgili olduğunda). Ayrıca 2 parçayı nasıl golf oynayabileceğimi farkettim, fakat şu anda tahtaya sahip değilim. Boya fırçası kullanılmalı :)
tahrip edilebilir limon

"Ve" davanızda, sağ kaleyi kaldırırsanız, kralın aşağı inmesini (beyaza) engelleyen nedir?
Nathan Merrill

27

Jöle , 19 bayt

0 0 0 0 ¤  1 byte  Empty niladic chain. Returns default argument 0.
0 0 0 1 &  1 byte  Bitwise AND.
0 0 1 0 >  1 byte  Greater than.
0 0 1 1    0 bytes Empty link. Returns left argument.
0 1 0 0 <  1 byte  Less than.
0 1 0 1 ị  1 byte  At-index (x,y -> [y][x]). Returns right argument.
0 1 1 0 ^  1 byte  Bitwise XOR.
0 1 1 1 |  1 byte  Bitwise OR.
1 0 0 0 |¬ 2 byte  Logical NOT of bitwise OR.
1 0 0 1 =  1 byte  Equals.
1 0 1 0 ¬} 2 bytes Logical NOT of right argument.
1 0 1 1 *  1 byte  Exponentiation.
1 1 0 0 ¬  1 byte  Logical NOT of left argument.
1 1 0 1 >¬ 2 bytes Logical NOT of greater than.
1 1 1 0 &¬ 2 bytes Logical NOT of bitwise AND.
1 1 1 1 !  1 byte  Factorial.

Çevrimiçi deneyin!


13
Factorial'ın 0 ya da 1'i 1'e dönüştürmek için kullanımını seviyorum.
Neil

Jelly UTF-8 mi? Evet o takdirde ¤ve ¬2 byte değil, 1. olan
Vi.

1
@Vi. Jelly UTF-8'i destekler, ancak her biri tek bir bayt olarak anladığı 256 karakterin her birini kodlayan özel bir kod sayfasını da destekler. Bayt buna başlık noktalarında bağlar.
Dennis,

0 0 1 0 > 1 byte Greater than.İkinci girdi negatif olsaydı bu başarısız olmaz mıydı?
MD XF

@MFXF Hangi gerçeği ve hangi sahte değeri desteklediğimizi seçebiliriz.
Dennis,

24

NAND mantık kapıları - 31 kapı

Yaratıcısı olarak orijinal serinin ait NAND kapısı sorular , başka bir mantık kapısı sorunu çözmek için bu kapıları kullanma fırsatı kaçırmak olabilir.

görüntü tanımını buraya girin

Bu şemaların her birinde, alt giriş B iken üst giriş A'dır.


5
@xnor onun mantık kapısı D yapmak için en NAND kapıları gerektirir biri olduğunu bilmek gurur olabilir:
Joe Z.

Kodunuzu biçimlendirmek için en azından Logisim'i kullanabilir misiniz?
mbomb007

1
@ mbomb007 Bunu daha sonra düzenleyeceğim. Logisim konusunda çok tecrübeli değilim, bu yüzden biraz zaman alabilir.
Joe Z.

3
Ama el yazısını daha çok seviyorum.
Leaky Nun

1
Alternatif olarak redstone kullanarak kapıya
geçip

22

Bitsel Döngüsel Etiket , 118 bit = 14.75 bayt

Bitsel Döngüsel Etiket belki de şimdiye kadar tasarlanan en basit Turing-tamamlanmış bir dildir. Her ikisi de bit listesinden oluşan bir program bandı ve bir veri bandı vardır. Program bandı, veri bandı boşalıncaya kadar aşağıdaki gibi döngüsel olarak yorumlanır:

  • 0: ilk biti veri bandından sil.
  • 1x: veri bandının ilk biti 1 ise, veri bandına biti ekleyin x.

Veri kasetini 1 ve ardından iki giriş bitiyle başlatırız (veri gerekli olduğunda 0'lardan oluşuyorsa 1 oluşturmanın bir yolu yoktur çünkü 1 gereklidir) ve son silinen veri bitini geçit çıktısı olarak kullanırız. .

  • 0,0,0,0 ( false):001
  • 0,0,0,1 ( and):1001001
  • 0,0,1,0 ( A and not B):0110100
  • 0,0,1,1 ( A):1001
  • 0,1,0,0 ( not A and B):0100
  • 0,1,0,1 ( B):0
  • 0,1,1,0 ( xor):0110110010
  • 0,1,1,1 ( or):0110
  • 1,0,0,0 ( nor):1101001000
  • 1,0,0,1 ( xnor):110101001100
  • 1,0,1,0 ( not B):1100100
  • 1,0,1,1 ( B implies A):110101101000
  • 1,1,0,0 ( not A):11010000
  • 1,1,0,1 ( A implies B):11010011001
  • 1,1,1,0 ( nand):10110100100010
  • 1,1,1,1 ( true):1100

Tebrikler!
Sızdıran Rahibe,

Sondaki mı 1üzerinde falsegerekli?
Hesap MakinesiFeline

@CalculatorFeline Evet, 0en son silinebilmesi için kasete bir a eklemeliyiz .
Anders Kaseorg

Ah. + Ambalajını unuttum. Zeki!
CalculatorFeline

20

Python 2, 137 bayt

[].sort
min
int.__rshift__
round
range
{}.get
cmp
max
lambda a,b:a<1>b
lambda a,b:a==b
lambda a,b:b<1
pow
{0:1,1:0}.get
{0:1}.get
lambda a,b:a+b<2
slice

Gibi min(True,False)(veya as min(1,0)) girişleri alır . Yalnızca doğru Truthy-Falsey değerine ihtiyaç duyan çıktıların ağır avantajlarından yararlanır. Mümkün olduğunda, masrafları önlemek için dahili kullanır lambda. İşe yarayan bileşenleri aramak için kod kullandım.

En sevdiğim {0:1}.get, elle düşündüğüm. Sözlük {0:1}, anahtarı 0değere eşler 1. Onun getyöntemi tuşuna veya böyle bir anahtar varsa varsayılan eşleşen değerin çıkış, bir anahtar ve bir varsayılan sürer. Yani, çıkış a tek yolu 0gibidir {0:1}.get(1,0)anahtar eksik olan, 1ve varsayılan 0. Biri farklı sözlüklere sahip başka değişkenler bulabilir, ancak yalnızca bu en kısaydı.

built_in_names = list(__builtins__) 

object_names = ["int","(0)","(1)"] + \
["True","False","0L","1L","0j","1j"] + \
["str", "''", "'0'","'1'","'a'"] + \
["list", "[]", "[0]", "[1]","['']","[[]]","[{}]"] + \
["set","set()","{0}","{1}","{''}"] + \
["dict","{}","{0:0}","{0:1}","{1:0}","{1:1}","{0:0,1:0}", "{0:0,1:1}","{0:1,1:0}","{0:1,1:1}"] + \
["id"]

object_method_names = [object_name+"."+method_name 
for object_name in object_names 
for method_name in dir(eval(object_name))]

additional_func_names = [
"lambda a,b:0",
"lambda a,b:1",
"lambda a,b:a",
"lambda a,b:b",
"lambda a,b:b<1",
"lambda a,b:a<1",
"lambda a,b:a+b",
"lambda a,b:a*b",
"lambda a,b:a==b",
"lambda a,b:a-b",
"lambda a,b:a<=b",
"lambda a,b:a>=b", 
"lambda a,b:a>b", 
"lambda a,b:a<b", 
"lambda a,b:a<1>b", 
"lambda a,b:a+b<2"]

func_names = built_in_names + object_method_names + additional_func_names

t=True
f=False

cases = [(f,f),(f,t),(t,f),(t,t)]

def signature(func):
    table = [bool(func(x,y)) for x,y in cases]
    table_string = ''.join([str(int(val)) for val in table])
    return table_string

d={}

for func_name in func_names:
    try:
        func = eval(func_name) 
        result = signature(func)
        if result not in d or len(func_name)<len(d[result]):
            d[result]=func_name
    except:
        pass

total_length = sum(len(func) for sig,func in d.items())

print total_length
print

for sig in sorted(d):
    print d[sig]

Eğer int yıllardan gibi yerleşik ins yöntemlerini kullanılamaz __lt__veya __eq__? Bunlar ayrıca bayt sayısını azaltacaktır: int.__gt__yerine lambda a,b:b<1, int.__eq__yerine lambda a,b:a==bve benzeri
Gábor Fekete

@ GáborFekete Bunlar Python 2'de mevcut değil, çünkü intyük boşaltma ile karşılaştırılıyor cmp. Bunu Python 3 için denemedim.
xnor

Oh şimdi görüyorum!
Gábor Fekete

İşlevini kullanarak 4 bayt kaydet notiçin 0001, False- ideone
Jonathan Allan

1
@JonathanAllan Bu zekice, ancak bunun notbir işlevin gereksinimlerini karşılamadığını düşünüyorum çünkü yapamazsınız f=not;f(3,4). Belirtilen notişlev argümanları , bir girdi olarak alabilecek bir işlev olmasa da 3+çalışacağı gibi , bir dize gibi göründüğü için dize çalışmaya başlar . 3+(4)3+4
xnor

20

Go (oyun), 33 taş, 73 kavşak

Domino ve satranç kabul edilebilirse, o zaman bu. 19x19 Go tahtasında tam bir golf sahası olamaz. Bu yüzden küçük dikdörtgen panolar kullandım. Giriş, 1 ve 2 ile işaretlenmiş taşların mevcut olup olmadığıdır. Çıktı siyah kazanır mı. Alan puanlaması, 0.5 komi, durumsal süperko kullanır, intihar etmez. Oynamak için tamamen siyah. Bazı çoklu çözümler verilir.

Beyaz kazanır (2, 1x5):

➊━━━➋

1 ve 2 (3, 2x3):

➊◯➋
┗┷┛

1 ve 2 değil (2, 1x5):

╺➊━➁╸

1 (2, 1x5):

╺➊➁━╸ 
╺➊━━➁
➀━➁━╸

1 ve 2 değil (2, 1x5):

╺➋━➀╸

2 (2, 1x5):

╺➋➀━╸

1 x 2 (2, 2x3):

➀┯➁
┗┷┛

1 veya 2 (2, 1x5):

╺➊━➋╸
➀━━━➁

1 veya 2 (2, 1x4):

➊━━➋
╺➀➁╸

1 = 2 (2, 1x7):

╺━➀━➁━╸

2 (2, 1x3):

➀➁╸

1 veya 2 (2, 1x4):

➀➁━╸
➀━➁╸
╺➊➁╸
➋➊━╸
➋━➊╸

1 değil (2, 1x3)

➁➀╸

1 veya 2 değil (2, 1x4):

➁➀━╸

1 ve 2 (2, 1x3):

➊━➋

Siyah kazanır (2, 1x3):

➊➋╸
➀━➁
➊━➁

Bu sayfa bana biraz yardımcı oldu: http://www.mathpuzzle.com/go.html

Belki biri 1x9'luk bir tahtada 1 ve 2'ye 2 taş çözümü bulabilirdi ...


1
İntihar için kurallarınız neler? İzin verilmeyen? Ve bir taraf bütün tahtayı doldurduğunda ne olur? Bu intihar sayılır mı?
Martin Ender

@MartinEnder İzin Verilmedi. Ve evet, bu intihar sayılır.
jimmy23013

1x7 çözümü yanlış görünüyordu. Düzeltmeye çalışıyorum ...
jimmy23013

15

Javascript ES6, 124 bayt

a=>0
Math.min
parseInt
a=>a
a=>b=>a<b
a=>b=>b
a=>b=>a^b
Math.max
a=>b=>~a&~b
a=>b=>a==b
a=>b=>~b
Math.pow
a=>~a
a=>b=>a<=b
a=>b=>~a|~b
a=>1

Şu an lambdalardan cidden nefret ediyorum.


1
Bazı programlar ve bazı fonksiyonlarını yazmak için izin var ise ... Ben değiştirmek düşünüyorum a=>b=>0için a=>0ve onu çağıran dilbilgisi olduğunu söylemek (a=>0)(a,b)sadece bu 4 girişleri için.
jimmy23013

Ah evet, teşekkürler!
Mama Fun Roll

2
Math.minyerine a=>b=>a&b. Math.maxyerine a=>b=>a|b. Math.powyerine a=>b=>a>=b.
Conor O'Brien,

1
Ayrıca, NaN yanlış olduğundan, parseIntbunun yerine yapabilirsiniz a=>b=>a>b.
Conor O'Brien,

1
@algmyr !NaN=> true, !!NaN=>false
Mama Fun Roll

14

Retina , 62 39 bayt

@ Martininder sayesinde 23 byte !

0000 false              1 byte : 2
0001 p and q            2 bytes: 11
0010 p and not q        2 bytes: 10
0011 p                  2 bytes: ^1
0100 not p and q        2 bytes: 01
0101 q                  2 bytes: 1$
0110 xor                5 bytes: 01|10
0111 p or q             1 byte : 1
1000 not p and not q    2 bytes: 00
1001 xnor               5 bytes: (.)\1
1010 not q              2 bytes: 0$
1011 p or not q         5 bytes: ^1|0$
1100 not p              2 bytes: ^0
1101 not p or q         5 bytes: ^0|1$
1110 not p or not q     1 byte : 0
1111 true               0 bytes: 

Girişi olarak alır PQ.

Arasında bir tamsayıyı çıktılar 0için 3. 0falsey, diğerleri ise hakikaten.

açıklama

Hepsi sadece regexes .

Örneğin, 01|10sadece 01veya ile eşleşir 10.

In 0000, 2asla girişe girmeyecek, bu yüzden asla eşleşmeyecek.

İçinde 1111, boş olan dize ile eşleşir 4.


^1|0$sadece 1 karakter dizesiyle eşleşmelidir. Burada neler oluyor?
CalculatorFeline

@CalculatorFeline [Girişin 1başında] VEYA [ 0girişin sonunda ] ile eşleşir . Ben de onu almak için bir dakika
sürdü

Öncelik, beyler ....
Sızdıran Rahibe,

Sanırım ^1|0$okumaktan daha zor 1.|.0.
Toplamda

10

Yığın Kedileri , 67 + 64 = 131 bayt

+64'ün -nmbayrakları her programa uygulamak olduğunu unutmayın . -nsayısal G / Ç'yi gösterir ve -mkaynak kodu son karakter boyunca yansıtır - tüm gönderimler teknik olarak bu bayraklara ihtiyaç duymaz, ancak tutarlılık ve basitlik için hepsini aynı şekilde puanlarım.

-2 -2 -3 -3     !I                0 0 0 0     <I!+
-4 -4 -4  1     |!T*I             0 0 0 1     [>I=I_
-4 -4  3 -2     *I*_              0 0 1 0     :I*=I:
-2 -2  3  3     T*I               0 0 1 1     [<!>X
-2  1 -2 -2     _*T*I             0 1 0 0     *|!TI:
-2  1 -3  1     !-|_I             0 1 0 1     <!I!>X
-2  3  3 -2     ^T*I              0 1 1 0     ^:]<_I
-2  3  3  3     -_T*I             0 1 1 1     *I<-I!
 2 -3 -3 -3     -*|_I             1 0 0 0     ^{!:}I_
 2 -3 -3  2     _|*I              1 0 0 1     _|[<I!:
 1 -2  1 -2     :]I*:             1 0 1 0     _!:|]X
 1 -2  1  1     *I\<X             1 0 1 1     *>I>!I
 2  2 -3 -3     -*I               1 1 0 0     I^:!
 2  2 -3  2     _*I_              1 1 0 1     |I|^:!
 1  2  2 -1     |!:^I             1 1 1 0     -I*<*I
 1  1  1  1     *<X               1 1 1 1     +I+

()Stack Cats'te bir elementin pozitif veya pozitif olmadığını (yani 0 veya negatif) kontrol eder, bu yüzden sırasıyla truthy / falsy için kullanıyoruz. İkinci sütun sadece ilgi içindir ve çıktı olarak 0/ 1s ile en iyi kapıları listeler (toplam puan 90).

Giriş, STDIN aracılığıyla sınırlayıcıyla ayrılmış bitlerdir. Çevrimiçi deneyin!


Stack Cats, programların yansıtıcı simetriye sahip olduğu geri dönüşümlü bir ezoterik dildir. Bir snippet f(örneğin >[[(!-)/) verildiğinde , ayna görüntüsü (örn. \(-!)]]<) Tersini hesaplar f^-1. Dolayısıyla, uzunluk programları bile hiçbir şey yapmaz (veya sonsuz bir döngüde sıkışıp kalır) ve önemsiz olmayan tek programların merkez operatörün f g f^-1nerede golduğunu hesaplamak için tuhaf bir uzunluğu vardır .

Kaynak kodun yarısı her zaman gereksiz olduğundan, bırakılabilir ve kodun -mbayrakla çalıştırılması , kaynak kodun asıl kaynak kodunu almak için son karakterin üzerine yansıtılması gerektiğini gösterir. Örneğin, program *<Xaslında *<X>*simetriktir.

Stack Cats'de golf oynamak son derece sezgisel değildir, bu yüzden yukarıdaki programları kaba kuvvetle bulmak zorunda kaldı. Bunların çoğu şaşırtıcı derecede karmaşık, ancak birkaçını açıklayacağım ve zamanım olduğunda bu cevabı ekleyeceğim. Şimdilik, 0/ 1sürümleri için bazı açıklamalar ve alternatif çözümler burada Github deposunda bulunabilir .


1
Note that the +64 is from applying the -nm flags to each program.3 * 16 = 48 veya 2 * 16 = 32, her iki şekilde de 64, hai
cat

@Katlar Boşlukları saymanız gerektiğinden bayraklar program başına 4'dür.
FryAmTheEggman


Bir yıldan fazla oldu. Henüz vaktin var mı?
CalculatorFeline

8

Haskell, 78 76 75 bayt

  1. _#_=2<1
  2. &&
  3. >
  4. pure
  5. <
  6. _#b=b
  7. /=
  8. ||
  9. (not.).max
  10. ==
  11. _#b=not b
  12. >=
  13. a#_=not a
  14. <=
  15. (not.).min
  16. _#_=1<2

Düzenleme: @cole sayesinde -1 bayt.


Ben sadece "ahbap, _#_standart bir operatör değil!" Ve sonra farkettim ... Aferin.
MathematicalOrchid

4 olabilirpure
cole,

@cole: Teşekkürler. Vay, 2015 yılında geri puretanıtıldı Prelude, bu yüzden bu meydan okuma zamanında mevcuttu.
nimi

6

Brachylog , 36 34 bayt

0000 false              \     Backtrack (always false)
0001 p and q            1.    Unify input and output with 1
0010 p and not q        >.    Input > Output
0011 p                  1     Unify input with 1
0100 not p and q        <.    Input < Output
0101 q                  ,1.   Unify output with 1
0110 xor                '.    Input and output cannot unify
0111 p or q             1;1.  Unify input with 1 or unify output with 1
1000 not p and not q    0.    Unify input and output with 0
1001 eq                 .     Unify input with output
1010 not q              ,0.   Unify output with 0
1011 p or not q         >=.   Input >= Output
1100 not p              0     Unify input with 0
1101 not p or q         <=.   Input <= Output
1110 not p or not q     0;0.  Unify input with 0 or unify output with 0
1111 true                     Empty program (always true)

Bu 0, sahte değer ve 1gerçeğe uygun değer olarak beklemektedir. trueVeya döndürür false. p Inputve q Output.


Çıktıyı nasıl girersiniz?
Sızdıran Rahibe,

1
@LeakyNun Sadece giriş gibi. Sorguladığınız ana yüklemede, adında Inputve Outputkurallara göre iki argüman vardır , ancak değerleri her ikisine de ayarlayabilir veya her ikisinden de değerleri döndürebilirsiniz.
16'da

1
Bu iş için doğru araçtır: P
Conor O'Brien

6

Prolog, 147 145 bayt

@SQB sayesinde 2 bayt kazandı

a(a,a).       % 0000 false
b(1,1).       % 0001 P and Q
c(1,0).       % 0010 P and not Q
d(1,_).       % 0011 P
e(0,1).       % 0100 not P and Q
f(_,1).       % 0101 Q
g(P,Q):-P\=Q. % 0110 P xor Q
h(1,_).       % 0111 P or Q
h(0,1).
i(0,0).       % 1000 not P and not Q
j(P,P).       % 1001 P == Q                 
k(_,0).       % 1010 not Q
m(P,Q):-P>=Q. % 1011 P or not Q
n(0,_).       % 1100 not P              
r(P,Q):-P=<Q. % 1101 not P or Q         
s(0,_).       % 1110 not P or not Q
s(1,0).
t(_,_).       % 1111 true

Sorgu x(P,Q).ile xuygun harf ve varlık Pve Q0 yada 1 olarak ayarlanmış
İade trueveya false.

Testler dahil olmak üzere SWISH örneği - runTest.çalıştırmak için girin .


Yanlışı destekliyor mu a(2,2).?
jimmy23013

@ jimmy23013 2'nin sahte olduğunu varsayarsam yapabilirim. Kabul edilebilir olup olmadığından emin değilim.
16'da

@ jimmy23013 Aslında, a(a,a).(veya başka bir harf) de çalışır ve adoğruluk için kabul edilebilir bir girdi değildir, bu yüzden bu iyidir. Önerin için teşekkürler.
16'da

6

NTFJ, 86 bayt

0000 false              ~
0001 p and q            |:|
0010 p and not q        :||:|
0011 p                  $
0100 not p and q        #{:||:|
0101 q                  #{$
0110 xor                :#{:#{:||#}:|||
0111 p or q             :|#{:||
1000 not p and not q    :|#{:||:|
1001 eq                 :#{:#{:||#}:|||:|
1010 not q              #{$:|
1011 p or not q         #{:||
1100 not p              $:|
1101 not p or q         :||
1110 not p or not q     |
1111 true               #

Burada dene! Ama önce aşağıda oku.

Girdi, yığında gizlidir. Sonuç yığında bırakılır. (Bir 16 bayt ekleme *istediğiniz eğer her sonuna kadar) 0x00ya da 0x01bir istiyorum 0 ve 1 ek 160 bayt ekleme temsil çıkışına 0veya 1basılmış. ( ~~##~~~#{@Her birinin önüne koyun *.)

NTFJ'nin tek ikili operatörü NAND, yani bunların her biri NAND formunda yazılmıştır.

Her birinden geçelim.

0: yanlış

~

~sahte biti temsil eder. Yeterince basit. Girdi yığının dibinde gizli olduğundan, bu, üst kısmında kalır.

1: p ve q

|:|

NTFJ bir yığın üzerinde çalışır. :yinelenen komut. Bunu p and qnot (p nand q)ve buna dikkat edin not q = q nand q.

Command | Stack
        | p q
   |    | (p nand q)
   :    | (p nand q) (p nand q)
   |    | (p nand q) nand (p nand q)
        | => not (p nand q)
        | => p and q

(Not, daha sonra, :|olduğu söylenebilir olumsuzluk ve |:|olduğu söylenebilir birlikte )

2: p ve q değil

:||:|

Bunun sadece bir olumsuzluk :|ve bir birleşme olduğunu gözlemleyin |:|.

Command | Stack
        | p q
  :|    | p (not q)
  |:|   | p and (not q)

3: p

$

$yığından bir öğe çıkar. Yani evet.

4: p ve q değil

#{:||:|

Bu, #{başlangıç hariç, 2 ile aynı şeydir . #1 (gerçek bit) iter ve {yığını bir kez sola döndürür. Yeterince basit.

5: q

#{$

Bir kez sola döndürün, bırakın.

6: xor

:#{:#{:||#}:|||

Gözlemek:

p xor q = (p and (not q)) or ((not p) and q)                ; by experimentation (trust me)
        = (not ((not p) nand q)) or (not (p nand (not q)))  ; by definition of nand
        = not (((not p) nand q) and (p nand (not q)))       ; by De Morgan's laws
        = ((not p) nand q) nand (p nand (not q))            ; by definition of nand

Ancak, yığını tamamen çoğaltmanın bir yolu yoktur. Yani, biz her getirmek zorunda gidiyoruz p, qüstüne ve çoğaltın.

Command | Stack
        | p q
   :    | p q q
  #{    | q q p
   :    | q q p p
  #{    | q p p q
  :|    | q p p (not q)
   |    | q p (p nand (not q))
  #}    | (p nand (not q)) q p
  :|    | (p nand (not q)) q (not p)
   |    | (p nand (not q)) (q nand (not p))
   |    | (p nand (not q)) nand (q nand (not p))

Ve böylece, xorumuz var.

7: p veya q

:|#{:||

Üstünü al, altını üste al, bunu yap ve onları bir arada kullan Temel olarak p or q = (not p) nand (not q),.

8: p değil ve q

:|#{:||:|

Bu sadece 7 ihmalidir. Kolay.

9: eq

:#{:#{:||#}:|||:|

Bu sadece bir XNOR , ya da değil xor. Tekrar basit.

10: q değil

#{$:|

5'in Olumsuzluğu.

11: p veya değil q

#{:||

P, n. (not p) nand q = not ((not p) and q) = p or (not q) (by De Morgan's laws).

12: p değil

$:|

Bırak, dur ve reddet.

13: p veya q değil

:||

De Morgan'ın yine günü kurtarmak için yasaları! 11 ile aynı süreç, qyerine sadece olumsuzlama p.

14: p değil ya da q

|

Bu sadece bir taklit numara.

15: doğru

#

# gerçek biti.


sadece neden ...> _>
Rɪᴋᴇʀ

tam olarak nasıl çalıştığını idk ama çok güzel görünüyor +1
Downgoat

Neden 5 sadece boş bir program değil, 10 da sadece :|?
Joffan

6

Minecraft, 89 blok

Aşağıdaki fotoğrafların hepsinde mavi bloklar A Girişine, turuncu bloklar B Girişine

16. DOĞRU geçit - 1 blok

görüntü tanımını buraya girin

15. NAND geçidi - 1x2x3 = 6 blok

görüntü tanımını buraya girin

14. A => B - 1x2x3 = 6 blokgörüntü tanımını buraya girin

13. A - 2 blok değil görüntü tanımını buraya girin

12. B => A - 1x2x3 = 6 blokgörüntü tanımını buraya girin

11. B - 2 blok değil görüntü tanımını buraya girin

10. XNOR - 1x3x4 = 12 blok görüntü tanımını buraya girin

9. NOR - 1x2x3 = 6 blokgörüntü tanımını buraya girin

8. VEYA - 1 blok görüntü tanımını buraya girin

7. XOR - 1x3x4 = 12 blok görüntü tanımını buraya girin

6. B - 1 blok görüntü tanımını buraya girin

5.! A&B - 1x2x5 = 10 blok görüntü tanımını buraya girin

4. A - 1 blok görüntü tanımını buraya girin

3. A &! B - 1x2x5 = 10 blok görüntü tanımını buraya girin

2. VE - 2x2x3 = 12 blok görüntü tanımını buraya girin

1. YANLIŞ - 1 blok görüntü tanımını buraya girin


2
Sondan ikinci görüntüde (AND), torçları blokların arkasına, yani kolların karşısına yerleştirerek 6 bloktan tasarruf edebilirsiniz. Torcu ortada bir toz parçası için değiştirin ve üstündeki tozu temizleyerek 1x2x3 = 6 bloğa indirin.
Luca H

5

Mathematica, 67 bayt

0>1&
And
#&&!#2&
#&
!#&&#2&
#2&
Xor
Or
Nor
Xnor
!#2&
#||!#2&
!#&
!#||#2&
Nand
1>0&

Bunların her biri bir işlevi değerlendirir, böylece onları gibi kullanabilirsiniz.

#&&!#2&[True, False]
Xor[True, False]

Ah, eğer matematikte sadece tamsayılar truthy / falsy olsaydı, bu dört daha uzun olanları önemli ölçüde kısaltılabilirdi.


Eğer tamsayılar truthy / falsey değilse, onları bir if ifadesine koyduğunuzda ne olur?
Conor O'Brien,

3
@ CᴏɴᴏʀO'Bʀɪᴇɴ değeri değişmeden kalır.
Martin Ender,

5

MATL, 34 23 bayt

Umarım emirleri alırım! Sıfır, falsey, sıfır olmayan, hakikaten. Her fonksiyon iki örtülü giriş alır (bazı girişleri göz ardı etmesine rağmen). İlk giriş A, ikincisi B'dir. 0/ 1For true / false veya T/ girebilirsiniz F.

İşte test durumu 3 için bir TryItOnline örneği.

Kullanarak 4 bayt Kaydedilen *için andkullanarak başka 4 ve >/ <yerine ~wY&/ w~Y&I Dennis'in cevabı gördükten sonra!

1.  0,0,0,0 0 (ignores input, just returns a zero)
2.  0,0,0,1 * (and)
3.  0,0,1,0 < (not-A and B)
4.  0,0,1,1 D (A)
5.  0,1,0,0 > (not-B and A)
6.  0,1,0,1 xD (discard A, display B)
7.  0,1,1,0 Y~ (xor)
8.  0,1,1,1 + (or)
9.  1,0,0,0 +~ (not-or)
10. 1,0,0,1 = (A=B)
11. 1,0,1,0 x~ (not-B)
12. 1,0,1,1 <~ (not-B or A)
13. 1,1,0,0 ~ (not-A)
14. 1,1,0,1 ~+ (not-A or B)
15. 1,1,1,0 *~ (not(A and B))
16. 1,1,1,1 1 (just returns 1)

10
Altı numara bunun komik olduğunu düşünüyor.
Conor O'Brien,

@ CᴏɴᴏʀO'Bʀɪᴇɴ 6 Numara en iyisidir, ben de 12 numarayı seviyorum! xD!
David,

"Eşitsiz" işlevine sahip değil misiniz?
Sızdıran Rahibe

Hayır (En azından öyle düşünmüyorum)
David,

2
@David Ben 7 sayısının yerini alabileceğini düşünüyorum-
Luis Mendo

5

dc, 37 bayt

dc("masa hesap makinesi") standart bir unix komutudur, yığın tabanlı bir postfix hesaplayıcısıdır. Bit işlemlerinden yoksundur ve karşılaştırma işleçleri yalnızca (bayt değerinde olmayan) makroları çalıştırmak için kullanılabilir. Tamsayılı bölme bunun bir kısmını oluşturur.

Bu komut dosyaları yığında bekler 0ve 1değerler ve sonucu yığında bırakırlar.

0,0,0,0 (false)              0
0,0,0,1 (and)                *         a*b
0,0,1,0                      -1+2/     (a-b+1)/2
0,0,1,1 (A)                  r         reverse a, b: a now on top
0,1,0,0                      -1-2/     (a-b-1)/2
0,1,0,1 (B)                            (0 bytes) do nothing: b on top
0,1,1,0 (xor)                -         a-b
0,1,1,1 (or)                 +         a+b                  
1,0,0,0 (nor)                +v1-      sqrt(a+b) -1
1,0,0,1 (xnor)               +1-       a+b-1
1,0,1,0 (not B)              1-        b-1
1,0,1,1 (if B then A)        -1+       a-b+1
1,1,0,0 (not A)              r1-       a-1
1,1,0,1 (if A then B)        -1-       a-b-1            
1,1,1,0 (nand)               *1-       a*b - 1
1,1,1,1 (true)               1

5

Labirent , 85 bayt

2 bayt tasarrufu için Sp3000'e teşekkürler.

!@
??&!@
??~&!@
?!@
?~?&!@
??!@
??$!@
??|!@
??|#$!@
??$#$!@
?#?$!@
?#?$|!@
?#$!@
?#$?|!@
??&#$!@
1!@

Bunların tümü tam programlardır, iki tam sayı 0veya 1STDIN'den (herhangi bir rakam içermeyen ayırıcı kullanarak) okuma ve sonucu STDOUT olarak 0veya yazdırma 1.

Çevrimiçi deneyin! (Test paketi değil, bu nedenle farklı programları ve girişleri manuel olarak denemeniz gerekir.)

Açıklamalara gelince, bunlar oldukça basit. Tüm programlar doğrusaldır ve kullanımdaki komutlar aşağıdakileri yapar:

?   Read integer from STDIN and push.
!   Pop integer and write to STDOUT.
@   Terminate program.
&   Bitwise AND of top two stack items.
|   Bitwise OR of top two stack items.
$   Bitwise XOR of top two stack items.
~   Bitwise NOT of top stack item.
#   Push stack depth (which is always 1 when I use it in the above programs).
1   On an empty stack, this pushes 1.

Kullanıyorum #her zaman onu birleştirmek için $, yani hesaplamak için XOR 1veya başka bir deyişle mantıksal olumsuzlama için kullanılır. Sadece birkaç durumda kullanabildim ~, çünkü daha sonra gelen &tüm istenmeyen bitleri sonuçtan atar -1ya da -2.


5

IA-32 makine kodu, 63 bayt

Sökme işlemiyle birlikte kodun Hexdump değeri:

0000  33 c0     xor eax, eax;
      c3        ret;

0001  91        xchg eax, ecx;
      23 c2     and eax, edx;
      c3        ret;

0010  3b d1     cmp edx, ecx;
      d6        _emit 0xd6;
      c3        ret;

0011  91        xchg eax, ecx;
      c3        ret;

0100  3b ca     cmp ecx, edx;
      d6        _emit 0xd6;
      c3        ret;

0101  92        xchg eax, edx;
      c3        ret;

0110  91        xchg eax, ecx;
      33 c2     xor eax, edx;
      c3        ret;

0111  8d 04 11  lea eax, [ecx + edx];
      c3        ret;

1000  91        xchg eax, ecx; // code provided by l4m2
      09 d0     or eax, edx;
      48        dec eax;
      c3        ret;

1001  3b ca     cmp ecx, edx;
      0f 94 c0  sete al;
      c3        ret;

1010  92        xchg eax, edx;
      48        dec eax;
      c3        ret;

1011  39 d1     cmp ecx, edx; // code provided by l4m2
      d6        _emit 0xd6;
      40        inc aex;
      c3        ret;

1100  91        xchg eax, ecx;
      48        dec eax;
      c3        ret;

1101  3b d1     cmp edx, ecx; // code inspired by l4m2
      d6        _emit 0xd6;
      40        inc aex;
      c3        ret;

1110  8d 44 11 fe   lea eax, [ecx+edx-2] // code provided by l4m2
      c3        ret;

1111  91        xchg eax, ecx;
      40        inc eax;
      c3        ret;

Kod, olabileceğinden daha uzun, çünkü standart bir kodlama kuralı kullanıyor: input in ecxand edx, ve output in al. Bu, C olarak ifade edilebilir.

unsigned char __fastcall func(int, int);

Görünen o ki, MS Visual Studio belgelenmemiş SALCopcode'u anlamıyor , bu yüzden ismini yerine kodunu kullanmak zorunda kaldım.

Teşekkürler l4m2 kod örnekleri bazı iyileştirilmesi için!


1
1110 8D4411FE LEA EAX, [ECX+EDX-2]
18m2'de

5

C 34 bayt

#define g(n,a,b)((n-1)>>3-b-2*a)&1

Kullanılacak işlev numarası n'dir, ancak reddedileceğini düşünüyorum, bu yüzden diğerini öneriyorum:

C 244 bayt (bellek kullanarak)

typedef int z[2][2];
z a={0,0,0,0};
z b={0,0,0,1};
z c={0,0,1,0};
z d={0,0,1,1};
z e={0,1,0,0};
z f={0,1,0,1};
z g={0,1,1,0};
z h={0,1,1,1};
z i={1,0,0,0};
z j={1,0,0,1};
z k={1,0,1,0};
z l={1,0,1,1};
z m={1,1,0,0};
z n={1,1,0,1};
z o={1,1,1,0};
z p={1,1,1,1};

çift ​​dizinli dizi kullanır. n[0][1]dır-dir(A implies B)(0,1)

İleri 138 bayt

Daha yeni Forth öğrendim. Sanırım aynı zamanda Ansi Forth ile de uyumlu.

: z create dup , 1+ does> @ -rot 3 swap - swap 2* - rshift 1 and ; 
0 
z a z b z c z d z e z f z g z h z i z j z k z l z m z n z o z p 
drop

Z işlevi, verilen adla yeni bir işlev oluşturur ve ardından mantık geçidi numarasını yığının en üstünden yeni işlev adresine koyun. Bir sonraki (n + 1) mantık geçidi işlevini, sonraki bildirim için yığında bırakır.

test edebilirsiniz:
AB

0 0 b . cr 
0 1 b . cr
1 0 b . cr 
1 1 b . cr   

("." yığının en üstündeki "cr", satır başı döndürmedir)


Her işlev için yalnızca kod parçacıklarını sağlamanız gerekir.
CalculatorFeline

4

C, 268 bayt

#define c(a,b)0      // 0000 
#define d(a,b)a&b    // 0001 
#define e(a,b)a>b    // 0010 
#define f(a,b)a      // 0011 
#define g(a,b)a<b    // 0100 
#define h(a,b)b      // 0101 
#define i(a,b)a^b    // 0110 
#define j(a,b)a|b    // 0111 
#define k(a,b)!b>a   // 1000 
#define l(a,b)a==b   // 1001 
#define m(a,b)!b     // 1010 
#define n(a,b)!b|a   // 1011 
#define o(a,b)!a     // 1100 
#define p(a,b)!a|b   // 1101 
#define q(a,b)!b|!a  // 1110 
#define r(a,b)1      // 1111 

Makrolar işlevlerden daha kısa görünüyor.


4

Brian ve Chuck , 183 bayt

4 byte tasarruf için Sp3000 sayesinde.

Programların bazıları yazdırılamaz bir karakter içeriyor. Özellikle, her \x01biri <SOH>(0x01) kontrol karakteriyle değiştirilmelidir:

0000
?
#>.
0001
,-?,-?>?\x01
#}>.
0010
,-?,?>?\x01
#}>.
0011
,?\x01+?
#>.
0100
,?,-?>?\x01
#}>.
0101
,,?\x01+?
#>.
0110
,?>},?>?_\x01
#}+{>?_}>.
0111
,\x01?,?>?
#{>.
1000
,?,?>?\x01
#}>.
1001
,-?>},?>?_\x01
#}+{>>?_}>.
1010
,,-?\x01+?
#>.
1011
,\x01?,-?>?
#{>.
1100
,-?\x01+?
#>.
1101
,\x01-?,?>?
#{>.
1110
,\x01-?,-?>?
#{>.
1111
?
#>+.

Giriş ve çıkış bayt değerlerini kullanır , bu nedenle giriş iki 0x00 veya 0x01 bayt (ayırıcı olmadan) olmalı ve çıkış böyle bir bayt olacaktır. Bu aslında B&C için en doğru tanımlayıcı truthy / falsy tanımıdır çünkü tek kontrol akış komutu ?, sıfırları sahte ve diğer her şey truthy olarak kabul eder.

açıklamalar

İlk önce hızlı bir B&C astarı:

  • Her program, her biri kendi satırında yazılmış iki Brainfuck benzeri örnekten oluşur. İlki Brian , ikincisi Chuck diyoruz . İcra Brian'da başlıyor.
  • Her programın bandı, diğer programın kaynak kodudur ve her programın komut göstericisi, diğer programın bant başlığıdır.
  • ,(İnput byte) komutunu sadece Brian kullanabilir ve .(output byte) komutunu sadece Chuck kullanabilir .
  • Brainfuck'ın []döngüsü mevcut değil. Bunun yerine, sahip olduğunuz tek kontrol akışı ?, teyp başının altındaki geçerli değerin kontrolünü diğer örneğe geçiren anahtardır.
  • İlave olarak >ve <, var {ve }esas Brainfuck parçacıkları eşdeğerdir [<]ve [>]o yönde bir sonraki sıfır konumuna bant kafasını hareket, yani. Asıl fark, {hangi değere sahip olursa olsun, bandın sol ucunda da durdurulabilmesidir.
  • Kolaylık sağlamak için, _kaynak koddaki herhangi bir değer null baytla değiştirilir (bunlar önemsiz programlarda yakalamak {ve yakalamak için çok faydalıdır }).

Tüm programlarda Chuck'ın kasetinin a ile başladığını unutmayın #. Bu gerçekten bir şey olabilir. ?Çalıştırmaya başlamadan önce teyp başının bir hücreyi hareket ettireceği şekilde çalışır (böylece geçerli bir komut olması durumunda koşulun kendisi çalıştırılmaz). Bu yüzden ilk Chuck Chuck hücresini kod olarak kullanamayız.

Daha sonra detaylı olarak anlatacağım beş program sınıfı var. Şimdilik onları artan karmaşıklık sırasına göre listeliyorum.

0000, 1111: Sabit fonksiyonlar

?
#>.
?
#>+.

Bunlar çok basit. Koşulsuz olarak Chuck'a geçiyoruz. Chuck, bant kafasını kullanılmayan hücreye sağa kaydırır ve doğrudan yazdırır ya da ilk önce yazdırmak için artırır 1.

0011, 0101, 1010, 1100: Fonksiyonlar sadece bir girişe bağlı olarak

,?\x01+?
#>.
,,?\x01+?
#>.
,,-?\x01+?
#>.
,-?\x01+?
#>.

Ki ile başlayan olmasına bağlı olarak ,ya ,,Birlikte çalıştığımız Aya B. İlk örneğe bakalım 0011(örn. A). Değeri okuduktan sonra ?, bu değere bağlı olarak kullanırız. Eğer A = 1öyleyse, bu durum kaset kafasını sağa hareket ettiren ve kelimenin tam anlamıyla gömülü- 1bayt'ı basan Chuck'a geçer . Aksi halde kontrol Brian'da kalır. Burada, 1 bayt no-op. Sonra +sıfır olmadığından emin olmak için girişi iyi yükseltiriz ve sonra Chuck'a geçeriz ?. Bu kez, >kullanılmayan bir hücreye sağa doğru hareket ettirilir ve ardından olarak yazdırılır 0.

Değerlerden birini reddetmek için basitçe onu azaltırız -. Bu döner 1içine 0ve 0içine -1kadar sıfır olmayan ve dolayısıyla truthy olan ?ilgilidir.

0001, 0010, 0100, 1000: Tek truthy sonuçla İkili fonksiyonlar

,-?,-?>?\x01
#}>.
,-?,?>?\x01
#}>.
,?,-?>?\x01
#}>.
,?,?>?\x01
#}>.

Bu, iki girdiyle çalışmak için önceki fikrin bir uzantısıdır. 1000(NOR) örneğine bakalım . Her iki girişi de (potansiyel olarak) okuyoruz ,?. Bunlardan biri ise 1, ?Chuck'a geçer. Teyp başını }(Brian'ın kodundan sonra boş hücreye) ile sonuna kadar hareket ettirir, başka bir hücreyi >(hala sıfırla) hareket ettirir ve ile yazdırır ..

Bununla birlikte, her iki giriş de sıfırsa, kontrol hala Brian'dadır. >Daha sonra üzerine bant kafasını hareket }bu komut öyle değil biz Chuck geçtiğinizde idam ?. Şimdi, Chuck'ın yaptığı >.tek şey 1hücreye ilerleyen ve bunu basan şey.

Girdilerin birini veya her ikisini de gerektiği gibi göz ardı ederek diğer üç işlevi kolayca elde edebiliriz.

0111, 1011, 1101, 1110Üç truthy sonuçlarla İkili fonksiyonlar

,\x01?,?>?
#{>.
,\x01?,-?>?
#{>.
,\x01-?,?>?
#{>.
,\x01-?,-?>?
#{>.

Yadsındı için önceki fikrin küçük bir modifikasyonu sonucu (yani yazılı 0biz Brian tamamı ve içinden geçtiğiniz 1aksi). En bakalım 0111bir örnek olarak (OR). Gömülü 1baytın işlem dışı olduğuna dikkat edin , bu nedenle hala başlar ,?,?. Her iki giriş de 1Chuck’a geçer, kim kaset kafasını başa döndürür {. >.şerit kafasını bu 1byte üzerine getirir ve yazdırır.

Her iki giriş de sıfırsa, Brian ile kalırız, {atlamak için bant kafasını hareket ettirin ve sonra Chuck'a geçin. >.Bu sefer idam ettiğinde Brian'ın kodundan sonra boş hücreye geçer ve basar 0.

Yine, bir veya her iki girişi de reddederek diğer işlevleri kolayca elde ederiz.

0110, 1001: İki gerçek sonuç ile ikili fonksiyonlar

,?>},?>?_\x01
#}+{>?_}>.
,-?>},?>?_\x01
#}+{>>?_}>.

Bu biraz daha zor. Önceki fonksiyonlar oldukça basitti çünkü kısa devre yaptırılabilirler - ilk girişin değeri çıkışı belirleyebilir ve eğer değilse, diğer girişe bakarız. Bu iki işlev için daima iki girişe de bakmamız gerekir.

Temel fikir, ikinci giriş arasında seçim karar vermek için ilk girişini kullanmaktır 0ve 1ya arasındaki 1ve 0. En alalım 0110örnek olarak (XOR):

Düşünün A = 0. Bu durumda Bolduğu gibi çıktı almak istiyoruz . ,okur A, ?hiçbir şey yapmaz. >Bir sonraki (sıfır olmayan) hücreye }ilerleyerek bizi _Chuck'a götürür . Burada, okumak Bile ,ve kullanımı ?tekrar. Eğer Boldu 0, hem de bizler hala Brian üzerinde. >Açık }Chuck'ı atlar ve ?böylece Brian'ın kaynak kodundaki katıştırılmış >.yazıları basar 0. Eğer Boldu 1ise Chuck çalıştırıyor }içine hareket ettiği _, böylece zaten Brian'ın kodunda >.sonra yazdırır 1yerine -byte.

Eğer A = 1öyleyse, hemen Chuck’a geçeceğiz, kim idam edecek }+{>?. Ne yapar taşımak olduğunu _bir haline döner, Brian'ın kaynak kodunda 1ile de +daha sonra başlangıcına geri döner, {Brian ve atlar? ile bir hücre sağa hareket ettirerek >ona geri kontrolünü teslim etmeden önce. Brian'ın okuduktan sonra bu kez B, eğer B = 0, ve Chuck kullanır >.Brian'ın yanında hücreyi ?olacak 1yerine 0. Ayrıca, B = 1Chuck }bir boşluk olmak için neyin üstünden atlar ve bantın sonuna kadar ilerler, böylece bunun >.yerine sıfır basılır. Bu şekilde baskı yapıyoruz not B.

Eşitliği sağlamak için, Abir koşul olarak kullanmadan önce bunu olumsuzladık . Bu >nedenle -, başlangıca geri dönerken de bunu atlamak için Chuck'a bir tane daha eklememiz gerektiğini unutmayın .


4

ClojureScript, 88 84 76 74 bayt

nilve falsesahte, diğer tüm değerler hakikaten. Booloslar aritmetik ve eşitsizlikler için 0 / 1'e zorlarlar. İşlevler yanlış sayıda argüman alabilir.

0000   nil?            ; previously: (fn[]nil)
0001   and
0010   <
0011   true?           ; previously: (fn[x]x)
0100   >
0101   (fn[x y]y)
0110   not=
0111   or
1000   #(= 0(+ % %2))
1001   =
1010   #(not %2)
1011   <=
1100   not
1101   >=
1110   #(= 0(* % %2))
1111   /               ; previously: (fn[]4), inc

0Sahte değil mi?
Sızdıran Rahibe

2
ClojureScript'te değil.
MattPutnam

@LeakyNun Clojure'un kesinlikle olduğu LISP'lerde veya işlevsel programlama dillerinde değil
kedi

@ cat Çoğu fonksiyonel programlama dilinde evet ! Piton, örneğin, değerlendirir not not(0)için FalseFalsey değer olan,.
Outgolfer Erik,

3
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Er ... Python ne tamamen işlevseldir ne de bahsettiğim fonksiyonel dil türüdür. Python, çoğunlukla ve bazı küçük (kötü uygulanmış) işlevsel yönleriyle zorunludur. Erlang, Haskell (Bence), Ortak LISP, Clojure, Raket, Şema, Faktör, Standart ML, Amaç CAML vb 0 sadece başka değerdir ve bunun sonucunda truthy ve yanlış (sembol #f, f, false, vs) olduğu yanlış. Diğer tüm değerler, çoğu işlevsel dilde doğrudur.
kedi,

4

Brainfuck , 184 178 174 bayt

Giriş / çıkış U + 0000 ve U + 0001 kullanır.

0000 .
0001 ,[,[->+<]]>.
0010 ,[,-[+>+<]]>.
0011 ,.
0100 ,-[,[->+<]]>.
0101 ,,.
0110 ,>,[-<->]<[>>+<]>.
0111 ,-[,-[+>-<]]>+.
1000 ,-[,-[+>+<]]>.
1001 ,>,[-<->]<[>>-<]>+.
1010 ,,-[+>+<]>.
1011 ,-[,[->-<]]>+.
1100 ,-[+>+<]>.
1101 ,[,-[+>-<]]>+.
1110 ,[,[->-<]]>+.
1111 +.

Koşullu bir ikinci girişi okumak çok pahalı görünüyor. Örneğin, 0001sadece yapamıyor musunuz ,[,>]<.(başlangıç ​​hücresinden çıkmanıza izin veren bir tercüman verildiğinde)?
Martin Ender

@MartinEnder, Dennis'in yanıtını burada kopyalamayacağımı düşündüm.
Leaky Nun

4

Beyin Flak , 418 , 316 bayt

Çevrimiçi deneyin!

Girişlerin programın başlangıcında yığındaki en üst iki sayı olmasına izin verin (doğru için yanlış olanı sıfır) ve çıktı programın sonundaki yığının üstüne olsun (doğru olanı sıfırlayan).

yanlış, 4 bayt ( Sızdıran Rahibe'nin İzniyle )

(<>)

ve, 36 bayt

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

A ve B değil, 40 bayt

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

A, 6 bayt

({}<>)

A ve B değil, 38 bayt

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

B, 2 bayt

{}

xor, 34 bayt

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

veya, 6 bayt

({}{})

ne de 34 bayt

(({}{}<(())>)){{}{}(((<{}>)))}{}{}

xnor, 10 bayt

({}{}[()])

B, 34 bayt değil

{}(({}<(())>)){{}{}(((<{}>)))}{}{}

B, A, 14 bayt anlamına gelir

(({}){}{}[()])

A, 34 bayt değil

(({}<{}(())>)){{}{}(((<{}>)))}{}{}

A, B, 16 bayt anlamına gelir.

(({}){}{}[()()])

nand, 12 bayt

({}{}[()()])

doğru, 6 bayt

<>(())

açıklama

Bunların çoğu çok benzer olduğu için her birinin nasıl çalıştığını tam olarak açıklayamayacağım. On altı kişinin hepsinin nasıl çalıştığını açıklığa kavuşturmak için elimden geleni yapıyorum.

İlk olarak, aynı değerden üçü döndüren kapılardır (yani 2, 3, 5, 8, 9, 12, 14 ve 15). Bunların hepsi aynı düzeni izler. Öncelikle girişi ikişer bir sayıya, ikilileri ise B ile ikisini de içine almalısınız. Bu, bu snippet ile yapılır (({}){}{}). Ardından, yalıtmak istediğiniz iki bit girişinin değerini çıkarın ({}[value]). (Gerçek kodda çıkarma ve dönüştürme, baytları kurtarmak için bir adımda yapılır). Bu gerekirse bir değil ile birleştirilebilir:(({}<(())>)){{}{}(((<{}>)))}{}{} .

Sıradaki: ve, veya, veya, xor ve xnor. Bunlar yukarıdakilere benzer şekilde çalışır. Aslında bunlardan bazıları yukarıda yer almaktadır, ancak bu yöntem daha kısadır. Burada kullandığım numara, bunların her birinin A B toplamına tekabül etmesidir. İlk önce AB'yi ekler ve ilgili miktarı çıkarırsınız. Olarak ifade edilen({}{}[0,1,2 or 3]) . Sonra gerekirse

Sıradaki: A, B, A değil, B değil. Bunlar oldukça açıklayıcı. Gereksiz değeri kaldırarak başlıyoruz, sonra ya olumsuzlanıyor ya da bitiriyoruz.

Son olarak iki basitlik vardır: doğru ve yanlış. Bunlar için doğru değeri off yığına itiyoruz. <>Nilad döner yüzden sıfır değeri olarak anahtarını kullanarak iki bayt kaydedebilirsiniz sıfır.

Dışarıdaki en etkili çözüm değil (belki de Brain-Flak'ta en verimli), ancak bunları yazarken çok eğlendim ve bunları kısaltmak için yalvarıyorum.


(<>)için yeterlidir false; Ayrıca, (<{}{}>)8 bayt
Leaky Nun

Vay ben meydan okuma çok daha katı bir tanımı vardı. Teşekkür ederim. Bunu büyük oranda azaltacağım
Buğday Sihirbazı,

Ne demek istiyorsun?
Sızdıran Rahibe,

Var olan girdileri kaldırmam ve sonucu yerine koymam gerektiğini düşündüm. (<>)girişleri bırakacak ve sıfırı diğer yığına koyacağız.
Buğday Sihirbazı,

1
Örtük sıfırlar nedeniyle <>yeterli değil falsemi? Ayrıca bence aboş program olabilir. trueolabilir <>[][](bayt tasarrufu sağlamaz, ancak iyi görünür: P).
CalculatorFeline

4

ProgFk , 18,5 17,5 bayt

ProgFk'un talimatları uçbirimlerde belirtildiği için, aşağıdaki kod onaltılı, satır başına bir mantık kapısı ve baytlar arasında boşluk bulunan şekilde verilir.

3
E1
DE 2D
<empty>
DE 1
1
E3
E2
E2 D
E3 D
1D
DE 2
D
DE 1D
E1 D
4

açıklama

ProgFk , her hücrenin bir bit olduğu ve talimatların nibble (4 bayt) verildiği bir bant tabanlı esolang (Brainfuck'a benzer). Talimatlar, işaretçi tarafından gösterilen hücrede çalışır. Giriş (birinci ve ikinci hücrelere verilmektedir Ave Bsırasıyla birinci ve ikinci hücrelere olmak üzere), ve kullanıcı işaretçi ilk hücre başlar. Çıkış, ilk hücrede saklanır.

Kullanılan her talimat aşağıda açıklanmıştır.

1   Increment the instruction pointer.
2   Decrement the instruction pointer.
3   Set the current bit to 0.
4   Set the current bit to 1.
D   Perform a NOT on the current bit.
E   The next instruction is an extended instruction.

Extended instructions:
1   Set the current bit to the current bit AND the next bit.
2   Set the current bit to the current bit OR the next bit.
3   Set the current bit to the current bit XOR the next bit.
6   Swap the current bit and the next bit.

@LeakyNun sayesinde bir bayt kaydedildi!


4

Aslında, 24 bayt

Bu programlar girişi A\nB( \nyeni bir çizgiyi temsil ederek), B'yi istifin üstünde bırakan ve aşağıda A olan bir girdi alır. Falsetarafından temsil edilir 0ve Trueherhangi bir pozitif tamsayı ile temsil edilir.

é0  (false: clear stack, push 0)
*   (and: multiply)
<   (A and not B: less-than)
X   (A: discard B)
>   (B and not A: greater-than)
@X  (B: discard A)
^   (A xor B: xor)
|   (A or B: or)
|Y  (A nor B: or, boolean negate)
=   (A xnor B: equals)
@XY (not B: discard A, boolean negate B)
≤   (if B then A: less-than-or-equal)
XY  (not A: discard B, boolean negate)
≥   (if A then B: greater-than-or-equal)
*Y  (A nand B: multiply, boolean negate)
é1  (true: clear stack, push 1)

3 bayt için Leaky Nun'a teşekkürler

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.