Pamiętasz te brutalne programy, które łamią hasło, które pokazują każdą kombinację, której próbują? Dokładniej, w pewnym momencie n pierwszych znaków jest naprawionych (zgadywano z powodzeniem) i testowany jest każdy możliwy znak dla pozostałych. Prawdopodobnie widziałeś niektóre w filmach lub w oprogramowaniu napisanym przez ludzi, którzy lubią fantazyjne interfejsy.
Przykro nam, że rozczarowałem, ale nie napiszemy programu do łamania hasła, tylko jednego do odtworzenia ładnego wyniku.
Wyzwanie
Biorąc pod uwagę ciąg znaków zawierający drukowalne znaki ascii, ale bez znaków nowej linii (kod ascii 32 do 126 lub zgodny z wyrażeniem regularnym ^[ -~]{2,}$
), wydrukuj wynik zgodnie z następującymi regułami:
- W czasie
t=n seconds
, gdyn
pierwsze znaki drukowane sąn
pierwsze znaki ciągu wejściowego. - Po
n
ustalonych znakach należy dołączyć ciąg znaków utworzony losowo (wybrany jednolicie pseudolosowo z zakresu Unicodedo
~
(kod 32 do 126)), aby utworzyć ciąg o długości początkowej. - Powinieneś wypisywać co najmniej (więcej na ten temat później) 20 linii na sekundę: każdy z nich będzie miał te same
n
pierwsze znaki, ale inny losowy koniec.
Prawdopodobnie nie jest jeszcze bardzo jasne, co należy zrobić, więc przejdźmy przez przykład:
Przykład
Wydrukuję tylko 5 różnych wierszy na każdą sekundę zamiast 20 minimum, aby było bardziej czytelne.
Rozważ dane wejściowe abcde
.
W ciągu pierwszej sekundy prawidłowym wyjściem może być coś takiego (całkowicie losowy):
dGuT4
S!jkN
"gQ>[
TU3!
*fAjV
Następnie t=1
pierwszym znakiem każdego następnego ciągu będzie a
(pierwszy znak wejścia):
a);jD
aHv^p
aqw5*
a|.?:
a{gbK
Teraz t=2
dwie pierwsze postacie będą ab
:
abTJ"
ab\ e
ab3T#
abYWS
ab"#<
Teraz t=3
pierwsze trzy postacie będą abc
:
abcvW
abc3G
abc(g
abc{@
abc@4
Teraz t=4
pierwsze cztery znaki to abcd
:
abcdD
abcdv
abcdj
abcd$
abcd6
Na koniec t=5
wypisujemy dane wejściowe (tylko raz):
abcde
Kilka szczegółów
- Nie powinieneś zbytnio przejmować się precyzją języka w sekundach (tj. Jeśli twój algorytm jest poprawny, ale twój system / język nie ma precyzji, to jest w porządku).
- Pierwsza sekunda może być krótsza niż jedna sekunda (to znaczy, jeśli uruchomisz program w ciągu sekundy, pierwszą sekundą może być pozostały czas do końca bieżącej sekundy). Innymi słowy, nie musisz czekać na początek nowej sekundy, aby rozpocząć drukowanie wyników.
- Co najmniej 20 linii na sekundę : Bardziej naturalną metodą byłaby nieskończona pętla ze specjalnym zachowaniem co sekundę (lub przekroczenie limitu czasu lub cokolwiek innego), dzięki czemu powstanie prawdopodobnie kilka tysięcy linii na sekundę (i to doskonale! ). Ale jeśli masz inny pomysł, możesz go używać, o ile drukujesz co najmniej 20 linii na sekundę.
- Dane wejściowe zawsze będą miały więcej niż 2 znaki.
- Możesz wziąć pod uwagę, że dane wejściowe nie będą dłuższe niż 30 znaków, jeśli to pomoże. (Ale jeśli działa na dłuższe, to na najlepsze)
- Format wejściowy powinien być najbardziej naturalną reprezentacją ciągu w twoim języku.
- Możesz wydrukować końcowy znak nowej linii.
Przykład kodu
Jeśli nadal nie rozumiesz dokładnie, co musisz zrobić, możesz uruchomić następujący kod w terminalu Linux, aby zobaczyć:
perl -F -aplE 'map{$t=time;print$s,map{chr 32+rand 94}@F until$t-time;$s.=shift@F}@F' <<< "Cracking in progress\!"
Kryterium wygranej
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach!
Podziękowania dla Laikoni i Flp.Tkc za sugestie i ulepszenia w piaskownicy.
\r
(powodując, że wszystkie one zastępują się na ekranie, jak w animacji), czy jest to\n
dopuszczalne?\n
jest całkowicie do przyjęcia. Wersja z\r
jest właśnie tutaj, ponieważ wygląda lepiej, ale nie potrzebujesz ich\r
.Odpowiedzi:
Pyth -
2724 bajtówTo naprawdę wygląda całkiem fajnie: D
Wypróbuj online tutaj (oczywiście nie w czasie rzeczywistym, ale jeśli przewiniesz go pewną ręką).
źródło
HTML / JavaScript,
170168167 bajtówEdycja: Zapisano 2 bajty dzięki @ETHproductions. Zapisano 1 bajt dzięki @jrich.
źródło
setInterval
że zaakceptuje ciąg znaków do sprawdzenia, co może potencjalnie uratować bajt?setInterval('o.textContent...',d=50)
zapisuje_=>
i dodaje parę cytatówWęzeł,
145142 bajtówTo wydaje się trochę długie i prawdopodobnie jest trochę miejsca na grę w golfa. Zauważ, że średnik na końcu jest wymagany; bez tego program zgłasza błąd składniowy, ponieważ
for
instrukcja nie ma treści.Wysyła znacznie ponad 20 linii na sekundę; mała ptaszyna powiedziała mi, że to około 12 tysięcy. Oto jak to wygląda w emulatorze terminali ConEmu na moim komputerze (zarejestrowanym przy 30 fps):
źródło
05AB1E , 26 bajtów
Publikuję to jako inną odpowiedź w stosunku do innej odpowiedzi 05AB1E, ponieważ podejście jest inne
Wypróbuj online!
źródło
η
zamiast.p
;õš
(gdzieš
jest poprzedzane jako lista) zamiastõ¸ì
(gdzie¸ì
jest zawijane na liście i poprzedzaj);₂
(gdzie₂
jest 26, jeśli nie podano drugiego wejścia) zamiastT·
(który jest push 10 i podwójny);]
zamiast}}
(gdzie]
zamyka jednocześnie wszystkie pętle, instrukcje if-else itp.)BASH,
99 93 92 9188 bajtówz
tr
+head
+urandom
(dzięki za @manatwork)
źródło
[ "$n" = ${#1} ]
→((n==${#1}))
;${1:0:$n}
→${1::n}
<
nie jest potrzebne.((n==${#1}))
->((${#1}-n))
${1::n=SECONDS}
wydaje się teraz działać.05AB1E, 30 bajtów
Wykorzystuje kodowanie CP-1252 . Wypróbuj online!
Proszę, pomóż mi zagrać w golfa.
źródło
C,
182176128126125 bajtówGra w golfa:
Nie golfowany:
Słyszałem, że można upuścić niektóre standardoweJestem tylko idiotą, bez nich to działa dobrze.#include
pliki, ale nie udało mi się uruchomić kompilatora MingW GCC, który właśnie pobrałem. Nie mogłem też wymyślić, jak to zrobić#define b #include
bez zajmowania więcej miejsca niż było to warte.źródło
a,b,c,d;
ponieważ wszystkie globalne zmienne zadeklarowane w ten sposób są int i init przez 0 również, ponieważ nic nie zwracasz, powinieneś napisać to w main ()while(i++<x)
zamiastfor (...)
i
musi wynosić zero przy każdym uruchomieniu pętli for.for
zastąpići <x
zi++<x
i usunąći++
Java 7,
271265207 bajtów-58 bajtów zaoszczędzonych dzięki @ OliverGrégoire . ( Nie zapomnij głosować na jego jeszcze krótszą odpowiedź dotyczącą języka Java 8 ).
Nie golfowany:
Wejście:
abcde
Wyjście:
źródło
x
:r+=(char)(33+Math.random()*94)
. Również,Thread.sleep(9)
aby zapisać bajt.r=s.substring(0,i/20)
zamiast włączonej pętlij
.r.substring(0,i/20)
(dość głupie z mojej strony) i(char)(33+Math.random()*94)
(fajna sztuczka od ciebie).WinDbg,
400391 bajtów-9 bajtów poprzez uproszczenie matematyki
Zdecydowanie nie wydaje się, że takie jest przeznaczenie WinDbg. ;)
Wprowadzanie odbywa się przez wprowadzenie ciągu ascii w miejscu pamięci i ustawienie tego adresu w pseudorejestru
$t0
. Na przykład:Używam prng bez względu na zawartość w pamięci, niektóre bajty za ciągiem wejściowym. Wygląda na to, że Chrome.exe wypełnia miejsce w pamięci
0x2000000
bajtami o wystarczającej ilości losowo, więc użyłem zrzutu chrome.exe. Nie wiadomo, czy to jednolite, ale wydaje mi się wystarczająco losowe.Jak to działa:
Uwaga: Niektóre bajty można zagrać w golfa za pomocą
j
zamiast nich.if
, ale to powoduje, że działa on zbyt wolno na moim komputerze, więc nie wyprowadza co najmniej 20 linii na sekundę, więc nie zapisujesz tych bajtów.Przykładowe dane wyjściowe: http://pastebin.com/H4H74sAx
źródło
R, 138 bajtów
Odczytuje dane wejściowe ze standardowego wejścia.
Policzyłem około 61 linii na mojej maszynie między każdą dodatkową literą w „haśle”.
źródło
Bash,
247245212207 bajtówWielkie dzięki Bash za wrażliwość na białe znaki ...
W każdym razie dane wyjściowe podawane są w czasie rzeczywistym na osobnych liniach. Zapisz jako
.sh
skrypt i wywołaj za pomocą:bash <File Name>.sh <Input>
Na przykład
bash Cracking_In_Progress.sh okayerty
daje następującą wydajność, rejestrowaną przy 30 klatkach na sekundę:źródło
Haskell (GHC), 202 bajty
-5 bajtów bez fantazyjnej akcji powrotu karetki
źródło
>
robi na końcu wyjścia?MATL , 26 bajtów
Wypróbuj online!
Poniżej przedstawiono dane wyjściowe kompilatora offline w czasie rzeczywistym. Zwróć uwagę, że animowany GIF został nagrany przy 20 fps, aby zachować mały rozmiar, ale rzeczywista prędkość jest znacznie większa.
Jak to działa
źródło
Python3,
149141139 bajtówDane wejściowe ze standardowego wejścia.
Wersja oczy (157 bajtów):
źródło
t=time.clock
, ale używasz t tylko raz w kodzie. Zastąpienie go tylkotime.clock
zapisze 3 bajty. To samo dotyczy wydruku.for _ in range(l-x)
może byćfor _ in"a"*(l-x)
dla 2 bajtów.print(i[:x]+''.join(map(chr,random.sample(range(32,127),l-x))))
zamiastprint(i[:x]+"".join(chr(random.randint(32,126))for _ in"a"*(l-x)))
Node.js, 134 bajty
Podobne do @ETHproductions (pożyczył niektóre z jego optymalizacji), ale poza tym ma inne podejście. Używa Węzłów
Buffer
do obsługi generowania znaków zamiast długichString.fromCharCode
, co ma tę dodatkową zaletę, że pozwala nam korzystaćmap
bez większego nakładu konwersji łańcuchów> tablica>.źródło
Buffer
. Po prostu wiesz, że ponowne przypisanieDate
doD
nie zapisuje żadnych bajtów; Sam tego spróbowałem.Python 3,
167166 bajtówOdczytuje dane wejściowe ze standardowego wejścia. Wersja 171 bajtów działa pod Pythonem 2 (zastąpiona
input
przezraw_input
):Nie golfowany:
źródło
Dyalog APL ,
5958 bajtówRozwiązanie
Wymaga
⎕IO←0
ustawienia domyślnego w wielu systemach.Pokaz
Dostosowując okno do dwóch linii, uzyskujemy złudzenie transformacji w miejscu:
Wyjaśnienie
Jest to anonimowy ciąg funkcji, który przyjmuje hasło jako właściwy argument.
⊢⊣
zwróć hasło i odrzuć wynik≢{
...}¨
poniższa funkcja, z długością hasła jako lewym argumentem, zastosowana do każdego z nich2⊃⎕AI
aktualny czas pracy (świeci trzeci element informacji A ccount I nformation )1E3+
dodaj sekundęt←
przypisz to do t⊣
odrzuć to⍵{
...}⍣{t≤2⊃⎕AI}⍺
stosuj następującą funkcję (z podciągu jako as i długością hasła jako ⍵ ) wielokrotnie, aż czas up osiągnie t⍵⍴95
95 powtórzone tyle razy, ile znaków jest w haśle?
losowa liczba całkowita 0 ... 9432+
dodaj 32 (uzyskując w ten sposób ⍵ losowych liczb całkowitych z zakresu 32 ... 126)⎕UCS
przekonwertować na znak Unicode⍺,
dodaj aktualnie przetwarzany podciąg⍵↑
wprowadź tylko tyle znaków, ile jest w haśle⎕←
wyprowadza to w osobnym wierszu≢
zwraca długość wyprowadzanego ciągu (= długość hasła)⍳∘≢
0 ... długość-1↑¨
każdy bierze postacie z⊂
hasłoźródło
Java, 159 bajtów
Ten sam algorytm, co odpowiedź Kevina Cruijssena , tylko całkowicie zoptymalizowany dla Java 8.
Nie golfowany:
źródło
C #,
203197195190 bajtówGra w golfa:
Nie golfowany:
l
przechowuje długość wejściową.StopWatch
iPath.GetRandomFileName()
są częścią środowiska .NET.EDYCJA 1: Domniemana
Stopwatch
deklaracja.EDYCJA 2:
l
inicjalizacja połączona z deklaracją.EDIT3: Dzięki, @Chris.
źródło
t++
można wstawić gdzieś wif ()
if (w.Elapsed.Seconds > t++)
i usuńt++;
Scala,
259254248233232231227225 bajtówNie golfowany:
źródło
ForceLang ,
322309 bajtówźródło
C ++ (gcc) ,
280278 bajtówWypróbuj online!
Po prostu drukuje 20 losowych ciągów oczekujących na 50
std::chrono::milliseconds
między sobą (w ten sposób generując dokładnie 20 linii na sekundę), a następnie przechodzi do następnego kroku „crackowania”.źródło
Idź , 244 bajty
Wypróbuj online! (obcina wynik, aby nie wyświetlał wszystkich instancji)
To moja pierwsza odpowiedź Golanga \ o /
(Nakręcony @ 30 fps)
W jaki sposób:
źródło
PHP, 222 bajty
Nie golfił
(wiem, że film to bzdury)
źródło
$c=range(32,127)
a$r=chr($c[rand(0,94)])
dlaczego nie tylko$r=chr(rand(0,94)+32)
?<?$l=strlen($a=$argv[1]);$e=$l+$s=time();while(time()<=$e&&$o!=$a){$o=substr($a,0,time()-$s);while(strlen($o)<$l)$o.=chr(rand(0,94)+32);echo "$o\n";}
ma 149 bajtów i jestem pewien, że można dalejTcl , 295 bajtów
Pierwszy golf dla mnie w Tcl. Nie jest to bardzo golfowy język, ponieważ wszystko jest tutaj traktowane jako ciąg znaków, więc białe znaki są zwykle koniecznością ...
Nie golfowany:
źródło
-nonewline
naputs
parametr?expr
na końcu; jeden wystarczy, możesz także ominąć miejsca wokół>
expr
na końcu, nie widzę go.[set k [expr $k-1]]
może być[incr k -1]
. I każdy `<` może być<
, nie wymaga spacji.Kotlin, 188 bajtów
Grał w golfa
Nie golfił
Zmiana nazwy
System.currentTimeMillis
pozwoliła zaoszczędzić sporo bajtów!źródło
QBIC ,
9288 bajtówZłamałem to!
Zależy to od funkcji SLEEP QBasica używającej literału kodu
$sleep 1|
oraz odLEFT$
funkcji QBasic, ponieważ nie zaimplementowałem tej funkcji w QBIC ...Udało się zeskrobać kilka bajtów, podstawiając wszystkie
20
cyfryt
i ustawiając to na 20. Ponadto usprawniono wywołanie losowe i pętlę FOR.Wyjaśnienie:
Wyjście (fragment środkowej części „helloworld”)
źródło