Golf ich ein OOP!
Zwei wichtige Komponenten der objektorientierten Programmierung sind Vererbung und Komposition. Zusammen ermöglichen sie die Erstellung einfacher, aber leistungsfähiger Klassenhierarchien zur Lösung von Problemen. Ihre Aufgabe besteht darin, eine Reihe von Anweisungen zu einer Klassenhierarchie zu analysieren und Fragen zur Hierarchie zu beantworten.
Eingang
Eine Reihe von Anweisungen und Fragen zu einer Klassenhierarchie, die aus einer Datei oder Standardeingabe gelesen werden, je nachdem, was für Ihre Sprache am besten geeignet ist. Wenn Sie die Option file verwenden, wird der Dateiname als erstes Argument an Ihren Code übergeben (Funktionsargument oder Befehlszeilenargument, je nachdem, was Sie auswählen). Das Format ist wie folgt:
<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
Die Eingabe wird immer Aussagen, dann Fragen sein. Alle Klassennamen beginnen mit einem englischen Großbuchstaben ( A-Z
) und alle Mitgliedsnamen mit einem englischen Kleinbuchstaben ( a-z
). Bei allen Namen muss die Groß- und Kleinschreibung beachtet werden - entspricht ABC123
nicht der Klasse von Abc123
.
Es wird keine zyklische Vererbung geben - wenn B
erbt von A
, A
wird er nicht von B
oder von einem der B
Kinder erben .
Nur Klassennamen werden Teil einer Hierarchie - Anweisungen wie foo is a bar.
oder document has a name.
werden nicht vorkommen.
Ausgabe
Eine Reihe wahrer oder falscher Werte als Antworten auf die Abfragen, die in die Standardausgabe oder als Rückgabewert Ihrer Funktion geschrieben wurden. Wenn Sie nicht genügend Informationen haben, um eine Frage zu beantworten (z. B. Fragen, die Namen betreffen, die Sie in den Aussagen nicht gesehen haben), antworten Sie mit einem falschen Wert.
Testfälle
Fall 1:
Eingang:
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?
Ausgabe:
True
True
False
Fall 2:
Eingang:
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?
Ausgabe:
True
True
False
False
True
Regeln
- Sie können mit einer Funktion oder einem Programm antworten
- Standardlücken sind verboten
- Das ist Code-Golf , also gewinnt die kürzeste richtige Antwort in Byte
- Die Gewinnerantwort wird in einer Woche ausgewählt
Viel Glück und möge die OOP bei dir sein!
Bestenliste
Das Stapel-Snippet am Ende dieses Beitrags generiert die Rangliste aus den Antworten a) als Liste der kürzesten Lösungen pro Sprache und b) als Gesamtrangliste.
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
## Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:
## Perl, 43 + 2 (-p flag) = 45 bytes
Sie können den Namen der Sprache auch als Link festlegen, der dann im Snippet angezeigt wird:
## [><>](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?
gleichTrue
? Haben alle Objekte einen Namen?Criminal is a Person
.Person has a name
.Antworten:
CJam, 59 Bytes
Dies endet sofort für beide Testfälle.
Es gibt entweder den zweiten Vornamen der Frage oder
1
(beide wahr) oder0
(falsch) aus.Probieren Sie es online im CJam-Interpreter aus .
Idee
Aufgrund der Unterscheidung zwischen Klassen und Mitgliedern besteht die Herausforderung darin, eine Vorbestellung zu erstellen, für die die Eingabe eine Teildefinition liefert.
Wir definieren, dass x ≺ y wenn x ein y ist oder x ein y hat .
Für den ersten Testfall lautet der Eingang B ≺ A , C ≺ B und A ≺ foo . Wegen der Transitivität, haben wir auch B ≺ foo , C ≺ A und A ≺ foo . Wegen der Reflexivität ist x ≺ x immer wahr.
Für eine gegebene Eingabe können wir daher die Teildefinition von ≺ aus den Aussagen extrahieren, die Transitivität ausreichend oft anwenden, um die Definition von ≺ zu vervollständigen und schließlich die Fragen zu beantworten.
Code
quelle
C:{B:{A:{foo:{}}}}
Python 3,
431331308 BytesDies ist die Vollversion mit Kommentaren
Ausgabe für Testfall 1:
Fall 2:
Ich habe die Debug-Befehle aus Gründen der Übersichtlichkeit im Hauptprogramm entfernt, aber wenn Sie sie sehen möchten, schauen Sie einfach in den Verlauf
quelle
global f
in zu verwendenh(z)
, verwendendef h(z,f)
und übergeben Sie das globalef
in, wenn Sie es aufrufen. Tatsächlich brauchen Sie das gar nichth(z)
- platzieren Sie den Körper einfach dort, wo Sie ihn nennen. Sie müssen nichtr=2
und können auch einfach auf dasprint(r)
verzichtenif
, da Sie für falsche Abfragen einen Falsey-Wert ausgeben müssen. Sie können umbenannt ,syn
umz
dort und abrasieren mehr Bytes. Ich glaube nicht, dass du das[]
um dein Listenverständnis im ersten brauchstany
.e
einmal, damit Sie die Definition aufheben und einfach verwenden können[a,b,c,d]
. Stattif s(i,g) is not None
tunif s(i,g)
-re.Match
Objekte werden immer ausgewertet ,True
wenn eine Übereinstimmung gefunden wird. Sie können auch 2 Bytes mit löschenf[x]+=f[y]
.Haskell, 157 Bytes
Gib die Zeichenfolge an
o
. Nicht sicher, ob das Erstellenx
undv
('extrahieren' und 'überprüfen') von Infixen mehr schneidet als das Erstellenmap
eines Infixes, oder ob beides möglich ist.EDIT: Erklärung
So
(#)
wie Sie einen Infix-Operator definieren, verwende ich ihn nur als Kurzform für dasmap
Anwenden einer Funktion auf jedes Element einer Liste. Lösen Sie diesen und den anderen Aliasl
, vermeiden Sie den Operator 'direct-function-application'$
und fügen Sie noch mehr Klammern und Abstände hinzu. Mit echten Funktionsnamen erhalten Sie:map words (lines string)
ist eine Liste der Wortlisten der einzelnen Zeilen in der Eingabezeichenfolge.(=='?').last.last
ist ein Prädikat, das angibt, ob der letzte Buchstabe im letzten Wort einer Zeile ein Fragezeichen ist, dh ob die Zeile eine Frage ist.break
Bricht die Liste in ein Tupel des ersten Teils ohne Fragen (alle Aussagen) und des Teils ab der ersten Frage (alle Fragen).map
pingextract n
auf diese nimmt aus jeder Wortliste die Elemente heraus, die wir wirklich wollen, dasn
th (das in Aussagen das erste Wort ist - alson == 0
, und in Fragen das zweite Wort - alson == 1
) unter Verwendung des!!
Operators und des letzten, von dem wir muss den letzten Buchstaben (entweder'.'
oder'?'
) mit schneideninit
.(Beachten Sie, dass ich die Groß- und Kleinschreibung völlig ignoriere, da ich die Unterscheidung zwischen Klassen und Mitgliedern völlig ignoriere. Mitglieder sind nur Blätter eines von der Wissensbasis erstellten Baums (aber nicht alle Blätter repräsentieren Mitglieder, sie können auch Klassen ohne Unterklassen oder Mitglieder sein.) ), wobei jeder untergeordnete Knoten eine Unterklasse oder ein Mitglied dessen darstellt, was sein übergeordneter Knoten darstellt. ICH HABE NUR FALLE FALLE FALLE FALLE FALLE FALLE FALLE FALLE FALLE FALLE FALLE FALLE FALLE
Nun,
map (extract 0) knowledge
undmap (extract 1) questions
sind Listen von Tupeln von Namen, die eine Unterklassen- oder Mitgliedsbeziehung von der ersten zur zweiten darstellen.Die Tupel in
map (extract 0) knowledge
sind alles wahre Beziehungen, die inmap (extract 1) questions
sind nun derverify
Funktion zugeordnet, wobei das erste Argument auf gesetzt istmap (extract 0) knowledge
.(Von nun an nach innen
verify
,knowledge
ist ein Parametername und bezieht sich auf die bereitsextract
ed Tupel - Liste.)(
verify
Beachten Sie beim Lesen auch , dass, während das||
(nach dem uneleganten Zeilenumbruch, um horizontales Scrollen auf SE zu vermeiden) eine normale boolesche Disjunktion zwischen dem 'reflexiven' und dem 'rekursiven' Fall ist,or
das über eine Liste faltet, dh prüft, ob es eine gibt Listenelement ist wahr.)Nun ist eine Beziehung offensichtlich richtig, wenn sie reflexiv ist. Streng genommen, nein, ein
potato
nicht funktioniert hat einepotato
(und es ist nicht einmal ein in dem Sinne ‚ist‘ wird hier verwendet, wie in ‚A Cop ist ein Cop‘), aber das ist nur die Abbruchbedingung , dass deckt alle Beziehungen nach den Baum hinuntergehen (was anders als bei echten Bäumen "auf die Blätter zugehen" bedeutet).In allen anderen Fällen versuchen wir, ein Tupel von
knowledge
(nachdem wirfilter
sichergestellt haben, dass wir nur Paare mit demselben ersten Element sehen, das wir überprüfen möchten) zu nehmen und von dort aus fortzufahren, wo es hinweist. Das Listenverständnis behandelt alle möglichen Tupel, um fortzufahren und ruft jeweilsverify
wieder auf. Eine Sackgasse hat hier nur eine leere Liste und kehrtfalse
insgesamt zurück. Sie hat also keinen Einfluss auf die Instanz, von derverify
sie aufgerufen wurde.quelle
Learn you a haskell for great good!
und jetzt verstehe ich das! (Diese Antwort hat mich dazu veranlasst, mehr über Haskell und FP zu erfahren, und es ist sooooo cool!)JavaScript,
265263 BytesGeben Sie eine leere Zeichenfolge ein, um den Vorgang zu beenden.
Erläuterung
quelle
string.split(" ");
?.match(/\w+/g)
die Interpunktion aus den Wörtern entfernt..split(" ")
nicht kürzer sein oder vermisse ich etwas? (Ich weiß nicht, Javascript).split
hätte müsste ich das auch.slice(0,-1)
(zweimal) machen, weil das (mit dem ) erbenB is a A.
würde .B
A.
.
.split(/\W/)
. Danke, dass ich das nachschlagen musste!