Kalahkan SVGCaptcha


79

Saya menemukan SVGCaptcha , dan segera tahu itu adalah ide yang buruk.

Saya ingin Anda menunjukkan betapa buruknya ide ini dengan mengekstraksi kode validasi dari gambar SVG yang dihasilkan kode.


Contoh gambar terlihat seperti ini: Berikut adalah sumber dari contoh gambar:
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>

Input adalah gambar SVG, yang merupakan format tekstual.

Satu-satunya batasan nyata adalah bahwa kode Anda harus menghasilkan nilai dalam urutan yang benar . Elemen
input <text>dalam urutan acak sehingga Anda harus memperhatikan xatribut dalam <text>tag


Skor adalah jumlah byte dalam kode


Karena kode saat ini melakukan dua transformasi yang membatalkan satu sama lain Anda dapat mengabaikannya, tetapi jika Anda mempertimbangkannya, teruskan dan ambil pengurangan 30% dari skor Anda.


3
Anda belum benar-benar menyatakan secara eksplisit apa input dan outputnya: Saya menduga file SVG dan huruf-huruf yang terkandung di dalamnya? Dan tidak jelas bagi saya apakah jawaban diperlukan untuk benar-benar mengimplementasikan spesifikasi SVG atau apakah mereka dapat berasumsi bahwa SVG dihasilkan oleh versi SVGCaptcha saat ini sehingga transformasi dapat diabaikan.
Peter Taylor

Saya sarankan membatasi output ke STDOUT atau nilai fungsi kembali, dan membuatnya kode-golf
TheDoctor

1
Tidak, pertanyaan membutuhkan kriteria kemenangan yang objektif dan terukur untuk menjadi topik untuk situs ini.
Alex A.

7
Saya tidak yakin seberapa relevan pemrosesan gambar di sini.
SuperJedi224

18
Pertanyaan ini sekarang adalah hasil ke-4 ketika googling 'svgcaptcha' :)
Blue

Jawaban:


18

Bash , 63 56 39 byte

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

Catatan: membutuhkan cat, grep , sort, rev, dan cut. Mengambil input dari stdin. Output dipisahkan oleh jeda baris pada stdout. Pastikan untuk menekan CTRL + D (bukan PERINTAH + D pada Mac) ketika selesai memasuki CAPTCHA. Input harus diikuti oleh baris baru dan kemudian '_'.

EDIT : Disimpan 13 byte.

EDIT 2 : Disimpan 20 byte berkat @manatwork !


GNU coreutils sort mendukung posisi karakter di keydef: cut -c4-|sort -nsort -k1.4n.
manatwork

@manatwork Terima kasih, saya memperbarui jawabannya.
Coder256

13

CJam, 26 byte

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

Cobalah online di juru bahasa CJam .

Bagaimana itu bekerja

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 byte

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

sunting: -2 byte berubah documentRootmenjadi lastChild; -2 byte berubah join('')menjadijoin`` , terima kasih Vɪʜᴀɴ

Masukkan kode di konsol browser pada halaman yang berisi SVG yang dimaksud, tulis ke output konsol.


document.rootElementretuning tidak terdefinisi. Saya sudah mencoba Firefox dan Safari
Downgoat

Ini hanya diuji di Chrome, saya akan melihat apa yang bisa diubah.
Nickson

Tampaknya berfungsi di Firefox, apakah SVG satu-satunya konten file?
Nickson

Oke, coba di Chrome, sekarang berhasil. +1. Anda juga dapat menyimpan dua byte dengan mengubah ('')menjadi dua backticks: ``
Downgoat

Ini adalah 78: t=>(l=[],r=/x="(\d*).*?>(.)/g,eval("while(e=r.exec(t))l[e[1]]=e[2];l.join``"))(mengambil string xml sebagai parameter, mengembalikan teks captcha)
DankMemes

7

Perl, 40 byte

39 byte kode + 1 untuk -n

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

Contoh:

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

Manusia yang penuh dengan peringatan jika Anda menyalakannya. Sangat baik menggunakan sifat longgar default Perl.
Brad Gilbert b2gills

@ BradGilbertb2gills Ya, saya mencoba untuk tidak menguji peringatan, saya sangat terkejut setiap kode golf bahkan kadang-kadang bekerja!
Dom Hastings

7

Utilitas Bash + GNU, 53

grep -Po '(?<=x=").*(?=<)'|sort -n|grep -Po '(?<=>).'

Seperti jawaban ini , output adalah satu karakter per baris.



3

Befunge, 79 byte

Rasanya seperti mungkin untuk bermain golf setidaknya satu byte lagi dari ini, tapi saya sudah mengusahakannya selama beberapa hari sekarang, dan ini sebaik yang saya bisa dapatkan.

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

Cobalah online!

Penjelasan

Kode sumber dengan jalur eksekusi disorot

*Buat arah eksekusi dari kanan ke kiri, dan lilitkan untuk memulai loop utama.
*Baca char dari stdin, dan uji nilai end-of-file.
*Jika bukan end-of-file, periksa apakah itu a >.
*Jika bukan a >, tambahkan ke nilai pada tumpukan yang melacak dua karakter terakhir, dan periksa apakah pasangan saat ini cocok x=.
*Jika tidak, kalikan dengan 126 dan mod dengan 126 2 untuk menjatuhkan nilai tertua dari pasangan dan memberikan ruang untuk karakter berikutnya.
*Bungkus lagi untuk mengulangi loop utama.
*Ketika suatu x=pasangan ditemui, lewati karakter berikutnya (kutipan), baca integer (nilai x ), dan bagi dengan 20. Ini menjadi offset saat ini yang disimpan untuk nanti.
*Ketika >ditemui, baca karakter berikutnya (biasanya salah satu huruf captcha), dan simpan di offset saat ini dalam "array". Atur ulang offset ke 9, sehingga huruf captcha tidak akan ditimpa ketika >karakter yang lebih baru ditemukan.
*Akhirnya, ketika akhir file tercapai, beralih ke 7 nilai yang disimpan dalam array dan output satu per satu. Itu akan memberi Anda semua surat captcha dalam urutan yang benar.

Saya membahas beberapa detail di sini, karena jalur kode saling tumpang tindih dengan cara yang agak sulit dijelaskan, tetapi seharusnya memberi Anda gambaran umum tentang bagaimana algoritma bekerja.


2

Python2, 129 byte

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

Mengambil sumber HTML di stdin, menghasilkan kode di stdout.


Bagaimana ini mengurutkan output? The <text>elemen dalam urutan acak, dan satu-satunya persyaratan yang nyata adalah bahwa Anda harus menempatkan mereka dalam urutan yang benar. Itu berarti Anda harus menggunakan xdari <text>dan mengikuti perubahan apa pun.
Brad Gilbert b2gills

@ BradGilbertb2gills Aku merindukan itu pertama kali, diperbaiki sekarang.
orlp

2

Mathematica, 106 byte

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

Catatan: Input harus dalam format yang ditentukan oleh contoh.


2

V , 28 26 25 24 byte

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

Cobalah online!

Penjelasan:

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 byte

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

Cobalah online!

Temukan nilai x (digit berjalan setelah x=") dan "huruf" (disematkan dengan menutup dan membuka tag), kemudian jalankan APL berikut (di mana daftar nilai x ditemukan dan huruf, sesuai urutan penampilan):

3↓⍵ drop tiga elemen pertama (spasi di sekitar <rect... /rect>dan nilai <rect'sx).

(... ) terapkan fungsi tersembunyi berikut pada itu:

 jumlah item yang tersisa

.5× membagi dua itu

2,⍨ tambahkan dua

⊢⍴⍨ membentuk kembali bentuk itu (yaitu matriks n × 2)

 transpos (ke matriks 2 × n)

⍎¨@1 jalankan setiap string di baris pertama (mengubahnya menjadi angka)

 pisahkan matriks menjadi dua vektor (satu per baris)

x c← masing-masing disimpan dalam x (nilai x) dan c (karakter)

 pilih yang pertama (x)

 naik kelas (indeks menjadi x yang akan mengurutkan x)

c[... ] gunakan itu untuk mengindeksc

ϵ daftar (ratakan) karena setiap huruf adalah string dengan sendirinya


Ekspresi APL yang setara dari seluruh program QuadS adalah:

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

1

Java 8, 197 173 byte

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

Menghasilkan java.util.Collectionkarakter.

Penjelasan:

Cobalah online.

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 karakter

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

Di Gema tidak ada penyortiran, tetapi untungnya bahkan tidak diperlukan.

Contoh dijalankan:

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

1

XMLStarlet , 46 karakter

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

Semoga ini adalah solusi yang valid karena XMLStarlet adalah transpiler yang menghasilkan dan mengeksekusi kode XSLT, yang merupakan bahasa lengkap Turing.

Contoh dijalankan:

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

1

PHP, 96 byte

Mengingat itu $iadalah string input

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

1
Alih-alih array_combine()+ ksort()Anda bisa menggunakan array_multisort()seperti ini: array_multisort($m[1],$m[2]);echo join($m[2]);. Tetapi harap dicatat bahwa solusi diharapkan untuk menangani input dan output sendiri (kecuali bahasa melakukannya secara otomatis), daripada mengharapkan untuk menemukan input dalam suatu variabel atau biarkan saja hasilnya dalam suatu variabel. Lihat meta terkait .
manatwork

1

Bersih , 277 150 byte

Pencocokan pola Yay!

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

Cobalah online!

Menentukan fungsi ?, menerima [Char]dan memberi [Char].

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.