Schreiben Sie einen regulären Ausdruck, der einer bestimmten Zeichenfolge entspricht, die aus drei nicht negativen, durch Leerzeichen getrennten Ganzzahlen besteht, und zwar genau dann, wenn die letzte Ganzzahl die Summe der beiden vorhergehenden ist. Die Antworten können für ganze Zahlen eines beliebigen Zahlensystems mit einem Radix zwischen 2 und 10 erfolgen.
Testfälle
Diese sollten fehlschlagen:
0 1 2
10 20 1000
Diese sollten übereinstimmen mit:
10 20 30
28657 46368 75025
0 0 0
Regeln
Ihre Antwort sollte aus einem einzelnen regulären Ausdruck ohne zusätzlichen Code bestehen (mit Ausnahme einer optionalen Liste von regulären Ausdrucksmodifikatoren, die erforderlich sind, damit Ihre Lösung funktioniert). Sie dürfen keine Funktionen der Regex-Variante Ihrer Sprache verwenden, mit denen Sie Code in der Hosting-Sprache aufrufen können (z. B. der e-Modifikator von Perl).
Bitte geben Sie in Ihrer Antwort Ihren Regex-Geschmack an.
Dies ist Regex-Golf, also gewinnt der kürzeste Regex in Bytes. Wenn in Ihrer Sprache Begrenzer (normalerweise /.../) für reguläre Ausdrücke erforderlich sind, zählen Sie die Begrenzer nicht selbst. Wenn Ihre Lösung Modifikatoren erfordert, fügen Sie ein Byte pro Modifikator hinzu.
Dank an Martin Ender und jaytea für die Regex-Golfregeln.
Ich habe Grund zu der Annahme, dass es basierend auf der Lösung von Martin Ender möglich ist , Ganzzahlen mit Regex zu finden und zu erhöhen .
quelle
/e
Modifikator von Perl 5 gilt nur für Ersetzungen und ist nicht die einzige Möglichkeit, externen Code auszuführen. Auch dies disqualifiziert Perl 6 vollständig, da ein regulärer Ausdruck nur eine Methode mit zusätzlicher Syntax ist. (Der Grund dafür ist, dass reguläre Ausdrücke einfacher zu lesen und zu schreiben sind.) Daher werden alle Funktionen, die in archaischen regulären Ausdrücken benötigt werden, nicht benötigt (oder sind enthalten), da Sie gerade Perl 6-Code eingegeben haben. (es wahrscheinlich Sinn ist nicht möglich , diese Herausforderung zu tun , wenn Sie auf regex spezifischen Code begrenzen nur)/^(\d+)**3%' '$ <?{$0[2]==[+] $0[0,1]}>/
oder/^(\d+)' '(\d+)' '(\d+)$ <?{$2==$0+$1}>/
oder/^(\d+)' '(\d+){}" {$0+$1}"$/
Antworten:
Perl / PCRE: 2.685 Bytes
Probieren Sie es online!
Ich war nach einer Pause von Regex auf der Suche nach schwierigen Herausforderungen und bin zufällig über diesen Trottel gestolpert. Die Überprüfung der Hinzufügung (mit Perl / PCRE) ist etwas, worüber ich bereits nachgedacht habe, wurde jedoch umgehend als unmöglich oder über meine Möglichkeiten hinaus abgetan. Allerdings habe ich es jetzt noch einmal durchgesehen und bin sehr erfreut zu sagen, dass ich es tatsächlich geschafft habe!
Ich habe nicht wirklich Golf gespielt, außer kurze Algorithmen und die gesamte Matching-Technik zu berücksichtigen, als ich es geschrieben habe. Ich bin nur sehr froh, dass ich es geschafft habe: D
Wenn die Leute interessiert sind, könnte ich Kommentare hinzufügen und erklären, wie es funktioniert.
Bearbeiten: Ich habe in meinem Blog einen ausführlichen Beitrag dazu verfasst, mit Erläuterungen und Kommentaren :) Viel Spaß: http://www.drregex.com/2018/09/a-regex-i-submitted-to-reddit-climbed.html
quelle
.NET-Variante,
139111106 + 1 = 107 ByteBenötigt den
RightToLeft
Modifikatorr
. Eingabe in binärer Form.Probieren Sie es online! (Mit Retina .)
Ja für Bilanzkreise. Das erkläre ich später ...
Dezimalversion,
340243 + 1 = 244 ByteProbieren Sie es online!
quelle
.NET, 96 Bytes
Flagge:
r
Probieren Sie es online!
Dezimalversion, 238 Byte
Flagge:
r
Probieren Sie es online!
Ähnlich wie Martins Antwort.
quelle