Stellen Sie sich vor, ich habe unendlich viele Hausaufgabenprobleme (!) Mit jeweils einer ganzen Zahl.
Die mathematische Problemnotation ist eine Notation zur Beschreibung von Teilmengen des Problems mithilfe von Problemspezifizierern.
Ein MPN-Ausdruck kann aus mehreren Dingen bestehen:
- Ein einzelner Wert. Dies stellt einen Satz mit der Nummer:
99 -> {99}
. - Ein einfacher Bereich. Dies stellt den Satz alle Zahlen von Anfang bis zum Ende des Bereichs enthalten:
10~13 -> {10, 11, 12, 13}
. Wenn die linke oder rechte Seite fehlt, dann wird angenommen , dass sie -Infinity oder Unendlichkeit sein beziehungsweise:~10 -> {x|x ≤ 10}
;~ -> ℤ
. - Ein MPN-Ausdruck, gefolgt von "Überspringen" und einem anderen MPN-Ausdruck. Dies stellt den Unterschied der beiden Sätze:
10~20 skip 12~14 -> {10, 11, 15, 16, 17, 18, 19, 20}
. - Zwei MPN-Ausdrücke, durch Komma getrennt. Dies stellt die Vereinigung von zwei Sätzen:
1,8~9,15~17 -> {1,8,9,15,16,17}
.
Der "Überspringen" -Operator bindet enger als der Komma-Operator, also 16,110~112 skip 16 -> {16,110,111,112}
(16 ist nicht in der Menge enthalten {110,111,112}
, daher spielt das Ausschließen von 16 keine Rolle.)
Sie können Ausdrücke auch zur Disambiguierung in Klammern setzen:
1~9 skip (2~8 skip (3~7 skip (4~6 skip 5))) -> {1,3,5,7,9}
Das ist die Grammatik:
<expr> ::= "(" <expr> ")"
|| <number>
|| [<number>] "~" [<number>]
|| <expr> "skip" <expr>
|| <expr> "," <expr>
Ihre Aufgabe ist es, ein Programm zu schreiben, das zwei Eingaben übernimmt:
- Ein MPN-Ausdruck
- Eine Zahl
und gibt in Abhängigkeit davon, ob sich dieses Problem in der Menge befindet, die durch den MPN-Ausdruck beschrieben wird, einen Wahrheitsgehalt oder einen falschen Wert aus.
Spezifikationen
- Sie können davon ausgehen, dass die erste Eingabe ein wohlgeformter MPN-Ausdruck ist (dh, dass er der obigen Grammatik entspricht).
- Zahlen in einem MPN-Ausdruck sind immer ganze Zahlen. Sie können negativ oder null sein, haben aber niemals einen Bruchteil.
- Dies ist Code-Golf , also gewinnt die kürzeste gültige Übermittlung (gemessen in Bytes).
- Sie können verschiedene Zeichen für
~
und verwenden,
, wenn Sie möchten.
Testfälle
10~20 14 -> True
10~20 20 -> True
10~20 skip 14~18 17 -> False
~ skip 6 8 -> True
16,17 skip 16 16 -> True
(16,17) skip 16 16 -> False
~10,5~ 8 -> True
~10,5~ 4 -> True
6 skip 6,~ 6 -> True
quelle
~
und,
, aber nicht fürskip
.6 skip 6,~
den ich meiner Meinung nach richtig interpretiert habe. Die anderen 2 Antworten sind noch nicht zufriedenstellend (vorausgesetzt, ich interpretiere richtig). Wenn ich es falsch verstanden habe, korrigieren Sie es bitte und klären Sie es, aber meines Wissens sollte es mit allem übereinstimmen (es ist die Vereinigung einer Menge, die mit nichts übereinstimmt, mit einer Menge, die mit allem übereinstimmt). Dies sind die Fälle, über die ich vorhin gesprochen habe und von denen ich denke, dass sie beim Testen unserer Lösungen sehr hilfreich sein können.Antworten:
PowerShell ,
189 bis195 Byte-100..100
as ausErläuterung
Ich habe früh gemerkt, dass die Unendlichkeit dies unhaltbar macht, um Arrays zu generieren und auf Werte zu testen.
Ich habe Bereiche untersucht, aber in .Net fehlt der erforderliche Bereich (die Länge des Bereichs ist auf eine 32-Bit-Ganzzahl mit Vorzeichen beschränkt). Selbst wenn es in Ordnung wäre, den Bereich auf eine 32-Bit-Ganzzahl mit Vorzeichen zu beschränken Ich hätte nicht alle Bereiche bewältigen können.
Also habe ich angefangen, mich nur mit Anfang und Ende und schließlich mit einer Reihe von Booleschen Tests zu befassen, und angefangen, eine Reihe von Regex-Ersetzungen zu erstellen, um einen MPN in einen Booleschen Ausdruck zu verwandeln, den PowerShell versteht.
Ich habe dies im Grunde genommen in ein paar Regeln unterteilt:
2~8
wie gesagtn >=2 && n <=8
, aber wenn eines der Enden fehlt, lassen Sie die&&
und die fehlende Seite weg . Wenn beide fehlen, wollte ich sie ursprünglich nur durch ersetzen$true
. Am Ende habe ich nicht wirklich nach den fehlenden Seiten gesucht, aber ich habe darauf geachtet, dass ich jede Zahl einpacke()
.()
durch den Eingabewert ersetzt werden. Im Fall einer MPN~8
mit einem Eingabewert von55
wird also die erste Ersetzung generiert(55-ge()-and55-le(8))
, und dann wird die zweite Ersetzung durchgeführt, um diesen(55-ge55-and55-le(8))
Teil des Bereichs im Wesentlichen zu annullieren.,
getrennten Listen und einzelne Zahlen vor oder nach einemskip
, also habe ich leider lange Lookarounds verwendet.skip
ist im grunde das selbe wie-and -not
also ich mache einen direkten ersatz vonskip
zu-and!
(benutze!
als kurzschrift für-not
).-or
aber nachfolgende Ausdrücke wurden nicht berücksichtigt, sodass16,17 skip 16
Code wie generiert wurde($n-eq16)-or($n-eq17) -and! ($n-eq16)
. Es brauchte Klammern, aber das schien mit einem Straight Replace nicht zu funktionieren. Da alle anderen Elemente mit Ausnahme von Kommas ersetzt wurden und die niedrigste Priorität haben, habe ich die gesamte generierte Zeichenfolge auf die verbleibenden Kommas aufgeteilt, dann jedes Element in Klammern eingeschlossen und es erneut mit verknüpft-or
.Letztendlich wird der generierte Code einfach in
Invoke-Expression
(iex
) geleitet, um ausgeführt zu werden, und dann erhalten wir das boolesche Ergebnis ( Sie können den generierten Code anstelle des Ergebnisses hier sehen ).Das hat viel zu lange gedauert und ich bin mir sicher, dass noch ein paar Bytes übrig sind, aber ich kann es mir nicht mehr ansehen :-p
quelle
Perl,
99130 BytesProbieren Sie es auf Ideone.
Ungolfed:
quelle
JavaScript (ES6),
221292287309274277278 Bytes(-5 Bytes dank Okx)
Beeindruckend. Das war wegen all der Randfälle nicht einfach, aber ich glaube, ich habe es geschafft. Ich hoffe nur , dass es keine Sonderfälle gibt, die gegen die verwendeten regulären Ausdrücke verstoßen könnten. Ich werde mehr Golf spielen, wenn ich kann.
Testschnipsel
quelle
1/0
für verwendenInfinity
.6
mit dem Ausdruck versucht, von dem6 skip 6,~
ich glaube, dass er sein sollte,true
aber er gibt zurückfalse
.false
alsskip
bezieht alles , das es (folgt6,~
in diesem Fall), solange es nicht in Klammern eingewickelt. Deshalb halte ich es zurückgeben solltetrue
auf(6 skip 6),~
anstatt6 skip 6,~
mit Integer - Eingang6
.6 skip 6,~
sollte mit nichts übereinstimmen , da es den Unterschied zwischen der Menge{6}
und der Menge darstellt{6,-Infinity...Infinity}
.Röda + bc, 183 Bytes
Dies ähnelt der PowerShell-Antwort (oder ich glaube, ich verstehe PowerShell nicht). Die Zahl wird als Argument und der Code als Wert im Eingabestream verwendet
main { push("1~9") | f(5) }
.Ich denke es funktioniert, zumindest löst es alle Testfälle. Das folgende Skript kann verwendet werden, um dies zu überprüfen.
Und die Tests:
quelle