Golf Me OOP!
Dwa ważne elementy programowania obiektowego to dziedziczenie i kompozycja. Razem pozwalają na tworzenie prostych, ale potężnych hierarchii klas w celu rozwiązywania problemów. Twoim zadaniem jest przeanalizowanie szeregu stwierdzeń dotyczących hierarchii klas i udzielenie odpowiedzi na pytania dotyczące hierarchii.
Wkład
Seria stwierdzeń i pytań dotyczących hierarchii klas, czytanych z pliku lub standardowego wejścia, w zależności od tego, który język jest najlepszy. Jeśli użyjesz opcji pliku, nazwa pliku zostanie przekazana jako pierwszy argument do Twojego kodu (argument funkcji lub argument wiersza poleceń, zależnie od tego, co wybierzesz). Format jest następujący:
<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
Wkładem będą zawsze stwierdzenia, a następnie pytania. Wszystkie nazwy klas A-Z
zaczynają się od dużej litery angielskiej ( ), a wszystkie nazwy członków zaczynają się od małej litery angielskiej ( a-z
). W nazwach rozróżniana ABC123
jest wielkość liter - nie jest to ta sama klasa, co Abc123
.
Nie będzie żadnego cyklicznego dziedziczenia - jeśli B
odziedziczy po nim A
, A
nie odziedziczy po nim B
ani żadnym z B
jego dzieci.
Tylko nazwy klas będą stanowić część hierarchii - instrukcje takie jak foo is a bar.
lub document has a name.
nie będą występować.
Wydajność
Szereg prawdziwych lub falsey wartości, jako odpowiedzi na zapytania zapisane na standardowym wyjściu lub jako wartość zwracana przez twoją funkcję. Jeśli nie masz wystarczających informacji, aby odpowiedzieć na pytanie (np. Pytania dotyczące nazwisk, których nie widziałeś w wypowiedziach), odpowiedz z wartością falsey.
Przypadki testowe
Przypadek 1:
Wkład:
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?
Wydajność:
True
True
False
Przypadek 2:
Wkład:
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?
Wydajność:
True
True
False
False
True
Zasady
- Możesz odpowiedzieć za pomocą funkcji lub programu
- Standardowe luki są zabronione
- To jest golf golfowy , więc wygrywa najkrótsza poprawna odpowiedź w bajtach
- Zwycięska odpowiedź zostanie wybrana za tydzień
Powodzenia i niech OOP będzie z tobą!
Tabela liderów
Fragment kodu na dole tego postu generuje tabelę wyników na podstawie odpowiedzi a) jako lista najkrótszych rozwiązań dla każdego języka oraz b) jako ogólna tabela wyników.
Aby upewnić się, że Twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
## Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:
## Perl, 43 + 2 (-p flag) = 45 bytes
Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie:
## [><>](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?
równeTrue
? Czy wszystkie obiekty mają nazwę?Criminal is a Person
.Person has a name
.Odpowiedzi:
CJam, 59 bajtów
To kończy się natychmiast dla obu przypadków testowych.
Drukuje albo drugie imię pytania, albo
1
(oba prawdziwe) lub0
(falsy).Wypróbuj online w interpretatorze CJam .
Pomysł
Z powodu rozróżnienia między klasami i członkami wyzwanie sprowadza się do stworzenia przedsprzedaż, dla którego dane wejściowe zapewniają częściową definicję.
Definiujemy, że x ≺ y iff x jest y lub x ma y .
W pierwszym przypadku testowym dane wejściowe stwierdzają, że B ≺ A , C ≺ B i A ≺ foo . Z powodu przechodniości mamy również B ≺ foo , C ≺ A i A ≺ foo . Ponadto, ze względu na zwrotność, x ≺ x jest zawsze prawdziwe.
Dla danego wkładu możemy zatem wyodrębnić częściową definicję ≺ ze zdań, zastosować przechodniość wystarczającą ilość razy, aby ukończyć definicję ≺ i ostatecznie odpowiedzieć na pytania.
Kod
źródło
C:{B:{A:{foo:{}}}}
Python 3,
431331308 bajtówTo jest pełna wersja z komentarzami
Dane wyjściowe dla przypadku testowego nr 1:
Przypadek nr 2:
Usunąłem polecenia debugowania dla przejrzystości w głównym programie, ale jeśli chcesz je zobaczyć, po prostu zajrzyj do historii
źródło
global f
inh(z)
, używajdef h(z,f)
i przekazuj globalnyf
podczas wywoływania go. W rzeczywistości nie potrzebujeszh(z)
wcale - po prostu umieść ciało tak, jak to nazywasz. Nie potrzebujeszr=2
i możesz po prostu obejść sięprint(r)
bezif
, ponieważ musisz podać wartość falsey dla fałszywych zapytań. Można zmienić nazwęsyn
, abyz
i ogolił tam kilka bajtów. Nie sądzę, żebyś najpierw potrzebował[]
zrozumienia całej listyany
.e
raz, więc możesz zrezygnować z definicji i po prostu użyć[a,b,c,d]
. Zamiastif s(i,g) is not None
, zrobićif s(i,g)
-re.Match
obiekty są zawsze ocenia sięTrue
, jeśli zostanie znaleziony. Możesz także upuścić 2 bajty za pomocąf[x]+=f[y]
.Haskell, 157 bajtów
Daj ciąg do
o
. Nie jestem pewien, czy tworzeniex
iv
(wyodrębnianie i weryfikowanie) poprawek tnie więcej niż tworzeniemap
poprawek, czy też oba są możliwe.EDYCJA: Objaśnienie
Tak
(#)
definiuje się operator infix, używam go jedynie jako skrótu dlamap
zastosowania funkcji do każdego elementu listy. Rozwiązując ten i inny aliasl
, unikając operatora „funkcji bezpośredniej aplikacji”$
i dodając jeszcze więcej nawiasów i odstępów między nimi, a przy rzeczywistych nazwach funkcji dochodzimy do:map words (lines string)
to lista list słów każdego wiersza w ciągu wejściowym.(=='?').last.last
jest predykatem wskazującym, czy ostatnia litera w ostatnim słowie linii jest znakiem zapytania, tj. czy linia jest pytaniem.break
łamie listę w krotce pierwszej części bez pytań (wszystkie wypowiedzi) i części z pierwszego pytania na (wszystkie pytania).map
pingowanieextract n
na nich usuwa z każdej listy słów elementy, których naprawdę chcemy, tenn
jeden (który w instrukcjach jest pierwszym słowem - więcn == 0
, a w pytaniach jest drugim słowem - więcn == 1
) za pomocą!!
operatora i ostatni, z którego muszę wyciąć ostatnią literę (albo'.'
albo'?'
) używającinit
.(Zauważ, że całkowicie ignoruję wielkie litery, ponieważ całkowicie ignoruję rozróżnienie między klasami i elementami, członkowie są tylko liśćmi drzewa zbudowanymi przez bazę wiedzy (ale nie wszystkie liście reprezentują członków, mogą być również klasami bez podklas ani członków) ), w którym każdy węzeł podrzędny reprezentuje podklasę lub element tego, co reprezentuje jego węzeł nadrzędny. PO PROSTU ZREALIZOWAŁEM TO NIEWŁAŚCIWE DO ZROBIENIA w przypadkach nieobjętych OP. Wkrótce dokonam edycji rozwiązania.)
Teraz
map (extract 0) knowledge
imap (extract 1) questions
to listy krotek nazwisk reprezentujących subclass- lub państwa-relację między pierwszym a drugim.Krotki w
map (extract 0) knowledge
są prawdziwymi relacjami, te wmap (extract 1) questions
są teraz zamapowane naverify
funkcję, z pierwszym argumentem ustawionym namap (extract 0) knowledge
.(Od teraz, w środku
verify
,knowledge
to nazwa parametru i odnosi się do jużextract
listy krotki ed.)(Podczas czytania
verify
należy również zauważyć, że chociaż||
(po nieeleganckim łamaniu wiersza, aby uniknąć przewijania w poziomie w SE) jest normalnym rozróżnieniem boolowskim między przypadkiem „refleksyjnym” a „rekurencyjnym”,or
składa to na liście, tzn. Sprawdza, czy jakieś element listy jest prawdziwy).Teraz relacje są oczywiście poprawne, jeśli są zwrotne. Ściśle mówiąc, nie,
potato
nie mająpotato
(i to nie jest jeszcze jeden w tym sensie „jest” jest używany tutaj, podobnie jak w „gliną jest Cop”), ale to tylko warunek zakończenia, które obejmuje wszystkie związki po schodzenie po drzewie (co w przeciwieństwie do prawdziwych drzew oznacza „w kierunku liści”).We wszystkich innych przypadkach próbujemy pobrać krotkę
knowledge
(po tym, jakfilter
upewnimy się, że „widzimy” tylko pary z tym samym pierwszym elementem, który chcemy sprawdzić), i kontynuujemy od miejsca, w którym wskazuje. Zrozumienie listy dotyczy wszystkich możliwych krotek, aby kontynuować iverify
w każdym przypadku ponownie wywołuje . Ślepy zaułek będzie po prostu miał pustą listę i zwrócifalse
ogólnie, więc nie wpłynie to naverify
jej wywołanie.źródło
Learn you a haskell for great good!
i teraz to rozumiem! (Ta odpowiedź właściwie skłoniła mnie do dowiedzenia się więcej o haskell i FP, i to jest takie fajne!)JavaScript,
265263 bajtówWpisz pusty ciąg, aby wyjść.
Wyjaśnienie
źródło
string.split(" ");
?.match(/\w+/g)
znaki interpunkcyjne ze słów..split(" ")
byłoby krótsze, czy coś mi umknęło? (Nie znam javascript).split
będę mieć również do użytku.slice(0,-1)
(dwa razy), ponieważB is a A.
uczyniłobyB
dziedzicząA.
(z.
)..split(/\W/)
. Dzięki, że kazałeś mi to sprawdzić!