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 또는 함수 반환 값으로 제한하고 코드 골프로
좋습니다.

1
아니요, 질문은이 사이트에 대한 주제를 다루기 위해 객관적이고 정량화 가능한 우승 기준이 필요합니다.
Alex A.

7
관련 이미지 처리 가 어떻게 진행되는지 잘 모르겠습니다 .
SuperJedi224 2018

18
이 질문은 이제 인터넷 검색 'svgcaptcha'를 할 때 네 번째 결과입니다 :)
Blue

답변:


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 (Mac에서는 COMMAND + D 아님)를 누르십시오. 입력 다음에 줄 바꿈과 '_'이 와야합니다.

편집 : 13 바이트를 저장했습니다.

편집 2 : @manatwork 덕분에 20 바이트를 절약했습니다 !


GNU coreutils sort 는 keydef에서 문자 위치를 지원합니다 : cut -c4-|sort -nsort -k1.4n.
manatwork

@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

자바 스크립트, 95 93 91 바이트

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

편집 : 변화 -2 바이트 documentRootlastChild; -2 바이트가 (으)로 변경 join('')되었습니다 join``. Vɪʜᴀɴ

SVG가 포함 된 페이지의 브라우저 콘솔에 코드를 입력하고 콘솔 출력에 씁니다.


document.rootElement정의되지 않은 상태로 재조정 중입니다.
Downgoat을

이것은 Chrome에서만 테스트되었으며 변경 가능한 사항을 살펴 보겠습니다.
Nickson

Firefox에서 작동하는 것 같습니다. SVG가 파일의 유일한 내용입니까?
Nickson

좋아, Chrome에서 사용해 보았지만 이제는 효과가있었습니다. +1. ('')백틱을 2 개로 변경하여 2 바이트를 절약 할 수도 있습니다
.``

이 78입니다 t=>(l=[],r=/x="(\d*).*?>(.)/g,eval("while(e=r.exec(t))l[e[1]]=e[2];l.join``"))(매개 변수로 XML의 문자열을 사용, 보안 문자 텍스트를 반환)
DankMemes

7

펄, 40 바이트

-n의 경우 39 바이트 코드 + 1

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

예:

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

당신이 그들을 켜면 경고로 가득 찬 사람. Perl의 기본 lax 특성을 잘 사용합니다.
브래드 길버트 b2gills

@ BradGilbertb2gills 그래, 경고를 테스트하지 않으려 고한다. 골프 코드가 때로는 작동하기 때문에 너무 놀랐다!
Dom Hastings

7

배쉬 + GNU 유틸리티, 53

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

이 답변 과 같이 출력은 한 줄에 하나의 문자입니다.



3

Befunge, 79 바이트

적어도 이것으로부터 1 바이트 이상 골프를 타는 것이 가능해야한다고 생각하지만, 나는 며칠 동안이 일을 해왔으며, 이것이 내가 얻을 수있는 한 좋은 것입니다.

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

온라인으로 사용해보십시오!

설명

실행 경로가 강조 표시된 소스 코드

*실행 방향을 오른쪽에서 왼쪽으로 만들고 줄 바꿈하여 메인 루프를 시작하십시오.
*stdin에서 문자를 읽고 파일 끝 값을 테스트하십시오.
*파일 끝이 아닌 경우 파일인지 확인하십시오 >.
*이 아닌 경우 >마지막 두 문자를 추적하는 스택의 값에 추가하고 현재 쌍이 일치하는지 확인하십시오 x=.
*그렇지 않은 경우 126을 곱하고 126 2 로 수정 하여 쌍에서 가장 오래된 값을 삭제하고 다음 문자를위한 공간을 만드십시오.
*메인 루프를 반복하려면 다시 감싸십시오.
*x=쌍이 발생하고, 그 다음 문자 (인용)을 건너 뛰고, 정수 (판독 엑스 이 현재 나중을 위해 저장되는 오프셋 값이된다 (20)에 의해), 나눈다.
*a >가 나타나면 다음 문자 (일반적으로 보안 문자 중 하나)를 읽고 현재 오프셋에서 "배열"로 저장합니다. 이후 >문자가 발생할 때 보안 문자를 덮어 쓰지 않도록 오프셋을 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])))

stdin에서 HTML 소스를 가져 와서 stdout에서 코드를 생성합니다.


이것은 어떻게 출력을 정렬합니까? <text>요소는 임의의 순서로, 그리고 유일한 요구 사항은 당신이 올바른 순서에 넣어해야한다는 것입니다. 즉, xfrom 을 사용하고 <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.

16 진 덤프 :

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

2

쿼드 , 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 (문자)에 각각 2 개씩 저장

 첫 번째를 선택하십시오 (x)

 등급 화 (x를 x로 정렬하는 인덱스)

c[] 그것을 사용하여 색인c

ε의 각 문자가 문자열 자체이기 때문에 NLIST (평평)


전체 QuadS 프로그램의 동등한 APL 표현은 다음과 같습니다.

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이 튜링 완전한 언어 인 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]);. 그러나 솔루션은 입력을 변수에서 찾거나 결과를 변수에 그대로두기보다는 입력 및 출력 자체를 처리해야합니다 (언어가 자동으로 수행하지 않는 한). 관련 메타를 참조하십시오 .
manatwork

1

깨끗 하고 277150 바이트

예이 패턴 매칭!

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]

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.