Schreiben Sie ein Programm oder eine Funktion, die bei Angabe einer Zeichenfolge so viele unterschiedliche Bytes wie möglich herausfiltert und die bereinigte Zeichenfolge zurückgibt. Da Ihr Programm sie jedoch hasst, kann keines dieser Bytes in Ihrem eigenen Code vorhanden sein.
Ihre Punktzahl ist die Anzahl der unterschiedlichen Bytes, die Ihr Programm aus der Eingabe herausfiltert. Je höher, desto besser. Dies ist eine maximale Punktzahl von 255 (da Ihr Programm mindestens ein Byte lang sein muss). Der Tiebreaker ist die Länge Ihres Codes, wobei weniger besser ist.
Wenn Ihr Programm beispielsweise die Bytes herausfiltert 0123456789
, erhält es eine Punktzahl von 10, aber Ihr Programm selbst kann diese Bytes nicht enthalten.
Regeln
- Bytes bedeuten Oktette.
- Sie haben auch die Möglichkeit, Eingaben als Liste von Ganzzahlen mit Werten zwischen 0 und 255 vorzunehmen. Diese entsprechen den entsprechenden Bytes.
- Ihre Ausgabe sollte dieselbe Form haben wie Ihre Eingabe
- Kein Lesen Ihres Quellcodes
- Ihr Code darf nicht leer sein
- Ja, ich weiß, dass es eine linguistische / unäre Antwort geben wird. Aber bitte wenigstens Golf spielen?
;)
Regel bearbeiten:
- Sie können ein Byte ignorieren, z. B. wenn es nicht vom Abschlussbyte für eine Zeichenfolge oder für EOF unterschieden werden kann. Dies bedeutet jedoch, dass Sie es weder in Ihrer Einreichung verwenden können, noch zählt es für Ihre Punktzahl. Wenn Sie sich dazu entschließen, beträgt Ihre maximale Punktzahl 254, aber Sie müssen dieses Byte in Ihrer Eingabe nicht verarbeiten.
Antworten:
Japt
-P
, Punktzahl: 255 (2 Bytes)f => filter, second f => everything but 'f'
Probieren Sie es online!
Japt , Punktzahl: 255 (2 Bytes)
Aus @Shaggy
o => remove everything but, second o => 'o'
Probieren Sie es online!
quelle
oo
würde auch funktionieren, ohne die-P
flagge.Python 2 , Score 249, 1732 Bytes
Probieren Sie es online!
Entfernt alles bis auf
exc%="
und Zeilenumbrüche. Die Codegenerierung erfolgt durch xsot . Ich bezweifle, dass es optimiert ist, also gibt es hier viele Bytes zu speichern!quelle
Haskell, Score
249250,1088335 BytesDefiniert eine Funktion
!:
, die eine Liste von ganzen Zahlen aufnimmt und alle außer10,33,40,41,58,61
den ASCII-Codes von herausfiltert\n ! ( ) : =
.Probieren Sie es online!
So funktioniert es: Zuerst benennen wir die Funktionen und Parameter in sinnvolle Namen um:
Die Hauptidee ist, eine Liste von zwei verschiedenen Funktionen (
listOfFunctions
) zu haben, eine, um ein Element zu behalten (k
) und eine, um es zu löschen (d
). Die Liste wird durch das aktuelle Element aus der Eingabeliste (x
) indiziert, und die Funktion, die sie auswählt, bestimmt, ob das Element beibehalten oder gelöscht werden soll. Bei Index 0 haben wird
, weil wirk
0en löschen wollen , den ersten bei Index 10, weil wir 10en (Zeilenvorschub) behalten wollen. Beidek
undd
nehmen zwei Parameter:x
und das Ergebnis eines rekursiven Aufrufs mit dem Rest der Liste (xs
).k
Voranstellenx
des Rekursivaufrufs undd
Rückgabe des Rekursivaufrufs.Die wörtliche Liste der Funktionen endet bei Index 61 (char
=
, der letztek
in der Liste), gefolgt von einer unendlichen Anzahl vond
. Dies erspart nicht nur viele explizite Zeichend
, sondern verhindert auch, dass wir eine endliche Liste beenden müssen,[]
für die zusätzliche Zeichen erforderlich wären.Edit: Danke an @ Ørjan Johansen für +1 Punkte und -753 Bytes.
quelle
|
für Punktzahl 250, 335 Bytes . Definierte auch ein Synonym fürrepeat (!)
die Verkürzung der Liste (drastisch, da|
es weitaus größer war als das zweitgrößte ausgeschlossene Zeichen.(!):
würde wahrscheinlich auch eine Funktion zur Abkürzung einiger dieser langen Sequenzen helfen.!():=
. Das Extrahieren[]
aus einer vorhandenen Liste, z. B. der Eingabeliste, funktioniert nicht, da sie einen Typ[Int]
hat, den wir jedoch benötigen[a->[a]->[a]]
.!
istcurry snd
und=!
ist eine unendliche Liste von diesen, aber das ist alles, was ich daraus verstehen kann.(=!)
, so etwas wie(!=)(=:)=(!):(!):(!):(!):(!):(=:)
oder (High-Level, kann übergeben werden((!):)
oder einen Abschnitt von selbst)(!)!=(=:)=(!)((!)((!)((!)(=:))))
. Viele Optionen zum Optimieren. Anzahl der Wiederholungen, welche Art von zweitem (oder sogar drittem) Argument, und selbst wenn es für die Komprimierung optimaler ist,\n
oder;
(Blocklängen10 22 6 16 2
vs.33 6 16 1
).JavaScript (ES6), Bewertung: 242 (142 Bytes)
Ein eher naiver Ansatz, der ein Array von Bytes für E / A verwendet.
Probieren Sie es online!
Wie?
Die 14 Zeichen, die nicht gefiltert werden, sind
'().=>[]efilrt
. Sie sinde
in der Suchzeichenfolge mit einem gekennzeichnet . Für Zeichen übert
(ASCII-Code 116), die in dieser Zeichenfolge nicht definiert sind,'f'>undefined
ist false .quelle
t=>t.filter(t=>'f'>'fffffffffffffffffffffffffffffffffffffffeeeffffeffffffffffffffeeffffffffffffffffffffffffffffefefffffffeeffeffefffffefe'[t])
. Hier ist ein TIO Test Statement:console.log(f([...Array(256).keys()]).map(c => String.fromCharCode(c)))
APL (Dyalog Unicode) , Score: 253, Tiebreaker: 8 Byte SBCS
Anonyme implizite Präfixfunktion
Probieren Sie es online!
∩
Schnittmenge des Arguments∘
und'∩∘'''
die drei Zeichen im Code (∩∘'
)quelle
POSIX-Shell , 249 Punkte, 18 Bytes
Probieren Sie es online!
Einfacher
tr
Befehl , der alle Zeichen außer-\cdrt
und Leerzeichen löscht . Es sind vier Backslashes erforderlich, da sowohl die Shell als auch dertr
Befehl Backslashes verwenden. Der fünfte Backslash entgeht dem folgenden Leerzeichen.Wenn
tr -cd
es sich um eine Programmiersprache handelte, konnte man ein Einzelbyte-Programm mit einer Punktzahl von 255 schreiben.quelle
tr
enthält Zeichenklassen, wie sie in regulären Ausdrücken verwendet werden, jedoch keine vollständigen regulären Ausdrücke.tr -cd \ cdrt\\-\
Try it online!C (gcc) , Punktzahl
232235239241242,260407352249243249 BytesProbieren Sie es online!
Eine Funktion, die einen Zeiger auf den Anfang und das Ende eines int-Arrays (wobei end das erste nicht enthaltene Zeichen ist), einen Zeiger auf einen Puffer und einen Zeiger auf einen anderen int-Zeiger nimmt. Es schreibt das Ergebnis in den Puffer und den Endzeiger des Ergebnisses in den letzten Zeiger.
quelle
Regex, Score: 255, 2 Bytes
Entspricht dem Charakter
\
.Probieren Sie es online!
quelle
Jelly , Ergebnis 254 (4 Bytes)
Probieren Sie es online!
⁾xy
ist eine Abkürzung für“xy”
(eine zweistellige Zeichenfolge).Wir
f
reduzieren die Eingabezeichenfolge auf die Zeichen, die in vorkommen“f⁾”
.quelle
f⁾⁾f
, entschied mich aber, die Frage nach der Verwendung von Unicode-Zeichenfolgen vor dem Posten zu stellen.Ruby -p, Punktzahl 248 (8 eindeutige Bytes / 483 Bytes)
Probieren Sie es online!
quelle
Python 2 , Score
244245246,133901575 BytesNimmt eine Liste von ganzen Zahlen auf
Probieren Sie es online!
Dies wird in der folgenden Codezeile ausgewertet:
Diese Antwort ist offensichtlich eine theoretische. Die Struktur ist
Theoretisch würde dies wie folgt ablaufen:
Python 3 , Score
240241, 54 Bytes+1 Danke an Jonathan Allan .
Probieren Sie es online!
quelle
\
in Ihrer Py 3-Version durch die Verwendung von dreifachen Anführungszeichen loswerdenb''' ':[]abdfilmnor'''
. In Python 2 könnten Sie für 242: ein vollständiges Programm in der gleichen Art erstellenprint(''.join(p for p in input() if p in ''' '().fijnoprtu'''))
, obwohl es nicht so gut ist wie dasexec
.Sauber , 247,
234,213,208 Bytes-5 Bytes dank Ørjan Johansen
Probieren Sie es online!
Verwendet eine rekursive Mustervergleichsfunktion zum Entfernen von Zeichen. Braucht nicht mal
StdEnv
.quelle
=\
statt verwenden===
.t
undtt
in die vorletzte Zeile.==
, in die umbenannt werden soll , diet
jedoch==
als Synonym für diese gespeichert werden.Perl 5
-p
, Score 251, 13 BytesProbieren Sie es online!
quelle
05AB1E , Score:
252253 (43 verschiedene Bytes verwendet; insgesamt 8 Bytes )Probieren Sie es online aus.
Erläuterung:
Beachten Sie, dass die Reihenfolge von
ÃJ
und„J
in den Zeichenfolgen mit zwei Zeichen wichtig ist, da dies„
auch für Wörterbuchwörter verwendet wird , bei denen alle zwei Zeichen ein Wörterbuchwort sind (mit Ausnahme einiger weniger ausgewählter Zeichen wie Buchstaben, Ziffern-
usw.). Also„JÃ
wäre "ein Wort"J
, sowie ein Wörterbuch-WortÃ
+ das nächste Zeichen (in diesem Fall„
), welches anscheinend das Wort ist"causing"
.quelle
Perl 5, Score 251 (5 verschiedene Bytes, insgesamt 8058 Bytes)
Probieren Sie es online!
Verwendet die
<>^es
Turing-complete-Teilmenge von Perl . Der obige Code wurde durch Ausführen erhaltenprint<>=~y<<>^es><>cdr
durch meine Konverter .quelle
Brachylog , Punktzahl 249, 16 Bytes
Probieren Sie es online!
Nicht ganz sicher, wie das mit den Regeln funktioniert, was mit Brachylog, das eine eigene spezielle Codepage hat und allem, aber ich kann immer noch erklären, wie es funktioniert:
quelle
Oktave , Partitur
248249 (50 Bytes)Es musste einen besseren Weg geben ... und das gibt es!
Probieren Sie es online!
Filtert aber alles raus
@al()'=
. Dieall
Funktion ist überlegenany
, da sie nur zwei verschiedene Bytes verwendet. Beachten Sie, dassany(...)
gleich istnot(all(not(...)))
. Also fangen wir mit dem Programm anAnstelle von
~
(not
) können wir auch schreiben0==
. Das würde natürlich bedeuten, dass wir auch herausfiltern müssen0
. Beachten Sie stattdessen, dass der folgende Ausdruck auch falsch ist (null)Wenn MATLAB-Kompatibilität kein Problem ist, kann ich zu 47 Bytes wechseln
quelle
Sprache (mit
stty +brkint -ignbrk
), Ergebnis 255, 3890951 BytesDas Programm besteht aus 3890951 NUL Bytes (dies ist eines der kürzesten Lenguage-Programme aller Zeiten; 3890951 Bytes sind leicht klein genug, um auf meine Festplatte zu passen, also habe ich dies tatsächlich in einem Lenguage-Interpreter ausgeführt). Die OP wollte, dass die Lenguage / Unary-Lösung zum Golf wird. Also los geht's. (Beachten Sie, dass Unary sehr viel länger ist, da
0
die Verwendung von NUL erforderlich ist, anstatt die Verwendung von NUL zuzulassen.)Beachten Sie, dass sich Lenguage trotz der darin enthaltenen Dokumentation nicht wie Brainfuck verhält. I / O funktioniert ganz anders (was mir beim Testen dieses Programms aufgefallen ist). Insbesondere weigert sich Lenguage, Eingaben von etwas anderem als einem Terminal zu empfangen. Die herausgefilterten Bytes sind also die Rohbytes, die über die Terminalverbindung gesendet werden (beachten Sie auch, dass beim Herausfiltern der Rohbytes das nicht angezeigt wird Tasten, die Sie überhaupt eingeben). In der Praxis bedeutet dies, dass das Programm alle an es gesendeten Eingaben mit Ausnahme des NUL-Bytes (normalerweise als Ctrl-@ eingegeben) aufnimmt, das buchstäblich wiedergegeben wird (an diesem Punkt wird es von der überwiegenden Mehrheit der Terminals ignoriert). als das NUL-Byte ist das Terminal-Äquivalent eines NOP-Befehls). Um zu überprüfen, ob das Programm funktioniert,
Was passiert bei EOF? Nun, wenn das Terminal eine Reihe von Bytes sendet, gibt es keine Möglichkeit, EOF zu senden. Alle 256 möglichen Bytes werden wörtlich interpretiert, und Sie können nichts anderes in den Terminal-Stream einfügen. Wenn Sie jedoch zufällig ein altmodisches serielles Terminal verwenden, können Sie die Taste "break" auf Ihrem Terminal drücken, um absichtlich falsch codierte Daten zu senden, wobei ein 257. möglicher Code berücksichtigt wird. Diese "Unterbrechung" ist die einzige plausible Entsprechung einer EOF, da sie bandextern gesendet wird und auf etwas anderes als gültige Daten hinweist. Wenn in Ihrer Terminalkonfiguration das Flag "Interrupt-on-Break" gesetzt ist (und der Lenguage-Interpreter diese Einstellung, soweit ich das beurteilen kann, nicht ändert), führt das Senden des Unterbrechungssignals zum Absturz des Lenguage-Interpreters. Dies ist eine bequeme Möglichkeit, das gewünschte EOF-Verhalten zu implementieren. Ich bin mir nicht sicher, ob dies eine Standardeinstellung ist (da heutzutage eigentlich niemand serielle Terminals verwendet, kommt sie im Grunde genommen nie zum Einsatz), daher habe ich sie im Header als Teil der Spezifikation des verwendeten Sprachinterpreters erwähnt.
Erläuterung
Die innere Schleife wird nur beendet, wenn NUL am Terminal eingegeben wird. Danach geben wir sofort das eingegebene Zeichen (dh die NUL) wieder. Wenn Sie an dieser Stelle 1 hinzufügen, wird sichergestellt, dass das Bandelement 0 wieder ungleich Null ist, sodass die äußere Schleife überhaupt nicht beendet werden kann (bis eine Unterbrechungseingabe den Interpreter zum Absturz bringt) und wir in die innere Schleife zurückfallen.
Es ist am besten, Subtraktion zu verwenden, um in die äußere Schleife einzutreten, aber zusätzlich, um sie weiter zu durchlaufen. Der Zusatz hat eine kürzere Codierung, kann aber nicht am Programmstart erscheinen (da die Codierung wie führende Nullen aussehen würde und daher ignoriert wird).
quelle
truncate
erstellt keine spärlichen Dateien für mich (unterstützt sie das Dateisystem möglicherweise nicht?). Soweit ich jedoch feststellen kann, liest der Referenz-Lenguage-Interpreter die Eingabedatei zeilenweise (!). Wenn das Programm also keine Zeilenumbrüche enthält, erschöpft ein ausreichend langes Programm den verfügbaren Speicherplatz. Dies könnte natürlich mit einem neuen Interpreter behoben werden.C # (Visual C # Interactive Compiler) , Score 245, 111 Bytes
Probieren Sie es online!
C # (Visual C # Interactive Compiler) , Score 243, 33 Byte
Naive Lösung mit
Intersect
Probieren Sie es online!
quelle
Retina 0.8.2 , 12 Bytes, Score: 250
Probieren Sie es online! Filtert alle Zeichen außer Newline
[
,\
,]
,^
undn
. Obwohl die Zeichen[\]^
aufeinander folgen, würde die Verwendung eines Bereichs tatsächlich ein Byte kosten und auch meine Punktzahl verringern.quelle
Japt , 249 Punkte, 20 Bytes
Probieren Sie es online!
quelle
oQ+"+oQ"Q
oder einfach,oo
aber das ist nur eine Variation der Luis-Lösung.PHP, Score 234,
58,62 BytesLaufen Sie als Pipe mit
-nF
oder probieren Sie es online aus .quelle
Ruby
-paF[^$_=F*']
, 250 Punkte, 8 BytesIch bin mir nicht sicher, ob dies nach den aktuellen Site-Regeln für Befehlszeilen-Flags zulässig ist, da das "Flag" hier eine Art Code-Übergabe ist, der verbotene Bytes enthält. Das
F
Flag definiert einen Regex für das Eingabetrennzeichen, der aus allen Zeichen besteht, die nicht im eigentlichen Code enthalten sind. Der eigentliche Code setzt die Ausgabe auf die Verkettung aller Eingabedatensätze.quelle
MATL , Score 252
Probieren Sie es online!
Erklärung (zur Eingabe
input
)quelle
Pyth , Punktzahl 249, 16 Bytes
Filtert alle Zeichen außer
f
,s
,T
,z
,"
,/
, und\
Probieren Sie es online!
quelle
K, Punktzahl 246, 23 Bytes
{x@&~x in"\"~ in@&{x}"}
{..} ist ein Lambda mit arg x
read as 'gibt x an der Stelle zurück, an der nicht x im String steht'
String enthält \ "~ in @ & {x} (die zehn im Programm verwendeten Bytes)
quelle
sfk , Score 239, 133 Bytes
Probieren Sie es online!
Führt Ersetzungen an der Eingabe durch (geschrieben als
[delim][from][delim][to][delim]
), wobei alle im Programm verwendeten Zeichen in sich selbst geändert werden. Dadurch werden die Zeichenpositionen von der Berücksichtigung für die Eingabe bis zur endgültigen Ersetzung entfernt, beix[byte]xx
der alle Bytes der leeren Zeichenfolge zugeordnet werden.quelle
JavaScript, 250 Punkte,
9557359273 BytesEine leicht golfene JS-Lösung, die dann über den JSFuck-Algorithmus ausgeführt wird . Viele Bytes, aber eine gute Punktzahl.
Original:
Das JSFuck-Rendering umfasst 59273 Zeichen:
quelle
s=>s.replace(/[^![\]+()]/g,'')
sollte funktionierenBrainfuck , Score: 248, 162 Bytes
Probieren Sie es online!
Normalerweise beantworte ich meine eigenen Fragen nicht, aber die Leute scheinen meine profle Seite gelesen zu haben, besonders dort, wo es heißt
If someone comments on a question "I wish there was a brainfuck solution", I feel obliged to provide one.
Die herausgefilterten Bytes sind
-<>[],.
und ignorieren das NUL-Byte, da es von EOF nicht zu unterscheiden ist. Dies ist etwas länger als gewöhnlich, da ich bewusst+
darauf verzichte, etwas bessere Ergebnisse zu erzielen. Trotzdem bin ich möglicherweise in der Lage, den Teil zur Nummerngenerierung zu spielen, um ein paar Bytes zu sparen.quelle
Whitespace , Score: 253 (3 verschiedene Bytes, insgesamt 97 Bytes)
Buchstaben
S
(Leerzeichen),T
(Tabulator) und (Zeilenvorschub) werdenN
nur als Hervorhebungen hinzugefügt.[..._some_action]
nur als Erklärung hinzugefügt.Probieren Sie es online aus (nur mit Leerzeichen, Tabulatoren und Zeilenumbrüchen). Ein netter Bonus ist, dass ich diesen Code verwenden kann, um den oben hervorgehobenen Code in das unformatierte Whitespace-Programm (das ich in diesem TIO als Beispiel verwendet habe) umzuwandeln, für das ich normalerweise Notepad ++ verwende. :)
Erläuterung:
Ziemlich einfach. Hier der Pseudocode:
quelle