เอาชนะ SVGCaptcha


79

ฉันเจอSVGCaptchaและรู้ทันทีว่ามันเป็นความคิดที่ไม่ดี

ฉันต้องการให้คุณแสดงให้เห็นว่าความคิดนี้แย่เพียงใดโดยการแยกรหัสการตรวจสอบจากภาพ SVG ที่รหัสนั้นสร้างขึ้น


ภาพตัวอย่างมีลักษณะดังนี้: นี่คือที่มาของภาพตัวอย่าง:
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>

อินพุตเป็นภาพ SVG ซึ่งเป็นรูปแบบข้อความ

เพียงข้อ จำกัด ที่แท้จริงคือว่ารหัสของคุณจะต้องผลิตค่าในลำดับที่ถูกต้อง องค์ประกอบการ
ป้อนข้อมูล<text>อยู่ในลำดับสุ่มดังนั้นคุณต้องใส่ใจกับxคุณลักษณะใน<text>แท็ก


คะแนนคือจำนวนไบต์ในรหัส


เนื่องจากปัจจุบันโค้ดทำการแปลงสองอย่างที่ยกเลิกซึ่งกันและกันซึ่งคุณสามารถเพิกเฉยได้ แต่ถ้าคุณนำมาพิจารณาให้พิจารณาดำเนินการต่อและลด 30% จากคะแนนของคุณ


3
คุณไม่ได้ระบุอย่างชัดเจนว่าอินพุตและเอาต์พุตคืออะไร: ฉันคิดว่าไฟล์ SVG และตัวอักษรที่อยู่ในนั้น? และยังไม่ชัดเจนสำหรับฉันว่าคำตอบจะต้องใช้ข้อกำหนดของ SVG จริงหรือไม่หรือพวกเขาสามารถสันนิษฐานได้ว่า SVG นั้นสร้างขึ้นโดย SVGCaptcha เวอร์ชันปัจจุบันและเพื่อให้การแปลงสามารถเพิกเฉยได้
ปีเตอร์เทย์เลอร์

ฉันแนะนำให้ จำกัด เอาต์พุตให้กับ STDOUT หรือค่าตอบแทนฟังก์ชั่นและทำให้code-golf
TheDoctor

1
ไม่คำถามต้องมีเกณฑ์การตัดสินที่มีวัตถุประสงค์เชิงปริมาณเพื่อให้อยู่ในหัวข้อสำหรับไซต์นี้
Alex A.

7
ฉันไม่แน่ใจว่าเกี่ยวข้องกับการประมวลผลภาพอย่างไร
SuperJedi224

18
คำถามนี้เป็นผลลัพธ์ที่ 4 เมื่อ googling 'svgcaptcha' :)
Blue

คำตอบ:


18

Bash , 63 56 39 ไบต์

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

หมายเหตุ: ต้องcat, grep , sort, และrev cutรับอินพุตจาก stdin เอาต์พุตถูกคั่นด้วยตัวแบ่งบรรทัดบน stdout ตรวจสอบให้แน่ใจว่ากด CTRL + D (ไม่ใช่คำสั่ง + D บน Mac) เมื่อป้อน CAPTCHA เสร็จแล้ว การป้อนข้อมูลจะต้องตามด้วยบรรทัดใหม่แล้วตามด้วย '_'

แก้ไข : บันทึกแล้ว 13 ไบต์

แก้ไข 2 : บันทึก 20 ไบต์ด้วย@manatwork !


GNU coreutils sortสนับสนุนตำแหน่งตัวละครใน keydef นี้→cut -c4-|sort -n sort -k1.4n
จัดการ

@ การจัดการขอบคุณฉันปรับปรุงคำตอบ
Coder256

13

CJam, 26 ไบต์

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

ลองใช้ออนไลน์ในล่าม CJamล่าม

มันทำงานอย่างไร

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 ไบต์

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

แก้ไข: -2 ไบต์เปลี่ยนdocumentRootเป็นlastChild; -2 ไบต์เปลี่ยนjoin('')เป็นjoin``ขอบคุณVɪʜᴀɴ

ป้อนรหัสในคอนโซลของเบราว์เซอร์บนหน้าต่อ SVG ที่เป็นปัญหาเขียนไปยังคอนโซลเอาต์พุต


document.rootElementกำลังปรับแต่งไม่ได้กำหนด ฉันได้ลอง Firefox และ Safari แล้ว
Downgoat

นี่เป็นเพียงการทดสอบใน Chrome ฉันจะตรวจสอบสิ่งที่สามารถเปลี่ยนแปลงได้
Nickson

ดูเหมือนว่าจะทำงานใน Firefox เป็น SVG เนื้อหาเดียวของไฟล์หรือไม่
Nickson

โอเคลองใช้งาน Chrome ตอนนี้ใช้งานได้แล้ว +1 คุณสามารถบันทึกสองไบต์ด้วยการเปลี่ยน('')backticks เป็นสอง: ``
Downgoat

นี่คือ 78: t=>(l=[],r=/x="(\d*).*?>(.)/g,eval("while(e=r.exec(t))l[e[1]]=e[2];l.join``"))(ใช้สตริง xml เป็นพารามิเตอร์ส่งกลับข้อความ captcha)
DankMemes

7

Perl, 40 ไบต์

รหัส 39 ไบต์ + 1 สำหรับ -n

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

ตัวอย่าง:

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

ผู้ชายที่เต็มไปด้วยคำเตือนหากคุณเปิดใช้งาน การใช้งานที่ดีเลิศของธรรมชาติหละหลวมเริ่มต้นของ Perl
Brad Gilbert b2gills

@ BradGilbertb2gills ใช่ฉันพยายามที่จะไม่ทดสอบคำเตือนฉันประหลาดใจมากที่รหัส golfed แม้ใช้งานได้บางครั้ง!
Dom Hastings



3

Befunge, 79 ไบต์

รู้สึกเหมือนว่ามันเป็นไปได้ที่จะเล่นกอล์ฟอย่างน้อยหนึ่งไบต์จากนี้ แต่ฉันได้ทำงานกับมันมาสองสามวันแล้วและนี่ก็ดีเท่าที่ฉันจะทำได้

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

ลองออนไลน์!

การอธิบาย

ซอร์สโค้ดที่มีไฮไลต์พา ธ การเรียกใช้งาน

* * * *ทำให้ทิศทางการดำเนินการจากขวาไปซ้ายและล้อมรอบเพื่อเริ่มห่วงหลัก
* * * *อ่านตัวอักษรจาก stdin และทดสอบหาค่าสิ้นสุดไฟล์
* * * *ถ้าไม่ใช่ไฟล์ให้ตรวจสอบว่าเป็นไฟล์>หรือไม่
* * * *ถ้าไม่ใช่ให้>เพิ่มค่าลงในสแต็กที่ติดตามอักขระสองตัวสุดท้ายและตรวจสอบว่าคู่ปัจจุบันตรงกันx=หรือไม่
* * * *หากไม่มีให้คูณด้วย 126 และดัดแปลงด้วย 126 2เพื่อปล่อยค่าที่เก่าที่สุดจากคู่และสร้างพื้นที่สำหรับอักขระถัดไป
* * * *ล้อมรอบอีกครั้งเพื่อทำซ้ำลูปหลัก
* * * *เมื่อx=พบคู่ให้ข้ามอักขระถัดไป (เครื่องหมายคำพูด) อ่านจำนวนเต็ม ( xค่า ) และหารด้วย 20 สิ่งนี้กลายเป็นออฟเซ็ตปัจจุบันซึ่งถูกบันทึกไว้ในภายหลัง
* * * *เมื่อ a>พบให้อ่านตัวอักษรถัดไป (โดยทั่วไปจะเป็นตัวอักษร captcha ตัวใดตัวหนึ่ง) และบันทึกที่ออฟเซ็ตปัจจุบันใน "อาร์เรย์" รีเซ็ตออฟเซตเป็น 9 ดังนั้นตัวอักษรแคปช่าจะไม่ถูกเขียนทับเมื่อภายหลัง ในที่สุดเมื่อถึงจุดสิ้นสุดไฟล์จะวนซ้ำมากกว่า 7 ค่าที่บันทึกในอาร์เรย์และส่งออกทีละรายการ ที่ควรให้ตัวอักษรแคปต์ชาทั้งหมดตามลำดับที่ถูกต้อง> พบตัวอักษร
* * * *

ฉันกำลังอ่านรายละเอียดบางอย่างที่นี่เนื่องจากเส้นทางโค้ดทับซ้อนกันในรูปแบบที่อธิบายได้ยากนิดหน่อย แต่ควรให้แนวคิดทั่วไปเกี่ยวกับวิธีการทำงานของอัลกอริทึม


2

Python2, 129 ไบต์

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])))

นำซอร์ส HTML มาใช้บน stdin สร้างโค้ดบน stdout


วิธีนี้เรียงลำดับผลลัพธ์ <text>องค์ประกอบอยู่ในลำดับแบบสุ่มและความต้องการที่แท้จริงเพียงอย่างเดียวคือการที่คุณต้องใส่ไว้ในลำดับที่ถูกต้อง นั่นหมายความว่าคุณต้องใช้xจาก<text>และปฏิบัติตามการแปลงใด ๆ
แบรดกิลเบิร์ต b2gills

@ BradGilbertb2gills ฉันพลาดไปครั้งแรกที่แก้ไขตอนนี้
orlp

2

Mathematica, 106 ไบต์

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

หมายเหตุ: อินพุตจะต้องอยู่ในรูปแบบที่ระบุโดยตัวอย่าง


2

V , 28 26 25 24 ไบต์

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

ลองออนไลน์!

คำอธิบาย:

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 ไบต์

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

ลองออนไลน์!

ค้นหาค่า x (วิ่งด้วยหลักหลังx=") และ "ตัวอักษร" (ปักหมุดด้วยการปิดและเปิดแท็ก) จากนั้นเรียกใช้ APL ต่อไปนี้ (ซึ่งเป็นรายการของค่า x ที่พบและตัวอักษรตามลำดับที่ปรากฏ):

3↓⍵ ปล่อยสามองค์ประกอบแรก (เว้นวรรครอบ<rect/rect>และ<rect'sx value)

(... ) ใช้ฟังก์ชัน tacit ต่อไปนี้กับสิ่งนั้น:

 จำนวนรายการที่เหลืออยู่

.5× ลดลงครึ่งหนึ่ง

2,⍨ ต่อท้ายสอง

⊢⍴⍨ เปลี่ยนรูปร่างให้เป็นรูปร่างนั้น (เช่นเมทริกซ์ n × 2)

 ไขว้ (เป็นเมทริกซ์ 2 × n)

⍎¨@1 รันแต่ละสตริงในแถวแรก (เปลี่ยนเป็นตัวเลข)

 แยกเมทริกซ์เป็นสองเวกเตอร์ (หนึ่งต่อแถว)

x c← เก็บทั้งสองใน x (ค่า x) และ c (ตัวอักษร) ตามลำดับ

 เลือกอันแรก (x)

 ระดับขึ้น (ดัชนีเป็น x ซึ่งจะเรียงลำดับ x)

c[... ] ใช้สิ่งนั้นเพื่อจัดทำดัชนีc

ε nlist (แบน) เพราะแต่ละตัวอักษรเป็นสตริงด้วยตัวเอง


การแสดงออกที่เทียบเท่า APL ของโปรแกรม QuadS ทั้งหมดคือ:

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

1

Java 8, 197 173 ไบต์

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();}

ส่งออกjava.util.Collectionอักขระ

คำอธิบาย:

ลองออนไลน์

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 ตัวอักษร

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

ใน Gema ไม่มีการเรียงลำดับ แต่โชคดีที่ไม่จำเป็นต้องมีแม้แต่

วิ่งตัวอย่าง:

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

1

XMLStarlet , 46 ตัวอักษร

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

หวังว่านี่เป็นโซลูชันที่ถูกต้องเนื่องจาก XMLStarlet เป็น transpiler ที่สร้างและดำเนินการรหัส XSLT ซึ่งเป็นภาษาทัวริงที่สมบูรณ์

วิ่งตัวอย่าง:

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

1

PHP, 96 ไบต์

รับที่$iเป็นสตริงการป้อนข้อมูล

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

1
แทนที่จะarray_combine()+ ksort()คุณสามารถใช้เช่นนี้array_multisort() array_multisort($m[1],$m[2]);echo join($m[2]);แต่โปรดทราบว่าโซลูชันคาดว่าจะจัดการอินพุตและเอาต์พุตด้วยตนเอง (ยกเว้นกรณีที่ภาษาทำโดยอัตโนมัติ) แทนที่จะคาดหวังว่าจะค้นหาอินพุตในตัวแปรหรือเพียงแค่ปล่อยผลลัพธ์ไว้ในตัวแปร ดู meta
จัดการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.