Besiege SVGCaptcha


79

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:
8u4x8lf

<?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 xAttribut 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%.


3
Sie haben nicht explizit angegeben, was die Eingabe und Ausgabe sind: Ich gehe von der SVG-Datei und den darin enthaltenen Buchstaben aus? Und mir ist nicht klar, ob Antworten erforderlich sind, um die SVG-Spezifikation tatsächlich zu implementieren, oder ob davon ausgegangen werden kann, dass die SVG von der aktuellen Version von SVGCaptcha generiert wird und die Transformationen ignoriert werden können.
Peter Taylor

Ich schlage vor, die Ausgabe auf STDOUT oder den Funktionsrückgabewert zu beschränken und sie zum Code-Golf zu machen
TheDoctor

1
Nein, Fragen benötigen ein objektives, quantifizierbares Gewinnkriterium, um auf dieser Website zum Thema zu gelangen.
Alex A.

7
Ich bin mir nicht sicher, wie relevant die Bildverarbeitung hier ist.
SuperJedi224

18
Diese Frage ist nun das 4. Ergebnis beim googeln von 'svgcaptcha' :)
Blue

Antworten:


18

Bash , 63 56 39 Bytes

cat<<_|grep -o 'x=.*>'|cut -c4-|sort -n|grep -o '>.</t'|cut -c2

grep -o 'x=.*>'|cut -c4-|sort -n|grep -o '>.</t'|cut -c2

grep -o 'x=.*<'|sort -k1.4n|rev|cut -c2

Hinweis: erfordert cat, grep , sort, rev, und cut. Ü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 !


GNU coreutils sort unterstützt die Zeichenposition in der Tastendefinition: cut -c4-|sort -nsort -k1.4n.
Handarbeit

@manatwork Danke, ich habe die Antwort aktualisiert.
Coder256

13

CJam, 26 Bytes

q"x="/2>{'"/1=i}${'>/1=c}/

Probieren Sie es online im CJam-Interpreter aus .

Wie es funktioniert

q     e# Read all input from STDIN.
"x="/ e# Split it at occurrences of "x=".
2>    e# Discard the first two chunks (head and container).
{     e# Sort the remaining chunks by the following key:
  '"/ e#   Split at occurrences of '"'.
  1=  e#   Select the second chunk (digits of x="<digits>").
  i   e#   Cast to integer.
}$    e#
{     e# For each of the sorted chunks:
  '>/ e#   Split at occurrences of '>'.
  1=  e#   Select the second chunk.
  c   e#   Cast to character.
}/    e#

8

JavaScript, 95 93 91 Bytes

l=[],r=/x="(\d*).*>(.)/g;while(e=r.exec(document.lastChild.innerHTML))l[e[1]]=e[2];l.join``

edit: -2 Bytes ändern documentRootauf lastChild; -2 Bytes Wechsel join('')zu join``dank Vɪʜᴀɴ

Geben Sie Code in die Browserkonsole auf einer Seite ein, die die betreffende SVG-Datei enthält und in die Konsolenausgabe schreibt.


document.rootElementist undefiniert. Ich habe Firefox und Safari versucht
Downgoat

Dies wurde nur in Chrome getestet, ich werde untersuchen, was geändert werden könnte.
Nickson

Es scheint in Firefox zu funktionieren, ist SVG der einzige Inhalt der Datei?
Nickson

Okay, habe es in Chrome ausprobiert, jetzt hat es funktioniert. +1. Sie können auch zwei Bytes speichern, indem Sie die ('')beiden Backticks ändern: ``
Downgoat

Dies ist 78: 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)
DankMemes

7

Perl, 40 Bytes

39 Byte Code + 1 für -n

$a[$1]=$2 for/x="(.+)".+(.)</g}{print@a

Beispiel:

perl -ne '$a[$1]=$2 for/x="(.+)".+(.)</g}{print@a' <<< '<example from above>'
8u4x81f

Mann, das ist nur voll von Warnungen, wenn Sie sie einschalten. Hervorragende Verwendung von Perls Standard-Lockerheit.
Brad Gilbert b2gills

@ BradGilbertb2gills Ja, ich versuche die Warnungen nicht zu testen, ich bin so überrascht, dass jeder Golfcode manchmal sogar funktioniert!
Dom Hastings



3

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.

<%*:"~"*"~"_~&45*/99p1v-">":_|#`0:~<
#,:#g7-#:_@^-+*"x~=":+_~99g7p>999p#^_>>#1+

Probieren Sie es online!

Erläuterung

Quellcode mit hervorgehobenen Ausführungspfaden

*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 übereinstimmt x=.
*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.


2

Python2, 129 Bytes

import re,sys
print''.join(t[1] for t in sorted(re.findall(r'(\d+), -\d+\)"\>(.)\</t',sys.stdin.read()),key=lambda t:int(t[0])))

Nimmt die HTML-Quelle auf stdin, erzeugt Code auf stdout.


Wie wird die Ausgabe sortiert? Die <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 die xvon verwenden <text>und alle Transformationen folgen.
Brad Gilbert b2gills

@ BradGilbertb2gills Das habe ich beim ersten Mal verpasst, jetzt behoben.
Orlp

2

Mathematica, 106 Bytes

""<>(v=ImportString[#~StringDrop~157,"XML"][[2,3,4;;;;2]])[[;;,3]][[Ordering[FromDigits/@v[[;;,2,2,2]]]]]&

Hinweis: Die Eingabe muss genau das Format haben, das im Beispiel angegeben ist.


2

V , 28 26 25 24 Bytes

d5j́x=
ún
J́">
lH$dÍî

Probieren Sie es online!

Erläuterung:

d5j              delete first 6 lines
   Í<0x81>x=     In every line, replace everything up to x=" (inclusive) by nothing
ún               Sort numerically
J                Join line (closing </svg>) with next line
 Í<0x81>">       In every line, replace everything up to "> by nothing
l␖H$d            Visual block around closing </text> tags, delete
     Íî          In every line, replace \n by nothing.

HexDump:

00000000: 6435 6acd 8178 3d0a fa6e 0a4a cd81 223e  d5j..x=..n.J..">
00000010: 0a6c 1648 2464 cdee                      .l.H$d..

2

QuadS , 49 Bytes

c[⍋⊃x c←↓⍎¨@1⍉(⊢⍴⍨2,⍨.5×≢)3↓⍵]
x="(\d+)
>(.)<
\1

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 <rectWert 'sx).

() Wenden darauf folgende implizite Funktion an:

 die Anzahl der verbleibenden Artikel

.5× halbiere das

2,⍨ 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 ist


Der äquivalente APL-Ausdruck des gesamten QuadS-Programms lautet:

c[⍋⊃x c←↓⍎¨@1⍉(⊢⍴⍨2,⍨.5×≢)3'x="(\d+)"' '>(.)<'S'\1'⊢⎕]

1

Java 8, 197 173 Bytes

import java.util*;s->{String a[]=s.split("x=\""),r="";Map m=new TreeMap();for(int i=2;i<a.length;m.put(new Long(a[i].split("\"")[0]),a[i++].split(">|<")[1]));return m.values();}

Gibt ein java.util.CollectionZeichen aus.

Erläuterung:

Probieren Sie es online aus.

import java.util*;            // Required import for Map and TreeMap
s->{                          // Method with String as both parameter and return-type
  String a[]=s.split("x=\""), //  Split the input by `x="`, and store it as String-array
         r="";                //  Result-String, starting empty
  Map m=new TreeMap();        //  Create a sorted key-value map
  for(int i=2;                //  Skip the first two items in the array,
      i<a.length;             //  and loop over the rest
    m.put(new Long(a[i].split("\"")[0]),
                              //   Split by `"` and use the first item as number-key
          a[i++].split(">|<")[1]));
                              //   Split by `>` AND `<`, and use the second item as value
    return m.values();}       //  Return the values of the sorted map as result

1

Gema , 65 Zeichen

x\="<D>*\>?=@set{$1;?}
?=
\Z=${5}${25}${45}${65}${85}${105}${125}

In Gema gibt es keine Sortierung, aber zum Glück wird nicht einmal benötigt.

Probelauf:

bash-4.4$ gema 'x\="<D>*\>?=@set{$1;?};?=;\Z=${5}${25}${45}${65}${85}${105}${125}' < captcha.svg
8u4x81f

1

XMLStarlet , 46 Zeichen

xmlstarlet sel -t -m //_:text -s A:N:U @x -v .

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:

bash-4.4$ xmlstarlet sel -t -m //_:text -s A:N:U @x -v . < captcha.svg 
8u4x81f

1

PHP, 96 Bytes

Vorausgesetzt, das $iist die Eingabezeichenfolge

preg_match_all('|x="(\d+).*(.)\<|',$i,$m);$a=array_combine($m[1],$m[2]);ksort($a);echo join($a);

1
Statt array_combine()+ ksort()könnten Sie array_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 .
Manatwork

1

Sauber , 277 150 Bytes

Yay Pattern Matching!

import StdEnv,StdLib
?s=map snd(sort(zip(map(toInt o toString)[takeWhile isDigit h\\['" x="':h]<-tails s],[c\\[c:t]<-tails s|take 7 t==['</text>']])))

Probieren Sie es online!

Definiert die Funktion ?, Nehmen [Char]und Geben [Char].

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.