Golf Me An OOP!
Dua komponen penting dari pemrograman berorientasi objek adalah pewarisan dan komposisi. Bersama-sama, mereka memungkinkan untuk menciptakan hierarki kelas yang sederhana namun kuat untuk menyelesaikan masalah. Tugas Anda adalah mengurai serangkaian pernyataan tentang hierarki kelas, dan menjawab pertanyaan tentang hierarki.
Memasukkan
Serangkaian pernyataan dan pertanyaan tentang hierarki kelas, baca dari file atau input standar, mana yang terbaik untuk bahasa Anda. Jika Anda menggunakan opsi file, nama file akan diteruskan sebagai argumen pertama ke kode Anda (argumen fungsi atau argumen baris perintah, mana pun yang Anda pilih). Formatnya adalah sebagai berikut:
<statement> : <name> is a <name>. | <name> has a <name>.
<question> : Is <name> a <name>? | Does <name> have a <name>?
<name> : a-z | A-Z | sequence of alphanumerics or underscores, starting with a letter
Masukan akan selalu berupa pernyataan, lalu pertanyaan. Semua nama kelas akan dimulai dengan huruf bahasa Inggris huruf besar ( A-Z
), dan semua nama anggota akan dimulai dengan huruf bahasa Inggris huruf kecil ( a-z
). Semua nama peka terhadap huruf besar-kecil - ABC123
tidak sama dengan kelas Abc123
.
Tidak akan ada warisan siklus - jika B
mewarisi dari A
, A
tidak akan mewarisi dari B
atau dari B
anak-anak.
Hanya nama kelas yang akan menjadi bagian dari hierarki - pernyataan seperti foo is a bar.
atau document has a name.
tidak akan muncul.
Keluaran
Serangkaian nilai kebenaran atau kesalahan, sebagai jawaban atas pertanyaan, ditulis ke output standar atau sebagai nilai pengembalian fungsi Anda. Jika Anda tidak memiliki informasi yang cukup untuk menjawab pertanyaan (mis. Pertanyaan yang melibatkan nama yang belum Anda lihat dalam pernyataan), jawab dengan nilai falsey.
Uji Kasus
Kasus 1:
Memasukkan:
B is a A.
C is a B.
A has a foo.
Does B have a foo?
Is C a A?
Is D a A?
Keluaran:
True
True
False
Kasus 2:
Memasukkan:
Cop is a Person.
Criminal is a Person.
Sheriff is a Cop.
Crooked_Cop is a Cop.
Crooked_Cop is a Criminal.
BankRobber is a Criminal.
Cop has a badge.
Criminal has a criminal_record.
Person has a name.
Is Crooked_Cop a Person?
Does Criminal have a name?
Is Crooked_Cop a BankRobber?
Does Person have a potato?
Is Cop a Cop?
Keluaran:
True
True
False
False
True
Aturan
- Anda dapat menjawab dengan fungsi atau program
- Celah standar dilarang
- Ini adalah kode-golf , jadi jawaban terpendek yang benar dalam byte menang
- Jawaban yang menang akan dipilih dalam satu minggu
Semoga beruntung, dan semoga OOP itu menyertai Anda!
Papan peringkat
Cuplikan Stack di bagian bawah posting ini menghasilkan leaderboard dari jawaban a) sebagai daftar solusi terpendek per bahasa dan b) sebagai leaderboard keseluruhan.
Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:
## Language Name, N bytes
di mana N
ukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:
## Perl, 43 + 2 (-p flag) = 45 bytes
Anda juga dapat membuat nama bahasa menjadi tautan yang kemudian akan muncul di cuplikan:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
<style>body { text-align: left !important} #answer-list { padding: 10px; width: 290px; float: left; } #language-list { padding: 10px; width: 290px; float: left; } table thead { font-weight: bold; } table td { padding: 5px; }</style><script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="language-list"> <h2>Shortest Solution by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr> </thead> <tbody id="languages"> </tbody> </table> </div> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr> </thead> <tbody id="answers"> </tbody> </table> </div> <table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table><script>var QUESTION_ID = 61097; var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"; var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk"; var OVERRIDE_USER = 45941; var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page; function answersUrl(index) { return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER; } function commentUrl(index, answers) { return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER; } function getAnswers() { jQuery.ajax({ url: answersUrl(answer_page++), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { answers.push.apply(answers, data.items); answers_hash = []; answer_ids = []; data.items.forEach(function(a) { a.comments = []; var id = +a.share_link.match(/\d+/); answer_ids.push(id); answers_hash[id] = a; }); if (!data.has_more) more_answers = false; comment_page = 1; getComments(); } }); } function getComments() { jQuery.ajax({ url: commentUrl(comment_page++, answer_ids), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { data.items.forEach(function(c) { if (c.owner.user_id === OVERRIDE_USER) answers_hash[c.post_id].comments.push(c); }); if (data.has_more) getComments(); else if (more_answers) getAnswers(); else process(); } }); } getAnswers(); var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/; var OVERRIDE_REG = /^Override\s*header:\s*/i; function getAuthorName(a) { return a.owner.display_name; } function process() { var valid = []; answers.forEach(function(a) { var body = a.body; a.comments.forEach(function(c) { if(OVERRIDE_REG.test(c.body)) body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>'; }); var match = body.match(SCORE_REG); if (match) valid.push({ user: getAuthorName(a), size: +match[2], language: match[1], link: a.share_link, }); else console.log(body); }); valid.sort(function (a, b) { var aB = a.size, bB = b.size; return aB - bB }); var languages = {}; var place = 1; var lastSize = null; var lastPlace = 1; valid.forEach(function (a) { if (a.size != lastSize) lastPlace = place; lastSize = a.size; ++place; var answer = jQuery("#answer-template").html(); answer = answer.replace("{{PLACE}}", lastPlace + ".") .replace("{{NAME}}", a.user) .replace("{{LANGUAGE}}", a.language) .replace("{{SIZE}}", a.size) .replace("{{LINK}}", a.link); answer = jQuery(answer); jQuery("#answers").append(answer); var lang = a.language; lang = jQuery('<a>'+lang+'</a>').text(); languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang.toLowerCase(), user: a.user, size: a.size, link: a.link}; }); var langs = []; for (var lang in languages) if (languages.hasOwnProperty(lang)) langs.push(languages[lang]); langs.sort(function (a, b) { if (a.lang_raw > b.lang_raw) return 1; if (a.lang_raw < b.lang_raw) return -1; return 0; }); for (var i = 0; i < langs.length; ++i) { var language = jQuery("#language-template").html(); var lang = langs[i]; language = language.replace("{{LANGUAGE}}", lang.lang) .replace("{{NAME}}", lang.user) .replace("{{SIZE}}", lang.size) .replace("{{LINK}}", lang.link); language = jQuery(language); jQuery("#languages").append(language); } }</script>
Does Criminal have a name?
setaraTrue
? Apakah semua benda memiliki nama?Criminal is a Person
.Person has a name
.Jawaban:
CJam, 59 byte
Ini selesai secara instan untuk kedua kasus uji.
Entah itu mencetak nama nama kedua dari pertanyaan atau
1
(keduanya benar), atau0
(salah).Cobalah online di juru bahasa CJam .
Ide
Karena perbedaan antara kelas dan anggota, tantangan bermuara pada menciptakan preorder yang inputnya memberikan definisi parsial.
Kami mendefinisikan bahwa x ≺ y jika x adalah y atau x memiliki y .
Untuk kasus uji pertama, input menyatakan bahwa B ≺ A , C ≺ B, dan A ≺ foo . Karena transitivitas, kami juga memiliki B ≺ foo , C ≺ A dan A ≺ foo . Juga, karena refleksivitas, x ≺ x selalu benar.
Untuk input yang diberikan, kita dapat mengekstraksi definisi parsial ≺ dari pernyataan, menerapkan transitivitas dalam jumlah yang cukup untuk melengkapi definisi ≺ dan akhirnya menjawab pertanyaan.
Kode
sumber
C:{B:{A:{foo:{}}}}
Python 3,
431331308 byteIni adalah versi lengkap dengan komentar
Output untuk test case # 1:
Kasus # 2:
Saya menghapus perintah debug untuk kejelasan dalam program utama, tetapi jika Anda ingin melihatnya lihat saja di histori
sumber
global f
dih(z)
, penggunaandef h(z,f)
dan lulus globalf
di saat memanggil itu. Bahkan, Anda tidak perluh(z)
sama sekali - cukup letakkan tubuh di tempat Anda menyebutnya. Anda tidak perlur=2
, dan Anda bisa melakukannyaprint(r)
tanpaif
, karena Anda perlu menampilkan nilai falsey untuk kueri palsu. Anda dapat mengubah namasyn
menjadiz
dan mencukur beberapa byte di sana. Saya pikir Anda tidak perlu[]
memahami daftar Anda terlebih dahuluany
.e
sekali, sehingga Anda bisa menghilangkan definisi dan hanya menggunakan[a,b,c,d]
. Alih-alihif s(i,g) is not None
, lakukanif s(i,g)
-re.Match
benda selalu dievaluasi untukTrue
jika kecocokan ditemukan. Anda juga dapat menjatuhkan 2 byte denganf[x]+=f[y]
.Haskell, 157 byte
Berikan string ke
o
. Tidak yakin apakah membuatx
danv
('mengekstrak' dan 'memverifikasi') infiks memotong lebih dari membuatmap
infiks, atau jika keduanya memungkinkan.EDIT: Penjelasan
Jadi,
(#)
adalah bagaimana Anda mendefinisikan operator infiks, saya menggunakannya hanya sebagai singkatan untukmap
, menerapkan fungsi ke setiap elemen daftar. Mengatasi ini dan alias lainnyal
, menghindari operator 'fungsi-aplikasi-langsung'$
dan menambahkan lebih banyak tanda kurung dan menghapus hal-hal, dan dengan nama fungsi sebenarnya kami tiba di:map words (lines string)
adalah daftar daftar kata dari setiap baris dalam string input.(=='?').last.last
adalah predikat yang menunjukkan apakah huruf terakhir pada kata terakhir dari sebuah baris adalah tanda tanya, yaitu apakah baris tersebut adalah sebuah pertanyaan.break
memecah daftar menjadi dua bagian pertama tanpa pertanyaan (semua pernyataan) dan bagian dari pertanyaan pertama (semua pertanyaan).map
pingextract n
pada ini mengambil dari setiap kata daftar elemen yang kita inginkan, yangn
pertama (yang dalam pernyataan adalah kata pertama - jadin == 0
, dan dalam pertanyaan adalah kata kedua - jadin == 1
) menggunakan!!
operator dan yang terakhir, dari mana kita harus memotong huruf terakhir (salah satu'.'
atau'?'
) menggunakaninit
.(Perhatikan bahwa saya sepenuhnya mengabaikan huruf besar, itu karena saya benar-benar mengabaikan perbedaan antara kelas dan anggota, anggota hanya daun pohon yang dibangun oleh basis pengetahuan (tetapi tidak semua daun mewakili anggota, mereka juga mungkin kelas tanpa subkelas atau anggota) ), di mana setiap simpul anak mewakili subkelas atau anggota dari apa yang simpul induknya wakili. SAYA HANYA MENYADARI HAL INI SALAH YANG PERLU DILAKUKAN dalam kasus-kasus yang tidak dicakup oleh OP. Akan segera mengedit solusi.)
Sekarang,
map (extract 0) knowledge
danmap (extract 1) questions
adalah daftar tupel nama yang mewakili hubungan sub-kelas atau anggota dari yang pertama hingga yang kedua.Semua tuple dalam
map (extract 0) knowledge
semua hubungan yang benar,map (extract 1) questions
yang sekarang dipetakanverify
fungsinya, dengan argumen pertama ditetapkanmap (extract 0) knowledge
.(Mulai sekarang, di dalam
verify
,knowledge
adalah nama parameter dan merujuk keextract
daftar tuple yang sudah diedit.)(Juga, saat membaca
verify
, perhatikan bahwa sementara||
(setelah linebreak yang tidak tepat untuk menghindari gulir horizontal pada SE) adalah disfungsi boolean yang normal antara case 'refleksif' dan 'rekursif',or
lipatan yang ada pada daftar, yaitu memeriksa apakah ada elemen daftar benar.)Sekarang, suatu hubungan jelas benar jika itu refleksif. Sebenarnya, tidak ada, seorang
potato
tidak memiliki sebuahpotato
(dan bahkan tidak satu dalam arti 'adalah' digunakan di sini, seperti dalam 'A Cop adalah Cop'), tapi itu hanya kondisi terminasi yang mencakup semua hubungan setelah berjalan menyusuri pohon (yang tidak seperti pohon nyata berarti 'menuju daun').Dalam semua kasus lain, kami mencoba mengambil tupel dari
knowledge
(setelah kamifilter
menyunting untuk memastikan bahwa kami 'melihat' hanya pasangan dengan elemen pertama yang sama dengan yang ingin kami periksa), dan melanjutkan dari tempat itu menunjuk. Pemahaman daftar berkaitan dengan semua kemungkinan tuple untuk melanjutkan dan meneleponverify
lagi dalam setiap kasus. Jalan buntu hanya akan memiliki daftar kosong di sini dan kembalifalse
secara keseluruhan, sehingga tidak mempengaruhi turunannyaverify
.sumber
Learn you a haskell for great good!
dan ini sekarang saya mengerti ini! (Jawaban ini sebenarnya yang mendorong saya untuk mempelajari lebih lanjut tentang haskell dan FP, dan itu sangat keren!)JavaScript,
265263 byteMasukkan string kosong untuk berhenti.
Penjelasan
sumber
string.split(" ");
?.match(/\w+/g)
untuk menghapus tanda baca dari kata-kata..split(" ")
akan lebih pendek atau apakah saya melewatkan sesuatu? (Saya tidak tahu javascript).split
saya juga harus menggunakan.slice(0,-1)
(dua kali) karenaB is a A.
akan membuatB
warisanA.
(dengan.
)..split(/\W/)
. Terima kasih telah membuat saya mencari itu!