SVGCaptcha को हराया


79

मैं SVGCaptcha पर आया था, और तुरंत पता चला कि यह एक बुरा विचार था।

मैं आपको यह दिखाना चाहता हूं कि एसवीजी छवियों से सत्यापन कोड निकालने से यह कितना बुरा विचार है जो कोड पैदा करता है।


एक उदाहरण छवि इस तरह दिखती है: यहाँ उदाहरण छवि का स्रोत है:
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>

इनपुट एसवीजी छवि है, जो एक पाठ प्रारूप है।

एकमात्र वास्तविक प्रतिबंध यह है कि आपके कोड को सही क्रम में मूल्यों का उत्पादन करना चाहिए ।
इनपुट <text>तत्व यादृच्छिक क्रम में हैं, इसलिए आपको टैग xमें विशेषता पर ध्यान देना होगा<text>


कोड में स्कोर बाइट्स की संख्या है


चूंकि वर्तमान में कोड दो परिवर्तन करता है जो एक-दूसरे को रद्द करते हैं, आप उन्हें अनदेखा कर सकते हैं, लेकिन यदि आप उन्हें ध्यान में रखते हैं, तो आगे बढ़ें और अपने स्कोर से 30% की कटौती करें।


3
आपने वास्तव में स्पष्ट रूप से नहीं बताया है कि इनपुट और आउटपुट क्या हैं: मैं SVG फ़ाइल और उसमें निहित अक्षरों को मान रहा हूँ? और यह मेरे लिए स्पष्ट नहीं है कि क्या वास्तव में एसवीजी कल्पना को लागू करने के लिए उत्तरों की आवश्यकता है या क्या वे मान सकते हैं कि एसवीजी को एसवीजीसीएप्चा के वर्तमान संस्करण द्वारा उत्पन्न किया गया है और इसलिए परिवर्तनों को अनदेखा किया जा सकता है।
पीटर टेलर

मैं आउटपुट को STDOUT या फंक्शन रिटर्न वैल्यू तक सीमित करने और इसे कोड-गोल्फ
TheDoctor

1
नहीं, इस साइट के लिए प्रश्नों को ऑन-टॉपिक होने के लिए एक उद्देश्य, मात्रात्मक जीत की कसौटी की आवश्यकता होती है।
एलेक्स ए।

7
मुझे यकीन नहीं है कि छवि-प्रसंस्करण यहां कितना प्रासंगिक है।
सुपरजेडी २२४

18
यह प्रश्न अब 4 वां परिणाम है जब '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। स्टड से इनपुट लेता है। आउटपुट को स्टडआउट पर लाइन ब्रेक द्वारा अलग किया जाता है। कैप्चा दर्ज करते समय CTRL + D (मैक पर COMMAND + D) नहीं दबाएं। इनपुट के बाद एक नई लाइन और उसके बाद '_' होना चाहिए।

संपादित करें : 13 बाइट्स सहेजे गए।

EDIT 2 : @manatwork की बदौलत 20 बाइट्स बचाए गए !


जीएनयू coreutils sort keydef में चरित्र की स्थिति का समर्थन करता है: cut -c4-|sort -nsort -k1.4n
10

@manatwork धन्यवाद, मैंने जवाब अपडेट किया।
कोडर 256

13

सीजेएम, 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 बाइट्स को बदलने documentRootके लिए lastChild; -2 बाइट्स में बदल रहा join('')है join``, धन्यवाद Vɪʜᴀɴ

एक पृष्ठ पर ब्राउज़र कंसोल में कोड दर्ज करें जो प्रश्न में SVG के विपरीत होता है, आउटपुट कंसोल के लिए लिखता है।


document.rootElementअपरिभाषित है। मैंने फ़ायरफ़ॉक्स और सफारी की कोशिश की है
डाउनगोट

यह केवल क्रोम में परीक्षण किया गया था, मैं देखता हूं कि क्या बदला जा सकता है।
निकसन

यह फ़ायरफ़ॉक्स में काम करता प्रतीत होता है, क्या SVG फ़ाइल की एकमात्र सामग्री है?
निकसन

ठीक है, क्रोम में कोशिश की, अब यह काम किया। +1। आप दो बाइट्स ('')को दो
बैकटिक्स में

यह 78 है: t=>(l=[],r=/x="(\d*).*?>(.)/g,eval("while(e=r.exec(t))l[e[1]]=e[2];l.join``"))(पैरामीटर के रूप में xml स्ट्रिंग लेता है, कैप्चा पाठ लौटाता है)
DankMemes

7

पर्ल, 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

यदि आप उन्हें चालू करते हैं तो मनुष्य केवल चेतावनी से भरा है। पर्ल के डिफ़ॉल्ट लक्ष प्रकृति का उत्कृष्ट उपयोग।
ब्रैड गिलबर्ट ने

@ BradGilbertb2gills हाँ, मैं चेतावनियों का परीक्षण नहीं करने की कोशिश करता हूं, मैं बहुत हैरान हूं कि कोई भी गोल्फ कोड कभी-कभी काम करता है!
डोम हेस्टिंग्स



3

Befunge, 79 बाइट्स

ऐसा लगता है कि यह कम से कम एक और बाइट को गोल्फ के लिए संभव होना चाहिए, लेकिन मैं अब कुछ दिनों के लिए इस पर काम कर रहा हूं, और यह उतना ही अच्छा है जितना मैं इसे प्राप्त कर सकता हूं।

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

इसे ऑनलाइन आज़माएं!

व्याख्या

निष्पादन पथ के साथ स्रोत कोड हाइलाइट किया गया

*निष्पादन दिशा को दाएं-बाएं करें, और मुख्य लूप शुरू करने के लिए चारों ओर लपेटें।
*स्टड से एक चार पढ़ें, और फ़ाइल के अंत मूल्य के लिए परीक्षण करें।
*यदि यह फ़ाइल का अंत नहीं है, तो जांचें कि क्या यह एक है >
*यदि यह नहीं है >, तो इसे स्टैक पर उस मूल्य में जोड़ें जो पिछले दो वर्णों को ट्रैक करता है, और जांचें कि क्या वर्तमान जोड़ी मेल खाती है x=
*यदि नहीं, तो जोड़ी से सबसे पुराने मूल्य को छोड़ने और अगले चरित्र के लिए जगह बनाने के लिए 126 से गुणा करें और 126 2 के साथ मॉड करें ।
*मुख्य लूप को दोहराने के लिए फिर से लपेटें।
*जब एक x=जोड़ी का सामना किया जाता है, तो अगले चरित्र (उद्धरण) को छोड़ दें, एक पूर्णांक ( x मान) पढ़ें , और 20 से विभाजित करें। यह वर्तमान ऑफसेट बन जाता है जो बाद के लिए सहेजा जाता है।
*जब एक >सामना किया जाता है, तो अगले चरित्र (आमतौर पर कैप्चा पत्रों में से एक) को पढ़ें, और उसे एक "सरणी" में वर्तमान ऑफसेट पर सहेजें। ऑफसेट को 9 पर रीसेट करें, इसलिए बाद के >वर्णों का सामना होने पर कैप्चा पत्र को अधिलेखित नहीं किया जाएगा ।
*अंत में, जब एंड-ऑफ-फ़ाइल पहुँच जाता है, तो सरणी में सहेजे गए 7 मानों पर पुनरावृति करें और उन्हें एक-एक करके आउटपुट दें। आपको सभी कैप्चा पत्रों को सही क्रम में देना चाहिए।

मैं यहाँ कुछ विवरणों पर गौर कर रहा हूँ, क्योंकि कोड पथ एक-दूसरे को उन तरीकों से ओवरलैप करते हैं, जिन्हें समझाना थोड़ा मुश्किल है, लेकिन यह आपको एक सामान्य विचार देना चाहिए कि एल्गोरिथ्म कैसे काम करता है।


2

पायथन 2, 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 22

@ ब्रैडगिल्बर्ब २गिल्स मुझे याद है कि पहली बार के आसपास, अब तय की।
orlp

2

गणितज्ञ, 106 बाइट्स

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

नोट: इनपुट को उदाहरण द्वारा निर्दिष्ट प्रारूप में होना चाहिए।


2

वी , 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

क्वाड्स , 49 बाइट्स

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

इसे ऑनलाइन आज़माएं!

एक्स मान (अंकों के बाद चलता है x=") और "पत्र" (टैग बंद करने और खोलने से पिन किया जाता है) को ढूँढता है , फिर निम्नलिखित एपीएल को निष्पादित करता है (जहां उपस्थिति के क्रम में एक्स मान और अक्षरों की सूची मिलती है):

3↓⍵ पहले तीन तत्वों (चारों ओर रिक्त स्थान <rect... /rect>और <rect'sx मान) को छोड़ें ।

(... ) उस पर निम्नलिखित tacit फ़ंक्शन लागू करें:

 शेष वस्तुओं की संख्या

.5× उसे आधा करो

2,⍨ एक दो

⊢⍴⍨ उस आकृति को फिर से आकार दें (यानी एक n × 2 मैट्रिक्स)

 पारगमन (एक 2 × n मैट्रिक्स के लिए)

⍎¨@1 पहली पंक्ति में प्रत्येक स्ट्रिंग को निष्पादित करें (उन्हें संख्या में बदलकर)

 मैट्रिक्स को दो वैक्टर में विभाजित करें (एक पंक्ति में)

x c← क्रमशः उन दोनों को x (x मान) और c (वर्ण) में संग्रहीत करें

 पहले उठाओ (x)

 ग्रेड अप (सूचकांक में x जो x को सॉर्ट करेगा)

c[... ] कि सूचकांक में उपयोग करेंc

ϵ nlist (समतल) क्योंकि प्रत्येक अक्षर अपने आप में एक स्ट्रिंग है


संपूर्ण QuadS प्रोग्राम की बराबर APL अभिव्यक्ति है:

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

1

जावा 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

गामा , 65 वर्ण

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

गीमा में कोई छंटाई नहीं है, लेकिन सौभाग्य से इसकी आवश्यकता भी नहीं है।

नमूना रन:

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]);:। लेकिन कृपया ध्यान दें कि इनपुट को इनपुट और आउटपुट को संभालने की अपेक्षा की जाती है (जब तक कि भाषा अपने आप नहीं हो जाती है), इनपुट को एक चर में खोजने की अपेक्षा करने के बजाय या केवल परिणाम को एक चर में छोड़ दें। संबंधित मेटा देखें
रात 12:12

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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.