Natknąłem się na SVGCaptcha i od razu wiedziałem, że to zły pomysł.
Chciałbym, abyś pokazał, jak zły jest to pomysł, poprzez wyodrębnienie kodu weryfikacyjnego z obrazów SVG, które wytwarza kod.
Przykładowy obraz wygląda następująco:
Oto źródło przykładowego obrazu:
<?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>
Dane wejściowe to obraz SVG, który jest formatem tekstowym.
Jedynym prawdziwym ograniczeniem jest to, że kod musi generować wartości we właściwej kolejności .
Elementy wejściowe <text>
są w kolejności losowej, więc musisz zwrócić uwagę na x
atrybut w <text>
znaczniku
Wynik to liczba bajtów w kodzie
Ponieważ kod obecnie wykonuje dwie transformacje, które się wzajemnie znoszą, możesz je zignorować, ale jeśli je weźmiesz pod uwagę, śmiało i weź 30% obniżkę swojego wyniku.
Odpowiedzi:
Bash ,
635639 bajtówUwaga: wymaga
cat
,grep
,sort
,rev
, icut
. Pobiera dane wejściowe ze standardowego wejścia. Dane wyjściowe są oddzielone podziałami linii na standardowym wyjściu. Pamiętaj, aby nacisnąć CTRL + D (nie COMMAND + D na Macu) po zakończeniu wprowadzania CAPTCHA.Po wprowadzeniu musi nastąpić nowy wiersz, a następnie „_”.EDYCJA : Zapisano 13 bajtów.
EDYCJA 2 : Zaoszczędź 20 bajtów dzięki @manatwork !
źródło
sort
wspiera pozycję znaku w keydef:cut -c4-|sort -n
→sort -k1.4n
.CJam, 26 bajtów
Wypróbuj online w interpretatorze CJam .
Jak to działa
źródło
JavaScript,
959391 bajtówedycja: -2 bajty zmieniające się
documentRoot
nalastChild
; -2 bajty zmieniają sięjoin('')
najoin``
, dzięki VɪʜᴀɴWpisz kod w konsoli przeglądarki na stronie zawierającej dany plik SVG, zapisuje dane wyjściowe konsoli.
źródło
document.rootElement
przestrajanie niezdefiniowane. Wypróbowałem Firefox i Safari('')
dwa backticks: ``t=>(l=[],r=/x="(\d*).*?>(.)/g,eval("while(e=r.exec(t))l[e[1]]=e[2];l.join``"))
(przyjmuje ciąg xml jako parametr, zwraca tekst captcha)Perl, 40 bajtów
39 bajtów kod + 1 dla -n
Przykład:
źródło
Narzędzia Bash + GNU, 53
Podobnie jak w przypadku tej odpowiedzi , wyjście to jeden znak na linię.
źródło
Perl 6 , 68 bajtów
źródło
Befunge, 79 bajtów
Wydaje się, że powinno być możliwe zagranie w golfa przynajmniej o jeden bajt, ale pracowałem nad tym już od kilku dni i jest to tak dobre, jak tylko mogłem.
Wypróbuj online!
Wyjaśnienie
Ustaw kierunek wykonywania od prawej do lewej i zawiń, aby rozpocząć główną pętlę.
Odczytaj char ze standardowego wejścia i sprawdź wartość końca pliku.
Jeśli nie jest na końcu pliku, sprawdź, czy to
>
.Jeśli nie jest to
>
, dodaj go do wartości na stosie, która śledzi ostatnie dwa znaki, i sprawdź, czy bieżąca para pasujex=
.Jeśli nie, pomnóż przez 126 i mod przez 126 2, aby usunąć najstarszą wartość z pary i zrobić miejsce dla następnej postaci.
Zawiń się ponownie, aby powtórzyć główną pętlę.
Gdy
x=
napotkasz parę, pomiń następny znak (cytat), przeczytaj liczbę całkowitą ( wartość x ) i podziel przez 20. To staje się bieżącym przesunięciem, które jest zapisywane na później.Kiedy
>
napotkasz a, przeczytaj następny znak (zazwyczaj jedną z liter captcha) i zapisz go z bieżącym przesunięciem w „tablicy”. Zresetuj przesunięcie do 9, aby litera captcha nie została nadpisana, gdy>
napotkasz późniejsze znaki.Wreszcie, gdy osiągnięty zostanie koniec pliku, iteruj 7 wartości zapisanych w tablicy i wysyłaj je jeden po drugim. To powinno dać ci wszystkie litery captcha we właściwej kolejności.
Przeglądam tutaj niektóre szczegóły, ponieważ ścieżki kodu nakładają się na siebie w sposób, który jest nieco trudny do wyjaśnienia, ale powinno dać ogólne wyobrażenie o tym, jak działa algorytm.
źródło
Python2, 129 bajtów
Pobiera źródło HTML na stdin, produkuje kod na stdout.
źródło
<text>
elementy są w przypadkowej kolejności, a jedynym wymogiem jest realne, że trzeba umieścić je w odpowiedniej kolejności. Oznacza to, że trzeba używaćx
z<text>
i śledzić transformacji.Mathematica, 106 bajtów
Uwaga: Dane wejściowe muszą mieć dokładnie format określony w przykładzie.
źródło
V ,
28262524 bajtówWypróbuj online!
Wyjaśnienie:
HexDump:
źródło
QuadS , 49 bajtów
Wypróbuj online!
Znajduje wartości x (cyfry biegną za
x="
) i „litery” (przypięte przez zamykanie i otwieranie znaczników), a następnie wykonuje następującą APL (gdzie⍵
znajduje się lista znalezionych wartości x i liter, w kolejności pojawiania się):3↓⍵
upuść pierwsze trzy elementy (spacje wokół<rect
…/rect>
i wartość<rect
„sx”).(
…)
Zastosuj następującą funkcję ukrytą:≢
liczba pozostałych pozycji.5×
połowę tego2,⍨
dodaj dwa⊢⍴⍨
zmienić kształt do tego kształtu (tj. macierz n × 2)⍉
transponuj (do matrycy 2 × n)⍎¨@1
wykonaj każdy ciąg w pierwszym rzędzie (zamieniając je na liczby)↓
podziel macierz na dwa wektory (jeden na wiersz)x c←
przechowuj te dwa odpowiednio w wartości x (wartości x) i c (znaki)⊃
wybierz pierwszy (x)⍋
oceniać w górę (indeksy na x, które sortowałyby x)c[
…]
Użyj tego do indeksowaniac
∊
ε nlist (spłaszczyć), ponieważ każda litera jest ciągiem samaRównoważne wyrażenie APL całego programu QuadS to:
źródło
Java 8,
197173 bajtówWyprowadza a
java.util.Collection
znaków.Wyjaśnienie:
Wypróbuj online.
źródło
Gema , 65 znaków
W Gema nie ma sortowania, ale na szczęście nawet nie jest potrzebne.
Przykładowy przebieg:
źródło
XMLStarlet , 46 znaków
Mamy nadzieję, że jest to prawidłowe rozwiązanie, ponieważ XMLStarlet to transpiler, który generuje i wykonuje kod XSLT, który jest kompletnym językiem Turinga.
Przykładowy przebieg:
źródło
PHP, 96 bajtów
Biorąc pod uwagę, że
$i
jest to ciąg wejściowyźródło
array_combine()
+ksort()
można użyćarray_multisort()
tak:array_multisort($m[1],$m[2]);echo join($m[2]);
. Należy jednak pamiętać, że rozwiązania powinny same obsługiwać dane wejściowe i wyjściowe (chyba że język robi to automatycznie), zamiast oczekiwać znalezienia danych wejściowych w zmiennej lub po prostu pozostawienia wyniku w zmiennej. Zobacz powiązane meta .Czysty ,
277150 bajtówDopasuj wzór!
Wypróbuj online!
Definiuje funkcję
?
, przyjmowanie[Char]
i dawanie[Char]
.źródło