Tugas
Tugas Anda adalah menulis fungsi atau program dalam bahasa pilihan Anda yang menganalisis beberapa pernyataan dan menentukan apakah dapat disimpulkan dari pernyataan-pernyataan yang dapat diterbangkan babi.
Memasukkan
Input adalah sebuah String yang dapat dibaca dari STDIN, diambil sebagai argumen fungsi atau bahkan disimpan dalam file. Input dapat dijelaskan menggunakan EBNF berikut:
input = statement , {statement};
statement = (("Pigs are ", attribute) | ("Everything that is ", attribute, "is also ", attribute)), ". ";
attribute = [not], ("able to fly" | singleAttribute);
singleAttribute = letter, {letter};
letter = "a" | "b" | "c" | "d" | "e" | "f" | "g"
| "h" | "i" | "j" | "k" | "l" | "m" | "n"
| "o" | "p" | "q" | "r" | "s" | "t" | "u"
| "v" | "w" | "x" | "y" | "z" ;
Input contoh (lihat lebih banyak contoh di bawah):
Pigs are green. Everything that is green is also intelligent. Everything that is able to fly is also not intelligent. Pigs are sweet.
Keluaran
Output dapat dikembalikan oleh fungsi Anda, ditulis ke file atau dicetak ke STDOUT. Ada 5 kasus berbeda yang harus ditangani:
- Pernyataan yang diberikan valid, konsisten dan memiliki konsekuensi logis bahwa babi dapat terbang. Dalam hal ini, Anda harus menampilkan
Yes
. - Pernyataan yang diberikan valid, konsisten dan memiliki konsekuensi logis bahwa babi tidak bisa terbang. Dalam hal ini, Anda harus menampilkan
No
. - Tidak dapat disimpulkan dari pernyataan yang diberikan, valid dan konsisten apakah babi bisa terbang atau tidak. Dalam hal ini, Anda harus menampilkan
Maybe
. - Pernyataan yang diberikan valid, tetapi tidak konsisten (yaitu ada kontradiksi dalam pernyataan yang diberikan). Sejak ex falso quodlibet , kami memutuskan untuk menampilkan
Yes
dalam hal ini. - Pernyataan yang diberikan tidak valid, yaitu tidak diformat sesuai dengan EBNF yang diberikan. Dalam hal ini, Anda dapat melakukan apa pun yang Anda inginkan.
Detail
- Anda dapat mengasumsikan bahwa atribut yang diberikan independen satu sama lain. Jadi, misalnya, babi mungkin muda dan tua, hijau, merah dan biru pada saat yang sama tanpa menyebabkan ketidakkonsistenan. Namun, babi mungkin tidak 'hijau' dan 'tidak hijau' pada saat yang sama, itu kontradiksi dan harus ditangani sebagaimana dijelaskan dalam (4).
- Untuk setiap atribut, asumsikan bahwa setidaknya ada satu objek (tidak harus seekor babi) di alam semesta yang memiliki atribut yang diberikan, dan satu objek yang tidak memilikinya.
Contoh Input & Output
Memasukkan:
Pigs are green. Everything that is green is also intelligent. Everything that is able to fly is also not intelligent.
Keluaran: Karena Babi berwarna hijau dan karena itu cerdas, dan segala sesuatu yang dapat terbang tidak cerdas, babi tidak bisa terbang. Output adalah No
.
Memasukkan:
Pigs are old. Everything that is not able to fly is also not old.
Keluaran: Jika babi tidak bisa terbang, mereka juga tidak tua. Tetapi karena mereka sudah tua, Anda harus keluar Yes
.
Memasukkan:
Everything that is sweet is also not old. Everything that is intelligent is also blue.
Output: Maybe
.
Memasukkan:
Pigs are not able to fly. Everything that is red is also sweet. Everything that is sweet is also not red.
Keluaran: Walaupun pernyataan pertama menyiratkan bahwa babi tidak dapat terbang, pernyataan berikut ini saling bertentangan dan oleh karena itu hasilnya haruslah Yes
.
Memasukkan:
Pigs are very smart. Pigs are able to fly.
Output: Apa pun yang Anda inginkan, karena String tidak cocok dengan kriteria yang disebutkan di atas.
Pemenang
Ini adalah kode-golf , jadi jawaban terpendek yang benar (dalam byte) menang. Pemenang akan dipilih satu minggu setelah jawaban pertama yang benar diposting.
sumber
Jawaban:
Perl,
363353350347343297266264Tidak Disatukan / Penjelasan:
sumber
Haskell,
586566547 bytesSaya menulis ini dengan asumsi bahwa untuk setiap properti P pasti ada beberapa x dan y sedemikian sehingga P (x) benar dan P (y) salah; tanpa asumsi ini, contoh input keempat tidak akan memiliki kontradiksi dan akan menjawab "Tidak".
Ini harus dikompilasi dengan opsi baris perintah ghc "-cpp". Input harus diakhiri oleh EOF (^ D). Anda dapat mencobanya online di http://melpon.org/wandbox/ , tetapi Anda tidak dapat mengatur opsi baris perintah. Sebagai gantinya, Anda dapat mengawali program dengan opsi bahasa
Ia bekerja dengan mengumpulkan seperangkat sifat, kemudian menyaring set penilaian sifat -> kebenaran menggunakan implikasi dalam input. Hasilnya kemudian diuji untuk memastikan bahwa setiap sifat dapat secara benar ditugaskan untuk Benar dan Salah (kegagalan di sini adalah kasus ex falso quodlibet ). Akhirnya, ia mencari penilaian yang sesuai dengan fakta babi, memeriksa nilai "mampu terbang" di setiap penilaian.
Cukup beberapa byte yang hilang ke keadaan threading sekitar: seperangkat sifat yang terlihat sejauh ini, fungsi pemilih-fakta-babi, dan fungsi penyaringan ditentukan oleh implikasinya. Mungkin ide yang persis sama akan jauh lebih pendek dalam bahasa yang tidak murni.
Sunting: Disimpan beberapa byte oleh saran haskeller bangga, lalu beberapa tambahan dengan mengganti pengikatan z dan "u% drop 2 z" dengan mengikat ke "_: _: z" dan "u% z", menghemat 3.
Sunting 2: Disimpan lagi. Menggunakan trik (#) = (,) untuk menyimpan 2 byte dan belajar tentang sinonim pola ( https://ghc.haskell.org/trac/ghc/wiki/PatternSynonymous ), tetapi notasinya terlalu bertele-tele untuk mendapatkan penghematan dari menghilangkan sisa pasangan dalam program ini. Peras lebih banyak penghematan dengan mengubah pola yang dicari parser. Misalnya: jika sebuah kalimat tidak dimulai dengan Babi dan kami memiliki sesuatu yang tersisa dalam status pengurai, kami menguraikan kalimat "Segala sesuatu yang ..". Ini menyimpan banyak karakter dalam pola untuk X dan%.
sumber
u n=(:)<$>[t,f]<*>u(n-1)
(meskipun ini akan membutuhkan pengimporan Control.Applicative, jadi menurut Anda itu lebih buruk)c l=(all(==l!!0)l,and l)
Python,
547536525521513509497503501Untuk masing-masing
a -> b
input, kami menambahkan klausa yang diberikan dan negasinyanot b -> not a
ke himpunan klausa dan kemudian menghitung set proposisi yang dapat->
dijangkau dari proposisi apa pun menggunakan loop fixpoint. Setiap kali kita menemukan kontradiksi, kita melempar (dan kemudian menangkap) aZeroDivisionError
dan mencetakYes
.Akhirnya, kami memeriksa apakah 'mampu terbang' (dan / atau negasinya) dapat dijangkau dari proposisi 'is pig'
''
dan mencetak respons yang sesuai.EDIT :
Ini buggy, memperbaikinya.Tetap.sumber
try
blok pada baris yang sama dengantry:
Ruby 1.9.3 (
365 364362)Pemakaian
Kode di atas mendefinisikan fungsi
f
, yang mengambil satu parameter yang mewakili masukan tekstual dan kembaliYes
,No
atauMaybe
.Sebagai contoh:
Tes online: http://ideone.com/fxLemg
Kode ungolfed (termasuk tes unit) tersedia di sini .
sumber