Поразка 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 або функцію повернення значення і зробити його кодом-гольф
TheDoctor

1
Ні, питання потребують об'єктивного, кількісно оцінюваного критерію виграшу, щоб бути темою для цього сайту.
Олексій А.

7
Я не впевнений, наскільки тут відповідна обробка зображень .
SuperJedi224

18
Це питання є четвертим результатом, коли гугл 'svgcaptcha' :)
Синій

Відповіді:


18

Баш , 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 (не COMMAND + D на Mac), коли закінчите вводити CAPTCHA. Введення має супроводжуватися новим рядком, а потім "_".

EDIT : Збережено 13 байт.

EDIT 2 : Збережено 20 байт завдяки @manatwork !


GNU coreutils sort підтримує положення символів у keydef: cut -c4-|sort -nsort -k1.4n.
манантська робота

@manatwork Спасибі, я оновив відповідь.
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, я вивчу, що можна змінити.
Ніксон

Схоже, він працює у Firefox, чи SVG є єдиним вмістом файлу?
Ніксон

Гаразд, спробував це в Chrome, зараз він працював. +1. Ви також можете зберегти два байти, змінивши ('')на два
задніх позиції

Це 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 за замовчуванням.
Бред Гілберт b2gills

@ BradGilbertb2gills Так, я намагаюся не перевіряти попередження, я настільки здивований, що будь-який код для гольфу навіть працює іноді!
Дом Гастінгс



3

Befunge, 79 байт

Це здається, що має бути можливість пограти принаймні ще один байт від цього, але я працюю над ним вже пару днів, і це так добре, як я міг би це отримати.

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

Спробуйте в Інтернеті!

Пояснення

Вихідний код із виділеними шляхами виконання

*Зробіть напрямок виконання справа наліво та оберніть його, щоб почати основну петлю.
*Прочитайте таблицю від stdin та перевіряйте на значення кінця файлу.
*Якщо це не кінець файлу, перевірте, чи він є >.
*Якщо це не a >, додайте його до значення в стеку, який відстежує два останні символи, і перевірте, чи відповідає поточна пара x=.
*Якщо ні, помножте на 126, а мод на 126 2, щоб скинути найстарше значення з пари та звільнити місце для наступного символу.
*Загорніть знову, щоб повторити основну петлю.
*Якщо x=зустрічається пара, пропустіть наступний символ (лапка), прочитайте ціле число ( значення x ) і розділіть на 20. Це стає поточним зміщенням, яке зберігається на потім.
*Якщо виникає a >, прочитайте наступний символ (як правило, одне з літер captcha) і збережіть його при поточному зміщенні в "масиві". Скиньте зсув на 9, так що лист captcha не буде перезаписаний, коли з’являться пізніші >символи.
*Нарешті, коли потім буде досягнуто кінця файлу, повторіть 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

Математика, 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).

() Застосувати до цього наступну негласну функцію:

 кількість решти предметів

.5× наполовину, що

2,⍨ додайте два

⊢⍴⍨ змінити форму до такої форми (тобто матриця n × 2)

 транспонировать (до матриці 2 × n)

⍎¨@1 виконати кожен рядок у першому рядку (перетворюючи їх у числа)

 розділити матрицю на два вектори (по одному на рядок)

x c← збережіть ці два у x (значення x) та c (символи) відповідно

 вибрати перший (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символи a .

Пояснення:

Спробуйте в Інтернеті.

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

Гема , 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 є трансілером, який генерує та виконує код 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]);. Але врахуйте, що, як очікується, рішення вирішуватимуть обробку вводу та виводу самостійно (якщо мова не робить це автоматично), замість того, щоб сподіватися знайти вхід у змінній або просто залишити результат у змінній. Дивіться споріднені мета .
маніпуляція

1

Чисто , 277 150 байт

Так, узгодження шаблону!

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

Спробуйте в Інтернеті!

Визначає функцію ?, беруть [Char]і дають [Char].

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.