Dies wurde von einem Teil des ARML-Wettbewerbs Team Problem # 6 2016 inspiriert.
Hier ist die Herausforderung:
Sie erhalten eine "Platzhalterfolge", bei der es sich um eine Folge von Ziffern und einem anderen Zeichen handelt. Eine Zeichenfolge entspricht dieser Platzhalterfolge mit dem folgenden Pseudocode:
w = wildcard
s = string
# s matches w iff
for all 0 >= i > wildcard.length, w[i] == '?' or s[i] == w[i]
Wo '?' ist ein Charakter Ihrer Wahl.
Stellen Sie sich in Bezug auf Regex das '?'
vor '.'
.
Die Herausforderung besteht darin, alle quadratischen Zahlen zu finden (die Anforderung beträgt bis zu 1 Million), deren Dezimalzeichenfolgen mit dieser Platzhalterfolge übereinstimmen. Das "Platzhalterzeichen" kann ein beliebiges ASCII-Zeichen Ihrer Wahl sein, sofern es sich offensichtlich nicht um eine Ziffer handelt.
Zum Beispiel 4096
stimmt 4**6
und stimmt 4*9*
aber 4114
auch nicht überein.
Eingang
Die Eingabe erfolgt als Sequenz, die dem regulären Ausdruck entspricht [0-9?]+
. Dies kann eine Zeichenfolge, ein Zeichenarray oder ein Bytearray der Zeichen in ASCII sein.
Ausgabe
Die Ausgabe erfolgt durch eine beliebige Liste / Menge / Anordnung von Zahlen, die perfekte Quadrate sind und mit der Platzhalterfolge übereinstimmen.
Beispiele für gültige Eingaben:
1234567*90
1234567?90
1234567u90
['1', '2', '3', '4', '5', '6', '7', '*', '9', '0']
[49, 50, 51, 52, 53, 54, 55, 42, 57, 48]
[1, 2, 3, 4, 5, 6, 7, '*', 9, 0]
Beispiele für gültige Ausgaben:
[1, 4, 9]
1 4 9
1, 4, 9
1-4-9
etc.
Spezifikationen
- Sie dürfen keine eingebauten Elemente verwenden, um eine Liste von Quadraten in einem bestimmten Bereich zu finden
- Standardschlupflöcher gelten
- Sie müssen in der Lage sein, bis zu 1 000 000 (1 Million) zu verarbeiten.
- Wenn mit der Eingabe versehen
1******
, ist das Drucken korrekt[1000000]
. Es ist auch richtig zu drucken[1000000, 1002001, 1004004, 1006009, 1008016, 1010025, ...]
- Platzhaltersequenzen beginnen niemals mit dem Platzhalterzeichen. Das heißt, sie stimmen immer mit Zeichenfolgen gleicher Länge überein.
Testfälle
4**6 -> [4096, 4356]
1**1 -> [1521, 1681]
1** -> [100, 121, 144, 169, 196]
9****9 -> [908209, 915849, 927369, 935089, 946729, 954529, 966289, 974169, 986049, 994009]
9*9*** -> [919681, 929296]
1**0* -> [10000, 10201, 10404, 10609, 12100, 14400, 16900, 19600]
9***4 -> [91204, 94864, 97344]
Gewinnen
Kürzeste (gültige) (Arbeits-) Einreichung bis zum 14. Februar, Gleichstand durch frühesten Gewinner der Einreichung.
?
welche vom Antwortenden zu wählen ist.25
eine gültige Antwort für,***
aber nicht für*2*
?{4, "w", "w", 6}
(oder noch besser{4, w, w, 6}
) sein, anstatt ein Array von Zeichen wie{"4", "w", "w", "6"}
?Antworten:
05AB1E , 22 Bytes
Hier gibt es wahrscheinlich viel Raum für Verbesserungen.
Jede Nicht-Ziffer ist als Platzhalter in Ordnung.
Probieren Sie es online aus!
Erklärung nach weiterem Golfen.
quelle
Mathematica, 44 Bytes
Die Eingabe ist eine Liste von Ziffern mit einem
_
(keine Anführungszeichen) als Platzhalter. z.B{4, _, _, 6}
Erläuterung
Liste erstellen
{1, 2, 3, ... , 1000}
Platziere es. (Liste aller Quadrate von 1 bis 1.000.000)
Teilen Sie jedes Quadrat in eine Ziffernliste.
Suchen Sie diejenigen, die dem durch die Eingabe angegebenen Muster entsprechen.
Drucken Sie sie aus.
quelle
Brachylog , 23 Bytes
Probieren Sie es online aus!
Erläuterung
Unterschiedliches Eingabeformat, 13 Bytes
Abhängig davon, was Sie als Eingabe für gültig halten, können Sie Folgendes tun:
Probieren Sie es online aus!
Dies ist im Grunde der zweite Teil der obigen Antwort mit einer Liste als Eingabe, die Ziffern und Variablen enthält, in denen sich die Platzhalter befinden.
Ich halte dies jedoch nicht für gültig, da es in Brachylog nur 26 Variablennamen gibt (Großbuchstaben). Dies würde also nicht funktionieren, wenn Sie mehr als 26 Wilcards hätten.
quelle
true.
), aber ich habe noch keine Sprachen verwendet, die dies erfordern. Ich werde versuchen, eine Referenz zu finden, um zu bestimmen, wie ich dies bewerten soll, aber es wäre sinnvoll, es als 23 zu bewerten, also werde ich es dabei belassen.Perl 6 ,
3026 BytesDanke an @ b2gills für -4 Bytes!
Verwendet den Punkt als Platzhalterzeichen, damit die Eingabe als regulärer Ausdruck verwendet werden kann:
Probieren Sie es online aus .
Eine Variante, die das Sternchen als Platzhalter akzeptiert (wie in einer früheren Überarbeitung der Aufgabenbeschreibung vorgeschlagen), wäre 42 Byte:
quelle
{ ... }("9*9***")
) oder einer Variablen / einem Symbol zur späteren Verwendung zuweisen. Beachten Sie, dass Perl 6 eine von Perl getrennte Sprache ist, sodass es mit einem Perl-Interpreter nicht funktioniert.sudo apt-get install rakudo
habe ich einen vermeintlichen Perl6-Interpreter bekommen ... Wenn ichperl6
einen Befehl in mein Terminal eingebe, wird ein scheinbar Perl6-Interpreter gestartet, aber ich weiß nicht, wie ich ihn verwenden soll. Ich weiß, dass es ein Lambda ist, aber ich weiß nicht, wie ich es nennen soll.perl6 foo.p6
. Sie können es auch in einem Shell-Oneliner testen, wieperl6 -e 'say {grep /^<$_>$/,map * **2,^1e4}( "9.9..." )'
Ruby, 54 Bytes
Funktion, die ein String-Argument akzeptiert. Probieren Sie es online aus.
quelle
#
den Rest der Zeile zu einem Kommentar macht.Stapel, 109 Bytes
Wird
?
als Platzhalter verwendet. Funktioniert durch Erstellen von 1000 Dateien. Der Name der Datei ist die quadratische Nummer, und die Erweiterung der Datei ist die quadratische Nummer mit einem$
Suffix. Dies liegt daran , Batch des Musterabgleich zählt nachlauf?
s als optional, so1?
passt auf beide1
und16
; das$
zwingt daher die Übereinstimmung, genau zu sein. Wir möchten das jedoch nicht ausgeben$
, daher geben wir den Dateinamen nur ohne Erweiterung aus.quelle
JavaScript (ES6),
6866 ByteBEARBEITEN: Meine Lösung unten wurde aktualisiert, nachdem ich mich von der Antwort von JungHwan Min inspirieren ließ . Es ist jetzt ES6-kompatibel.
Nimmt Eingaben in dem Format vor,
'1..4'
in dem.
sich der Platzhalter befindet.Anstatt zu 1e6 zu iterieren und das Quadrat zu verwurzeln, iteriert dieses zu 1e3 und Quadraten.
Code-Snippet anzeigen
JavaScript (ES7),
7169 BytesErstellt ein Array von Zahlen von 0 bis 1e6 und filtert es dann nach Zahlen, die quadratisch sind und mit dem Muster übereinstimmen.
Es ist schrecklich langsam, weil es immer zu 1e6 iteriert.
Code-Snippet anzeigen
quelle
**
es funktioniert, weil es mir eine gibt"SyntaxError: expected expression, got '*'"
.1e6
...**
Operator nicht existiert, zumindest nicht in meinem System.**
. Ja, es ist ES7. Ich werde den Titel aktualisieren. Hier ist eine Liste der derzeit unterstützten Browser. Developer.mozilla.org/en/docs/Web/JavaScript/Reference/…Perl,
424538 BytesEDIT: Klarstellung von Alex, wir können den Punkt als Platzhalterzeichen verwenden, das die y // -Operation abschneidet.
BEARBEITEN: Lösung, die das Sternchen als Platzhalterzeichen verwendet und die Platzhalterfolge auf STDIN erwartet
Dieser lässt zweifellos viel Raum für Verbesserungen, es ist ziemlich einfach. Der Platzhalterausdruck wird als Befehlszeilenargument mit dem Punkt-Platzhalterzeichen erwartet (was noch?).
quelle
Python 3 -
9897 BytesBenötigt Eingaben wie '4..6'.
quelle
import re
und speichernre.findall
; Die Optimierung mit demfrom...import *
optimiert es in diesem Fall nicht wirklich.1....
, es gibt1 4 9
und16 25
als gültige Antworten, was nicht korrekt ist. Bitte korrigieren Sie Ihr Programm.1......
. Es kehrt zurück[]
, aber es sollte geben[1000000]
. Dies kann zu einem Preis von 0 Bytes behoben werden, indemrange(0, 1001)
anstelle von verwendet wirdrange(0, 1000)
.k - 28 Zeichen
Wird
?
als Platzhalterzeichen verwendet. Dielike
Funktion wird?
als Platzhalter verwendet. Diese Funktion erstellt eine Liste der ersten 1001 Quadrate (einschließlich 1M), wandelt sie alle in Zeichenfolgen um und überprüft dann, wo sie mit dem Muster übereinstimmen.quelle
type error {s(&:)($:s:s*s:!1001)like x} "1" at execution instance 2 of ":"
. Könnten Sie einen Link zu einer funktionierenden Testsuite bereitstellen oder prüfen, ob ein Problem vorliegt?Bash + Unix-Dienstprogramme, 33 Bytes
Dies verwendet '.' als Platzhalterzeichen.
Das DC-Programm druckt die quadratischen Zahlen in einer Endlosschleife:
Die Gleichstromausgabe wird an grep weitergeleitet, wodurch nur die Quadrate gedruckt werden, die dem erforderlichen Muster entsprechen.
Dies funktioniert, wenn ich es auf einem tatsächlichen Linux- oder OS X-System ausführe (aber es funktioniert nicht bei TIO, wahrscheinlich weil das DC-Programm versucht, für immer zu rekursieren, und ich vermute, dass TIO nicht mehr genügend Speicherplatz für die Rekursion hat und / oder hat ein Problem mit der nie endenden Pipe).
quelle
dc
Befehl.--line-buffered
auf beiden Seiten des zu platzieren^$1$
, aber es funktioniert nicht so oder so.sed s/./0/g<<<$1
| grep ^ $ 1 $ Dies verwendet die Länge von Muster zur Begrenzung der getesteten Zahlen (4-stellige Muster prüfen nur bis zu 9999 usw.). Hier ist ein TIO-Link: tio.run/nexus/…grep
. Da es sich derzeit jedoch nicht um die kürzeste Lösung handelt, werde ich sie für die Bewertung auf 33 Byte belassen. Es scheint für alle Eingaben zu funktionieren, also gute Arbeit!