Ich bin auf SVGCaptcha gestoßen und wusste sofort, dass es eine schlechte Idee war.
Ich möchte, dass Sie zeigen, wie schlecht diese Idee ist, indem Sie den Validierungscode aus den von diesem Code erzeugten SVG-Bildern extrahieren.
Ein Beispielbild sieht folgendermaßen aus:
Hier ist die Quelle des Beispielbildes:
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve"
width="200" height="40"
> <rect x="0" y="0" width="200" height="40"
style="stroke: none; fill: none;" >
</rect> <text style="fill: #4d9363;" x="5" y="34" font-size="20" transform="translate(5, 34) rotate(-17) translate(-5, -34)">8</text>
<text style="fill: #be8b33;" x="125" y="29" font-size="21" transform="translate(125, 29) rotate(17) translate(-125, -29)">f</text>
<text style="fill: #d561ff;" x="45" y="35" font-size="20" transform="translate(45, 35) rotate(-2) translate(-45, -35)">4</text>
<text style="fill: #3de754;" x="85" y="31" font-size="21" transform="translate(85, 31) rotate(-9) translate(-85, -31)">8</text>
<text style="fill: #5ed4bf;" x="25" y="33" font-size="22" transform="translate(25, 33) rotate(16) translate(-25, -33)">u</text>
<text style="fill: #894aee;" x="105" y="28" font-size="25" transform="translate(105, 28) rotate(9) translate(-105, -28)">1</text>
<text style="fill: #e4c437;" x="65" y="32" font-size="20" transform="translate(65, 32) rotate(17) translate(-65, -32)">x</text>
</svg>
Die Eingabe ist das SVG-Bild, bei dem es sich um ein Textformat handelt.
Die einzige wirkliche Einschränkung ist, dass Ihr Code die Werte in der richtigen Reihenfolge erzeugen muss .
Die Eingabeelemente <text>
sind in zufälliger Reihenfolge, sodass Sie auf das x
Attribut im <text>
Tag achten müssen
Score ist die Anzahl der Bytes im Code
Da der Code derzeit zwei Transformationen durchführt, die sich gegenseitig aufheben, können Sie diese ignorieren. Wenn Sie sie jedoch berücksichtigen, reduzieren Sie Ihre Punktzahl um 30%.
Antworten:
Bash ,
635639 BytesHinweis: erfordert
cat
,grep
,sort
,rev
, undcut
. Übernimmt die Eingabe von stdin. Die Ausgabe wird bei stdout durch Zeilenumbrüche getrennt. Stellen Sie sicher, dass Sie STRG + D (nicht BEFEHLSTASTE + D auf dem Mac) drücken, wenn Sie mit der Eingabe von CAPTCHA fertig sind.Nach der Eingabe muss eine neue Zeile und dann '_' eingegeben werden.BEARBEITEN : 13 Bytes gespeichert.
EDIT 2 : Dank @manatwork 20 Bytes gespart !
quelle
sort
unterstützt die Zeichenposition in der Tastendefinition:cut -c4-|sort -n
→sort -k1.4n
.CJam, 26 Bytes
Probieren Sie es online im CJam-Interpreter aus .
Wie es funktioniert
quelle
JavaScript,
959391 Bytesedit: -2 Bytes ändern
documentRoot
auflastChild
; -2 Bytes Wechseljoin('')
zujoin``
dank VɪʜᴀɴGeben Sie Code in die Browserkonsole auf einer Seite ein, die die betreffende SVG-Datei enthält und in die Konsolenausgabe schreibt.
quelle
document.rootElement
ist undefiniert. Ich habe Firefox und Safari versucht('')
beiden Backticks ändern: ``t=>(l=[],r=/x="(\d*).*?>(.)/g,eval("while(e=r.exec(t))l[e[1]]=e[2];l.join``"))
(nimmt XML-String als Parameter, gibt Captcha-Text zurück)Perl, 40 Bytes
39 Byte Code + 1 für -n
Beispiel:
quelle
Bash + GNU-Dienstprogramme, 53
Wie diese Antwort ist die Ausgabe ein Zeichen pro Zeile.
quelle
Perl 6 , 68 Bytes
quelle
Befunge, 79 Bytes
Es fühlt sich an, als ob es möglich sein sollte, mindestens ein weiteres Byte davon zu golfen, aber ich arbeite jetzt seit ein paar Tagen daran, und das ist so gut, wie ich es bekommen könnte.
Probieren Sie es online!
Erläuterung
Machen Sie die Ausführungsrichtung von rechts nach links und drehen Sie sich um, um die Hauptschleife zu starten.
Lesen Sie ein Zeichen aus stdin und prüfen Sie, ob das Dateiende erreicht ist.
Wenn es nicht das Ende der Datei ist, überprüfen Sie, ob es eine ist
>
.Wenn dies nicht
>
der Fall ist, addieren Sie es zu dem Wert auf dem Stapel, der die letzten beiden Zeichen verfolgt, und überprüfen Sie, ob das aktuelle Paar übereinstimmtx=
.Wenn nicht, multiplizieren Sie mit 126 und mod mit 126 2 , um den ältesten Wert aus dem Paar zu entfernen und Platz für das nächste Zeichen zu schaffen.
Wickeln Sie erneut um, um die Hauptschleife zu wiederholen.
Wenn ein
x=
Paar gefunden wird, überspringen Sie das nächste Zeichen (das Anführungszeichen), lesen Sie eine Ganzzahl (den x- Wert) und dividieren Sie durch 20. Dies wird der aktuelle Versatz, der für später gespeichert wird.Wenn a
>
auftritt, lesen Sie das nächste Zeichen (normalerweise einen der Captcha-Buchstaben) und speichern Sie dieses Zeichen am aktuellen Versatz in einem "Array". Setzen Sie den Versatz auf 9 zurück, damit der Captcha-Buchstabe bei späteren>
Zeichen nicht überschrieben wird .Wenn das Dateiende erreicht ist, iterieren Sie über die 7 im Array gespeicherten Werte und geben Sie sie einzeln aus. Das sollte Ihnen alle Captcha-Buchstaben in der richtigen Reihenfolge geben.
Ich beschreibe hier einige Details, da sich die Codepfade auf eine Weise überlappen, die etwas schwierig zu erklären ist, aber Ihnen eine allgemeine Vorstellung davon geben sollte, wie der Algorithmus funktioniert.
quelle
Python2, 129 Bytes
Nimmt die HTML-Quelle auf stdin, erzeugt Code auf stdout.
quelle
<text>
Elemente sind in zufälliger Reihenfolge und die einzige wirkliche Anforderung ist, dass Sie sie in die richtige Reihenfolge bringen müssen. Das heißt, Sie müssen diex
von verwenden<text>
und alle Transformationen folgen.Mathematica, 106 Bytes
Hinweis: Die Eingabe muss genau das Format haben, das im Beispiel angegeben ist.
quelle
V ,
28262524 BytesProbieren Sie es online!
Erläuterung:
HexDump:
quelle
QuadS , 49 Bytes
Probieren Sie es online!
Findet x-Werte (Ziffernfolgen nach
x="
) und "Buchstaben" (durch Schließen und Öffnen von Tags fixiert) und führt dann die folgende APL aus (wobei⍵
die Liste der gefundenen x-Werte und Buchstaben in der Reihenfolge ihres Auftretens ist):3↓⍵
Löschen Sie die ersten drei Elemente (Leerzeichen um<rect
.../rect>
und den<rect
Wert 'sx).(
…)
Wenden darauf folgende implizite Funktion an:≢
die Anzahl der verbleibenden Artikel.5×
halbiere das2,⍨
füge eine Zwei hinzu⊢⍴⍨
Umformen in diese Form (dh eine n × 2-Matrix)⍉
transponieren (in eine 2 × n Matrix)⍎¨@1
führe jeden String in der ersten Zeile aus (verwandle sie in Zahlen)↓
Teilen Sie die Matrix in zwei Vektoren (einen pro Zeile)x c←
Speichern Sie diese beiden in x (x-Werte) und c (Zeichen)⊃
wähle das erste (x)⍋
Hochstufen (die Indizes in x, die x sortieren würden)c[
...]
benutze das um zu indexierenc
∊
ϵ nlist (Abflachen), da jeder Buchstabe eine Zeichenfolge für sich istDer äquivalente APL-Ausdruck des gesamten QuadS-Programms lautet:
quelle
Java 8,
197173 BytesGibt ein
java.util.Collection
Zeichen aus.Erläuterung:
Probieren Sie es online aus.
quelle
Gema , 65 Zeichen
In Gema gibt es keine Sortierung, aber zum Glück wird nicht einmal benötigt.
Probelauf:
quelle
XMLStarlet , 46 Zeichen
Hoffentlich ist dies eine gültige Lösung, da XMLStarlet ein Transpiler ist, der XSLT-Code generiert und ausführt, der eine vollständige Sprache von Turing ist.
Probelauf:
quelle
PHP, 96 Bytes
Vorausgesetzt, das
$i
ist die Eingabezeichenfolgequelle
array_combine()
+ksort()
könnten Siearray_multisort()
wie folgt aus :array_multisort($m[1],$m[2]);echo join($m[2]);
. Beachten Sie jedoch, dass Lösungen die Ein- und Ausgabe selbst übernehmen müssen (sofern die Sprache dies nicht automatisch tut), anstatt die Eingabe in einer Variablen zu finden oder das Ergebnis einfach in einer Variablen zu belassen. Siehe verwandte Meta .Sauber ,
277150 BytesYay Pattern Matching!
Probieren Sie es online!
Definiert die Funktion
?
, Nehmen[Char]
und Geben[Char]
.quelle