Yenildi SVGCaptcha


79

Ben rastladım SVGCaptcha ve hemen bunun kötü bir fikir olduğunu biliyordum.

Doğrulama kodunu, kodun ürettiği SVG görüntülerinden çıkararak bunun ne kadar kötü bir fikir olduğunu göstermenizi isterim.


Örnek bir resim şöyle görünür: Örnek resmin kaynağı:
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>

Giriş, metin formatı olan SVG görüntüsüdür.

Tek gerçek kısıtlama, kodunuzun değerleri doğru sırada üretmesi gerektiğidir .
Giriş <text>öğeleri rasgele sıradadır, bu nedenle etiketindeki xözelliğe dikkat etmeniz gerekir.<text>


Puan, koddaki bayt sayısıdır


Kod şu anda birbirini iptal eden iki dönüşüm yaptığı için bunları yok sayabilirsiniz, ancak bunları göz önünde bulundurursanız, devam edin ve puanınızdan% 30 indirim alın.


3
Aslında girdi ve çıktıların ne olduğunu açıkça belirtmediniz: SVG dosyasını ve içerdiği harfleri tahmin ediyorum. Ve SVG spesifikasyonunu gerçekten uygulamak için cevapların gerekli olup olmadığı ya da SVG'nin mevcut SVGCaptcha sürümü tarafından oluşturulduğunu varsayabileceklerini ve bu yüzden dönüşümlerin göz ardı edilebildiği konusunda netlik kazanamadığı açık değil.
Peter Taylor,

Çıktının STDOUT veya fonksiyon dönüş değeri ile sınırlandırılmasını ve kod-golf
TheDoctor

1
Hayır, soruların bu site için konuyla ilgili tarafsız, ölçülebilir bir kazanma kriterine ihtiyacı var.
Alex A.

7
Görüntü işleme burada ne kadar ilgili olduğundan emin değilim .
SuperJedi224 16:15

18
Bu soru şimdi googling 'svgcaptcha' :) 4. sonuçtur
Mavi

Yanıtlar:


18

Bash , 63 56 39 bayt

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

Not: gerektirir cat, grep , sort, rev, ve cut. Stdin'den girdi alır. Çıktı stdout'taki satır kesmeleriyle ayrılır. CAPTCHA'ya girmeyi tamamladığınızda CTRL + D tuşlarına (Mac'te COMMAND + D değil) basın. Girdiyi bir satırsonu sonra '_' takip etmelidir.

EDIT : 13 bayt kaydedildi.

EDIT 2 : @manatwork sayesinde 20 bayt kurtarıldı !


GNU coreutils sort , keydef'deki karakter pozisyonunu destekler: cut -c4-|sort -nsort -k1.4n.
Manatwork

@ manatwork Teşekkürler, cevabı güncelledim.
Coder256

13

CJam, 26 bayt

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

CJam tercümanında çevrimiçi olarak deneyin .

Nasıl çalışır

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 bayt

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

düzenleme: değişen -2 bayt documentRootiçin lastChild; Değişen -2 bayt join('')için join``, sayesinde Vɪʜᴀɴ

Tarayıcı konsolunda, söz konusu SVG'yi içeren bir sayfada kod girin, konsol çıkışına yazar.


document.rootElementtanımsız dönüyor. Ben Firefox ve Safari denedim
Downgoat

Bu yalnızca Chrome'da test edildi, nelerin değiştirilebileceğini gözden geçireceğim.
Nickson,

Firefox'ta çalışıyor gibi görünüyor, dosyanın tek içeriği SVG mi?
Nickson,

Tamam, Chrome'da denedim, şimdi çalıştı. +1. İki geri ('')
döndürme düğmesini

Bu 78 olduğu t=>(l=[],r=/x="(\d*).*?>(.)/g,eval("while(e=r.exec(t))l[e[1]]=e[2];l.join``"))(parametre olarak xml dizesi alır, kaptan metnini döndüren)
DankMemes

7

Perl, 40 bayt

-N için 39 bayt kodu + 1

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

Örnek:

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

Onları çalıştırırsanız, sadece uyarılarla dolu bir adam. Perl'in temsili gevşek doğasının mükemmel kullanımı.
Brad Gilbert 16:15

@ BradGilbertb2gills Evet, uyarıları denememeye çalışıyorum, hatta herhangi bir golf kodunun bazen çalışmasına şaşırdım!
Dom Hastings

7

Bash + GNU yardımcı programları, 53

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

Gibi bu cevap , çıkış satır başına bir karakter olduğunu.



3

Befunge, 79 bayt

Bundan en az bir bayt daha golf oynamak mümkün gibi görünüyor, ama ben birkaç gündür üzerinde çalışıyorum ve bu alabildiğim kadar iyi.

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

Çevrimiçi deneyin!

açıklama

Yürütme yolları vurgulanmış olarak kaynak kodu

*Yürütme yönünü sağdan sola çevirin ve ana döngüyü başlatmak için etrafına sarın.
*Stdin'den bir karakter okuyun ve dosya sonu değerini test edin.
*Dosya sonu değilse, a olup olmadığını kontrol edin >.
*A değilse >, son iki karakteri izleyen yığındaki değere ekleyin ve geçerli çiftin eşleşip eşleşmediğini kontrol edin x=.
*Değilse , çiftin en eski değerini bırakmak ve bir sonraki karakter için yer açmak için 126 ile çarpın ve 126 2 ile mod yapın .
*Ana döngüyü tekrarlamak için tekrar sarın.
*Bir x=çiftle karşılaşıldığında, bir sonraki karakteri (alıntıyı) atlayın, bir tamsayıyı ( x değeri) okuyun ve 20'ye bölün. Bu, daha sonra kaydedilecek olan geçerli uzaklık olur.
*A >ile karşılaşıldığında, bir sonraki karakteri (genellikle captcha harflerinden biri) okuyun ve bunu geçerli ofsette bir "dizi" olarak kaydedin. Ofseti 9 olarak sıfırlayın, böylece daha sonraki >karakterlerle karşılaşıldığında captcha harfinin üzerine yazılmaz .
*Son olarak, o zaman dosya sonuna ulaşıldığında, dizide kaydedilen 7 değerin üzerinde yineleyin ve bunları birer birer çıktılayın. Bu, tüm captcha harflerini doğru sırayla vermeli.

Buradaki bazı detaylara göz atıyorum, çünkü kod yolları birbirlerini anlatması biraz zor olan yollarla örtüşüyor, ancak algoritmanın nasıl çalıştığı hakkında size genel bir fikir vermesi gerekiyor.


2

Python2, 129 bayt

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'deki HTML kaynağını alır, stdout'ta kod üretir.


Bu çıktıyı nasıl sıralar? <text>Elemanları rasgele sırada, ve tek gerçek gereksinim doğru sırayla koymak zorunda olmasıdır. Yani kullanmak zorunda anlamına xgelen <text>ve herhangi dönüşümleri izleyin.
Brad Gilbert

@ BradGilbertb2gills İlk kez, şimdi düzelttiğini özledim.
orlp

2

Mathematica, 106 bayt

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

Not: Giriş, tam olarak örnek tarafından belirtilen formatta olmalıdır.


2

V , 28 26 25 24 bayt

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

Çevrimiçi deneyin!

Açıklama:

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 bayt

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

Çevrimiçi deneyin!

X değerlerini bulur (basamaktan sonra çalışır x=") ve "harfler" (etiketleri kapatıp açarak sabitlenir), ardından aşağıdaki APL'yi ( görünüm sırasına göre bulunan x değerlerinin ve harflerin listesi ) yürütür :

3↓⍵ ilk üç öğeyi bırakın (etrafındaki boşluklar <rect/rect>ve <rect'sx değeri).

() Şuna aşağıdaki zımni işlevi uygulayın:

 kalan öğelerin sayısı

.5× yarısı kes

2,⍨ iki tane eklemek

⊢⍴⍨ bu şekle göre yeniden şekillendirin (yani bir nx2 matris)

 transpozisyon (2 × n'lik bir matrise)

⍎¨@1 ilk satırdaki her dizgiyi yürütün (sayılara çevirerek)

 matrisi iki vektöre ayırın (her satırda bir tane)

x c← bu ikisini sırasıyla x (x değerleri) ve c (karakterleri) konumunda saklayın

 ilkini seç (x)

 notlandırma (x'i sıralayan x'in indeksleri)

c[] Bunu indekslemek için kullanınc

ε her harf bir dize kendiliğinden çünkü nlist (düzleştirmek)


Tüm QuadS programının eşdeğer APL ifadesi:

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

1

Java 8, 197 173 bayt

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

Bir java.util.Collectionkarakter çıktısı alır .

Açıklama:

Çevrimiçi deneyin.

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}

Gema'da sıralama yoktur, ama neyse ki gerekli değildir.

Örnek çalışma:

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 .

Umarım bu geçerli bir çözümdür çünkü XMLStarlet bir Turing dili olan XSLT kodunu üreten ve yürüten bir aktarıcıdır.

Örnek çalışma:

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

1

PHP, 96 bayt

Verilen $igirdi dizesidir

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

1
Yerine array_combine()+ ksort()şunu kullanabilirsiniz array_multisort()böyle: array_multisort($m[1],$m[2]);echo join($m[2]);. Ancak, girişin bir değişkende bulunmasını beklemek yerine, sonucu değişkende bulmayı beklemek yerine, çözümlerin girdiyi ve çıktısını kendileri işlemesi (dil otomatik olarak yapmazsa) beklediğini unutmayın. İlgili metaya bakın .
Manatwork

1

Temiz , 277 150 bayt

Yay deseni eşleşmesi!

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

Çevrimiçi deneyin!

Fonksiyon tanımlar ?, alma [Char]ve bağışları [Char].

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.