Çatlama devam ediyor


57

Bu kaba kuvvet programlarının, denedikleri her kombinasyonu gösteren şifreyi kırmasını hatırladınız mı? Daha doğrusu, bir noktada n ilk karakterleri sabittir (başarılı bir şekilde tahmin edilmiştir) ve geri kalanlar için her olası karakter test edilir. Muhtemelen bazılarını filmlerde ya da fantezi arayüzleri seven insanlar tarafından yazılmış bir yazılımda gördünüz.
Üzgünüm, üzüldüm, ancak şifreyi kırmak için bir program yazmayacağız, yalnızca güzel çıktıları üretmek için bir program yazalım.

Meydan okuma

Yazdırılabilir ascii karakterleri içeren ancak yeni satırlar içermeyen (ascii kodu 32 - 126 veya regex ile eşleşen ^[ -~]{2,}$) bir dize verildiğinde , bu kuralları izleyerek bir çıktı yazdırın:

  • O zaman t=n seconds, nbasılan nilk karakterler giriş dizesinin ilk karakterleridir.
  • Sonra nsabit karakterleri, sen (Unicode aralığından üniform sözde rastgele seçilmiş bir dize oluşturulan rasgele karakter eklenir gerektiği   için ~, ilk bir uzunluğu bir dizi oluşturmak üzere (kod 126 32)).
  • En az (daha sonradan sonra) her saniyede 20 satır çıktı vermelisiniz : her biri aynı nilk karaktere, ancak farklı bir rasgele sona erecektir.

Muhtemelen henüz ne yapmanız gerektiği henüz belli değil, bu yüzden bir örnek gözden geçirelim:

Örnek

Sadece daha okunaklı olması için 20 saniyenin yerine her saniye için yalnızca 5 farklı satır yazdıracağım.

Girişi düşünün abcde.
İlk saniye boyunca geçerli bir çıktı (tamamen rastgele) gibi bir şey olabilir:

dGuT4
S!jkN
"gQ>[
TU3! 
*fAjV

Ardından, t=1aşağıdaki her dizenin ailk karakteri (girişin ilk karakteri) olacaktır:

a);jD
aHv^p
aqw5*
a|.?:
a{gbK

Şimdi, t=2ilk iki karakter ab:

abTJ"
ab\ e
ab3T#
abYWS
ab"#<

Şimdi, t=3ilk üç karakter abc:

abcvW
abc3G
abc(g
abc{@
abc@4

Şimdi t=4ilk dört karakter şöyle olacak abcd:

abcdD
abcdv
abcdj
abcd$
abcd6

Son olarak, t=5girişi yazdırıyoruz (yalnızca bir kez):

abcde

Birkaç hassas

  • Dil hassasiyetinizle saniyeler boyunca çok fazla uğraşmamalısınız (örn. Algoritmanız doğru ise ancak sistem / dilinizde hassasiyet yoksa, sorun yoktur).
  • İlk saniye bir saniyeden daha kısa olabilir (Yani, bir saniye boyunca programı başlatırsanız, ilk saniye sadece geçerli saniyenin sonuna kadar kalan süre olabilir). Veya farklı olarak, çıktıları yazdırmaya başlamak için yeni bir saniyenin başlamasını beklemeniz gerekmez.
  • Saniyede en az 20 satır : En doğal yol, saniyede özel bir davranışa sahip (veya bir zaman aşımı veya her neyse) özel bir davranışa sahip sonsuz bir döngü olacaktır, bu da saniyede birkaç bin satır ile sonuçlanacaktır (ve bu tamamen iyidir! ). Ancak başka bir fikriniz varsa, saniyede en az 20 satır yazdırdığınız sürece kullanmaktan çekinmeyin.
  • Giriş her zaman 2 karakterden uzun olacaktır.
  • Girişin, yardımcı olması halinde 30 karakterden daha uzun olmayacağını düşünebilirsiniz. (Ama daha uzun olanlar için çalışıyorsa, en iyisi için)
  • Giriş formatı, bir dize dilinizde en doğal gösterimi olmalıdır.
  • İzleyen bir yeni satır yazdırmanıza izin verilir.

Kod örneği

Tam olarak ne yapmanız gerektiğini hala anlamadıysanız, aşağıdaki kodu görmek için linux terminalinde çalıştırabilirsiniz:

perl -F -aplE 'map{$t=time;print$s,map{chr 32+rand 94}@F until$t-time;$s.=shift@F}@F' <<< "Cracking in progress\!"

Kazanma kriteri

Bu , bayt cinsinden kazanılan en kısa kod!


Önerilerinde ve sanal alandaki iyileştirmelerinden dolayı Laikoni ve Flp.Tkc'ye teşekkür ederiz.



1
Çıktı satırlarını ayırmak zorunlu mu \r(animasyondaki gibi bunların hepsini birbirlerinin yerine koymalarını sağlayarak) veya \nkabul edilebilir mi?

1
@ ais523 \ntamamen kabul edilebilir. Sürüm \rsadece burada çünkü daha iyi görünüyor, ama bunlara ihtiyacınız yok \r.
Dada

Eğer rastgele nesil şifreyi daha önce kırarsa, bu noktada durmak doğru mudur?
Jonathan Allan,

3
Kurallara, rastgele karakterlerin oradaki asıl karakter olmaması gerektiğini dahil etmemeli misiniz? Aksi takdirde, rastgele dizeler verilen parola ile eşleşebilir, ancak arama devam eder, hangi film tutkunları bir aksaklık olarak değerlendirilir.
Tom,

Yanıtlar:


3

Pyth - 27 24 bayt

Bu aslında çok hoş görünüyor: D

WJ-lQKs.d1+<QKsmOr;\~J;Q

Burada çevrimiçi deneyin (belli ki gerçek zamanlı olarak değil, ancak sabit bir el ile aşağı kaydırırsanız).


29

HTML / JavaScript, 170 168 167 bayt

setInterval('o.textContent=i.value.replace(/./g,(c,i)=>new Date-d>++i*1e3?c:String.fromCharCode(Math.random()*95+32))',d=50)
<input id=i oninput=d=Date.now()><pre id=o>

Düzenleme: @ETHproductions sayesinde 2 bayt kaydedildi. @Jrich sayesinde 1 bayt kaydedildi.


Bunu test setIntervaletmedim, ancak değerlendirilmek üzere bir bayt kurtarabilecek bir dize kabul edeceğine inanıyorum ? setInterval('o.textContent...',d=50)kaydeder _=>ve tırnak bir çift ekler
jrich

@jrich Bayt sayımı güncellemeyi unuttuğum için çok kullanışlı oldu!
Neil

20

Düğüm, 145 142 bayt

for(s=process.argv[2],d=new Date;s[a=(new Date-d)/1e3|0]+console.log(s.replace(/./g,(c,i)=>i<a?c:String.fromCharCode(32+Math.random()*95))););

Bu biraz uzun görünüyor ve muhtemelen golf oynamak için küçük bir yer var. Sonunda noktalı virgül gerekli olduğunu unutmayın; onsuz program sözdizimi hatası atar çünkü forifadenin gövdesi yoktur.

Saniyede 20 satırdan fazla çıktı; küçük bir kuş, kabaca 12 bin olduğunu söyledi. Bilgisayarımdaki ConEmu terminal emülatöründe şu şekilde görünüyor (30 fps'de kaydedilmiş):

görüntü tanımını buraya girin


10

05AB1E , 26 bayt

Bunu, yaklaşım farklı olduğu için diğer 05AB1E cevabına göre farklı bir cevap olarak gönderiyorum.

.põ¸ì¨vT·FyžQ.r¹gyg-£«}}¹»

.p                         Generate ordered prefix of input (e.g., ["a", "ab", "abc", "abcd", "abcde"] for "abcde")
  õ¸ì                      Prepend an empty string (e.g., result is ["", "a", "ab", ...])
     ¨                     Strip the last element (the same string as the input)
      v                    For each string in the array
       T·F                 For N in range(20)
          y                Push the current string
           žQ.r            Push all printable characters, shuffled
               ¹gyg-       Take the difference between the length of the input and the length of the current string -> x
                    £      Take the x first characters from the shuffled printable characters
                     «     Yield currentString + shuffledCharacters
                      }    End inner for
                       }   End outer for
                        ¹  Push input (last iteration)
                         » Join everything with newlines and implicitly display

Çevrimiçi deneyin!


Güzel cevap, benden +1! NOT: Bu olabilir 22 byte ile yeni builtins bugünlerde: ηyerine .p; õš( šliste olarak hazırla) yerine õ¸ì( ¸ìlisteye sarılır ve hazırla); ( ikinci bir giriş yapılmazsa 26'dır) yerine (10'a basar ve çift); ]yerine }}( ]tüm döngüleri, if-else deyimlerini vb. aynı anda
kapatırsa

8

BASH, 99 93 92 91 88 bayt

ile tr+ head+urandom

while ((${#1}-n));do
echo "${1::n=SECONDS}`tr -dc \ -~</dev/ur*|head -c$[${#1}-n]`"
done

(thx. için @ manatwork)


5
[ "$n" = ${#1} ]((n==${#1})); ${1:0:$n}${1::n}
manatwork

@ manatwork: whoa!
Ipor Sircer

1
1 daha: giriş yönlendirmesinin önündeki boşluğa <gerek yok.
Manatwork

1
@ manatwork ((n==${#1}))->((${#1}-n))
Ipor Sircer 22:16

1
Ya mantığı değiştirdiğin için ya da önceki sınavımı çarptım, ama ${1::n=SECONDS}şimdi çalışıyor gibi.
Manat çalışması


6

C, 182 176 128 126 125 bayt

golfed:

i;s;n;x;g(char*c){time(&s);while(c[++x]);do{n=time(0)-s;for(i=0;i<x;i++)putchar(i<n?c[i]:32+rand()%95);puts("");}while(n<x);}

Ungolfed:

#include "stdio.h"
#include "stdlib.h"
#include "time.h"
int i,s,n,x;
void g(char* c) {
  time(&s); //Get the initial time
  while(c[++x]); // x = strlen(c) (happy about this one)
  do {
    n = time(0) - s; //seconds since beginning
    for(i = 0; i < x; i++)
      //after each second, print another char of the password
      putchar(i < n ? c[i] : 32 + rand() % 95);
    puts("");
  } while(n < x); //while we haven't printed the whole word
}

Bazı standartların düşürülmesinin mümkün olduğunu duydum #include, ancak indirdiğim MingW GCC derleyicisinde çalışmasını sağlayamadım. Ayrıca #define b #include, değerinden daha fazla alan kullanmadan nasıl yapılacağını çözemedi . Ben sadece bir aptalım, onlarsız iyi çalışır.


X = 0 yerine gerekli Böyle başkalarıyla beyan edilmez a,b,c,d;hiçbir şey dönüyor beri böyle beyan tüm genel değişkenleri cuz int ve 0 ile init vardır da sen yazmalısın ana ()
Mukul Kumar

1
Teşekkürler, statik kapsam başlatmayı bilmiyordum. Onları bu şekilde ilan ettim, virgül yerine sadece iki noktalı virgüllerle. Ayrıca ana kullanmadım çünkü daha sonra almak zorunda kalacağımı düşünüyorum (int argc, char ** argv) ve bu bir bayt tonu. İnşallah bir işlev olarak bırakmak TAMAM, parametre olarak giriş alır ve biraz garip olan stdout'a çıkar.
nmjcman101

1
Yerine while(i++<x) kullanınfor (...)
Mukul Kumar

Gerçekten iyi bir fikir, ancak ifor döngüsü tekrar çalıştığında her zaman sıfır olması gerekiyor.
nmjcman101

Ardından aynı yer fordeğiştirme i <xile i++<xve kaldırmaki++
Mukul Kumar

5

Java 7, 271 265 207 bayt

void c(String s)throws Exception{for(int i=0,j,l=s.length();i<=l*20;i++){String r=s.substring(0,i/20);Thread.sleep(45);for(;j++<l;r+=(char)(32+Math.random()*95);System.out.println(r);if(s.equals(r))return;}}

-58 bayt @ OliverGrégoire sayesinde kurtardı . ( Daha kısa olan Java 8 cevabını daha da yükseltmeyi unutmayın. )

Ungolfed:

void c(String s) throws Exception{
  for(int i = 0, j, l = s.length(); i <= l*20; i++){
    String r = s.substring(0, i/20);
    Thread.sleep(45);
    for( ; j++ < l; r += (char)(32+Math.random()*95));
    System.out.println(r);
    if(s.equals(r)){
      return;
    }
  }
}

Giriş: abcde
Çıkış:

görüntü tanımını buraya girin


Saniyede yalnızca 20 satır yazdırmayı amaçlı olarak tasarlayıp tasarlamadığınızdan emin değilim, ancak golf oynamaya yardımcı olursa, yalnızca saniyede en az 20 satır yazdırmanız gerekir . "Saniyede 20 satır" matematiğinin "her saniye değiştir" matematiğinin değiştirilmesinin yardımcı olup olmadığını bilmiyorum.
nmjcman101

Buna gerek yok x: r+=(char)(33+Math.random()*94). Ayrıca Thread.sleep(9)bir bayt kaydetmek için.
Olivier Grégoire

1
Ayrıca, r=s.substring(0,i/20)döngü açık yerine j.
Olivier Grégoire

Yaptığım önemli değişiklikler göz önüne alındığında, bu yorumları dikkate alarak yanıtımı göndermeye karar verdim. Ayrıca, bayt sayısında oldukça düşük bir Java 8 çözümü (Java-akıllı, ofc).
Olivier Grégoire,

@ OlivierGrégoire Teşekkürler. Ve cevabını değiştirdim. Tüm değişiklikleri yapmadım, sadece r.substring(0,i/20)(benden oldukça aptal) ve (char)(33+Math.random()*94)(senden gelen güzel numara).
Kevin Cruijssen

4

WinDbg, 400 391 bayt

.for(r$t1=@$t0;by(@$t1);r$t1=@$t1+1){};m@$t0 L@$t1-@$t0+1 @$t1+1;r$t4=2*@$t1+2-@$t0;r$t8=@$t4+f;r$t3=0;.for(r$t2=0;@$t2<@$t1-@$t0;da@$t0){.for(r$t7=@$t0+@$t2;by(@$t7);r$t7=@$t7+1;r$t8=@$t8+1){eb@$t7 by(@$t8)%5e+20};r$t9=0;.foreach(p {.echotime}){.if7==@$t9{ea@$t4"p";.if1>@$t3{r$t3=by(@$t4+7)}};r$t9=@$t9+1};j@$t3!=by(@$t4+7)'m@$t0+@$t4-@$t1+@$t2-1 L1 @$t0+@$t2;r$t2=@$t2+1;r$t3=by(@$t4+7)'}

Bazı matematik basitleştirerek -9 bayt

Bu kesinlikle WinDbg'nin yapması gereken bir şey gibi görünmüyor. ;)

Bir hafıza yerine ascii bir dize girerek ve bu adresi sözde sicile ayarlayarak giriş yapılır $t0. Örneğin:

r$t0 = 2000000
eza @$t0 "abcde"

Kullandığım prng bellekteki içerik ne olursa olsun, giriş dizgisini geçen bayt sayısıdır. Chrome.exe daha sonra 0x2000000rasgele görünen baytlarla bellek alanını dolduruyor gibi görünüyor, bu yüzden chrome.exe dökümü kullandım. Bu üniforma ise bilinmeyen, ancak bana rastgele görünüyor.

Nasıl çalışır:

.for(r$t1=@$t0; by(@$t1); r$t1=@$t1+1){};         * From $t0, increment $t1 until the byte
                                                  * at $t1 is 0 to find length of input
m@$t0 L@$t1-@$t0+1 @$t1+1;                        * Duplicate input (memory 
                                                  * becomes: "input\0input\0")

r$t4=2*@$t1+2-@$t0;                               * Set $4 to the byte after \0 of the 
                                                  * duplicated input
r$t8=@$t4+f;                                      * Set $t8 to $t4+15, this is the prng
r$t3=0;                                           * Init $t3=0, this will hold the time

.for(r$t2=0; @$t2<@$t1-@$t0; da@$t0){             * For $t2=0, loop until it's input length,
                                                  * printing the string at $t0 after each
                                                  * loop. $t0 is where the password crack
                                                  * progress is written.
    .for(r$t7=@$t0+@$t2; by(@$t7); r$t7=@$t7+1;   * Loop over each uncracked char
                                   r$t8=@$t8+1){  * also incrementing prng ($t8)
        eb@$t7 by(@$t8)%5e+20                     * Write a visible ascii char onto the
                                                  * uncracked char position based on the 
                                                  * current byte of prng%0x5e+0x20 (prng%126+32)
    };

    r$t9=0;                                       * Set $t9=0 for updating current time
    .foreach(p {.echotime}){                      * For each (string) word in a statement
                                                  * like "Debugger (not debuggee) time: Mon 
                                                  * Nov 21 18:23:08.433 2016 (UTC - 8:00)"
        .if7==@$t9{                               * If the 7th word, ie- the current time
            ea@$t4"p";                            * Write the time at $t4
            .if1>@$t3{                            * If $t3 has not been set yet
                r$t3=by(@$t4+7)                   * ...save the current second in $t3
            }
        };
        r$t9=@$t9+1                               * Increment $t9 until it's 7
    };

    j@$t3!=by(@$t4+7)'                            * If the current second has changed
        m@$t0+@$t4-@$t1+@$t2-1 L1 @$t0+@$t2;      * Copy the cracked char from dupe input
        r$t2=@$t2+1;                              * Increment $t2 (loop ends when this is input length)
        r$t3=by(@$t4+7)                           * Save the new current second
    '
}                                                 * Final crack is printed by for loop

Not: Bazı baytlar jyerine .if's' kullanılarak golf oynayabilir , ancak bu makinemde çok yavaş çalışmasına neden olur, böylece saniyede en az 20 satır çıkmaz, bu byte'leri kurtarmaz.

Örnek Çıktı: http://pastebin.com/H4H74sAx


4

R, 138 bayt

z=Sys.time;n=nchar(x<-scan(,""));s=z();t=0;while(t<=n){t=t+z()-s;cat(substr(x,1,f<-floor(t)),intToUtf8(sample(32:126,n-f,T)),"\n",sep="")}

Stdin'den girişi okur.

Makinemde "parola" daki her bir ek harf arasında yaklaşık 61 satır sayıldı.


4

Bash, 247 245 212 207 bayt

R()(echo $SECONDS);w=`R`;until [ "$a" = "$1" ];do for i in `seq 1 $[${#1}-${#a}]`;{ a+=`printf "\x$(printf %x $[$RANDOM%127+32])"`;};echo -e "$a\r";a=${1:0:q};((`R`-w>0))&&{ w=`R`;((q++));}||:;done;echo "$a"

Boşluğa duyarlı olduğunuz için çok teşekkürler Bash ...

Neyse, çıktı gerçek zamanlı olarak ayrı satırlarda verilir. Bir .shkomut dosyası olarak kaydedin ve ile çağırın:

bash <File Name>.sh <Input>

Örneğin, bash Cracking_In_Progress.sh okayertysaniyede 30 karede kaydedilen aşağıdaki çıktıyla sonuçlanır:

Örnek çıktı


4

Haskell (GHC), 202 bayt

import System.Random
import Control.Concurrent
f s|l<-length s=mapM_(\n->putStr('\r':take n s)>>mapM(\_->toEnum<$>randomRIO(32,126))[1..l-n]>>=putStr>>threadDelay 50000)$[n|n<-[0..l-1],f<-[1..20]]++[l]

-Fantezi taşıma iade eylemi olmadan 5 bayt

görüntü tanımını buraya girin


İyi görünüyor! Fakat >çıktı sonunda bunun ne işi var ?
Mast

3
@Mast istemi bu. Kod sonunda yeni bir satır yazdırmadığından, istemi oraya gider.
Angs

4

MATL , 26 bayt

`GZ`:)' ~'olGn4Mk-I$YrhD7M

Çevrimiçi deneyin!

Çevrimdışı derleyiciden gerçek zamanlı çıktı aşağıdadır. Animasyonlu GIF'in boyutlarını küçük tutmak için 20 fps hızında kaydedildiğini ancak gerçek hızın çok daha yüksek olduğunu unutmayın.

görüntü tanımını buraya girin

Nasıl çalışır

           % Implicitly start timer
`          % Do...while
  G        %   Push input
  Z`       %   Push timer's current value, say t
  :)       %   Select the first t elements of the input, with t
           %   implicitly rounded down
  ' ~'     %   Push this string
  o        %   Convert to numbers, i.e. [32 126]
  l        %   Push 1
  Gn       %   Push input size, say n
  4Mk      %   Push floor(t), where t is the same value used above
  k        %   Subtract. Gives n-floor(t)
  I$Yr     %   Generate a row vector of n-floor(t) integers randomly
           %   chosen from 32 to 126
  h        %   Concatenate with the first characters of the input
  D        %   Display
  7M       %   Push the value n-floor(t) used above. This is used
           %   as loop condition: iz zero the loop is exited 
           % Implicit end

2
Bu kod çok mutlu. :)
sethmlarson

@SethMichaelLarson Bunun sebebi, alıntı işaretlerinin dengeli olması, ki genellikle gerçekleşmiyor :-)
Luis Mendo

3

Python3, 149 141 139 bayt

import time,random
i,x=input(),0;l=len(i)
while x<l:x=int(time.clock());print(i[:x]+"".join(chr(random.randint(32,126))for _ in"a"*(l-x)))

Stdin'den giriş.

Gözler sürümü (157 bayt):

import time,random
p,i,x=print,input(),0;l=len(i)
while x<l:x=int(time.clock());p(i[:x]+"".join(chr(random.randint(32,126))for _ in"a"*(l-x)),end="\r")
p(i)

1
Sadece bir kez yaptığınız şeyleri “yeniden adlandırarak” birkaç bayttan tasarruf edebileceğinizi düşünüyorum. Mesela sahipsin t=time.clock, ama kodda sadece bir kere kullanırsın. Sadece time.clockbununla değiştirmek 3 byte kazanacaktır. Baskı için aynı şey.
nmjcman101

@ nmjcman101 Üzgünüz, önceki sürümden itibaren devam eder. Teşekkürler!
matsjoyce

Ayrıca sizin for _ in range(l-x)olabilir for _ in"a"*(l-x)2 byte için.
nmjcman101

@ nmjcman101 Güzel! Bunu hatırlamalıyım ...
matsjoyce 22:16

Deneyin print(i[:x]+''.join(map(chr,random.sample(range(32,127),l-x))))yerineprint(i[:x]+"".join(chr(random.randint(32,126))for _ in"a"*(l-x)))
x1Mike7x

3

Node.js, 134 bayt

for(s=[...process.argv[2]],n=new(d=Date);s[m=(new d-n)/1e3|0]+console.log(s.map((a,i)=>i<m?a:Buffer([Math.random()*95+32])).join``););

@ETHproductions benzer (onun optimizasyonlarının bir kısmını ödünç aldı), ancak başka türlü farklı bir yaklaşım sergiliyor. Düğüm en kullanır Bufferuzun yerine karakter nesil işlemek için String.fromCharCodebize kullanmalarına izin gibi ek faydası olan, mapçok STRING> array-> string dönüşüm yükü olmadan.


Güzel, daha fazlasını öğrenmeliyim Buffer. Eğer, yeniden atama Bilesin ki Datehiç Dherhangi bayt kaydetmez; Bunu kendim denedim.
ETHProductions

3

Python 3, 167 166 bayt

import time,random
t=time.time
p,s=input(),t()
while t()-s<len(p):print(p[:int(t()-s)]+''.join(chr(random.randint(32,126))for _ in range(len(p)-int(t()-s))))
print(p)

Stdin'den girişi okur. Bir 171 bayt sürümü Python 2 (değiştirildi altında çalışır inputile raw_input):

import time,random
t=time.time
p,s=raw_input(),t()
while t()-s<len(p):print(p[:int(t()-s)]+''.join(chr(random.randint(32,126))for _ in range(len(p)-int(t()-s))))
print(p)

Ungolfed:

import random
import time

p = input()
start = time.time()
while time.time() - start < len(p): 
    print(
        p[:int(time.time() - start)] + 
        ''.join(chr(random.randint(32, 126)) for _ in range(len(p) - int(time.time()-start)))
    )
print(p)

3

Dyalog APL , 59 58 bayt

Çözüm

⎕IO←0Birçok sistemde varsayılan olanı gerektirir .

⊢⊣≢{⍵{≢⎕←⍵↑⍺,⎕UCS 32+?⍵⍴95}⍣{t2⊃⎕AI}⍺⊣t1E3+2⊃⎕AI}¨⍳∘≢↑¨⊂

Görüntüle

Pencereyi iki satıra ayarlayarak, yerinde dönüşüm yanılsamasını elde ederiz:
Dyalog APL kodu kırma animasyonu

açıklama

Bu, şifreyi doğru argüman olarak alan isimsiz bir fonksiyon trenidir.

⊢⊣ şifreyi döndür ve sonucunu reddet

≢{... aşağıdaki işlev, şifrenin sol bağımsız değişken olarak uzunluğu ile birlikte, her birine uygulanır.

2⊃⎕AIgüncel çalışma süresi (litre A ccount I bilgilerinin üçüncü elemanı )

1E3+ ikinci ekle

t←bunu t olarak ata

reddet

⍵{... }⍣{t≤2⊃⎕AI}⍺(gibi alt dize ile aşağıdaki işlevi uygulamak gibi şifre uzunluğu yukarı zamanlı ulaşıncaya kadar art arda) t

  ⍵⍴95 95 şifrenizdeki karakter sayısı kadar tekrarlandı

  ? rasgele tamsayı 0 ... 94

  32+ekle 32 (bu şekilde elde ... 126 aralığında 32 rasgele tamsayılar)

  ⎕UCS Unicode karakterine dönüştür

  ⍺, şu anda işlenen alt dizeyi hazırla

  ⍵↑ sadece şifrede olduğu kadar karakter al

  ⎕← ayrı bir satıra çıktı

   çıkarılan dizenin uzunluğunu döndürür (= şifrenin uzunluğu)

⍳∘≢ 0 ... uzunluk-1

↑¨her karakter alarak

şifre


2

Java, 159 bayt

s->{for(int i=0,j,l=s.length();i<=l*99;i++){String r=s.substring(0,j=i/20);Thread.sleep(9);for(;j++<l;r+=(char)(32+Math.random()*95));System.out.println(r);}}

Kevin Cruijssen'in cevabıyla aynı algoritma , yalnızca Java 8 için tamamen optimize edilmiş.

Ungolfed:

public class Tmp {

  interface X {

    void f(String s) throws Exception;
  }
  static X f = s -> {
    for (int i = 0, j, l = s.length(); i <= l * 20; i++) {
      String r = s.substring(0, j = i / 20);
      Thread.sleep(48);
      for (; j++ < l; r += (char) (32 + Math.random() * 94));
      System.out.println(r);
    }
  };

  public static void main(String[] args) throws Exception {
    f.f("abcde");
  }
}

1

C #, 203 197 195 190 bayt

golfed:

void F(string s){int l=s.Length,t=0;var w=Stopwatch.StartNew();do{if(w.Elapsed.Seconds>t)t++;Console.WriteLine($"{s.Substring(0,t)}{Path.GetRandomFileName().Substring(0,l-t)}");}while(t<l);}

Ungolfed:

    void F(string s)
    {
        int l = s.Length, t = 0;
        var w = Stopwatch.StartNew();

        do
        {
            if (w.Elapsed.Seconds > t)
                t++;

            Console.WriteLine($"{s.Substring(0, t)}{Path.GetRandomFileName().Substring(0, l - t)}");
        } while (t < l);
    }

l giriş uzunluğunu saklar.

StopWatchve Path.GetRandomFileName().NET çerçevesinin parçalarıdır.

EDIT1: Örtülü Stopwatchbildirim.

EDIT2: lBaşlatma, bildirimle birleştirildi.

EDIT3: Teşekkürler, @ Chris.


Kronometreyi yenilerken kaydetmek için Stopwatch.StartNew () statik yöntemini kullanabilir ve açıkça başlatabilirsiniz
Chris

@ Chris, bu metodu bilmiyordum, thx.
paldir

t++bir yere eklenebilirif ()
Mukul Kumar

@MukulKumar Lütfen daha fazla ayrıntı verebilir misiniz?
paldir

Kullan if (w.Elapsed.Seconds > t++)ve kaldırt++;
Mukul Kumar

1

Scala, 259 254 248 233 232 231 227 225 bayt

import scala.concurrent.duration._;(b:String)=>{val d=b.length.seconds.fromNow;while(d.hasTimeLeft)println(b.zipWithIndex.map{case(f,g)=>if(g<b.length-d.timeLeft.toSeconds-1)f else(32+math.random*94)toChar}mkString);print(b)}

Ungolfed:

import scala.concurrent.duration._;

(b:String) => {
    val d = b.length.seconds.fromNow;
    while(d.hasTimeLeft)
        println(
            b.zipWithIndex.map{
                case(f,g) => 
                    if(g<b.length-d.timeLeft.toSeconds-1)
                        f 
                    else
                        (32+math.random*94)toChar}
            mkString
        );

    print(b)
}

1

ForceLang , 322 309 bayt

def s set
s g goto
s W io.writeln
s k io.readln()
s T timer.new()
def a T.poll()
label 1
s P math.floor a.mult 1e-6
if P=k.len
 W k
 exit()
s j 0
s t ""
if P=0
g 4
label 3
s v k.charAt j
s t t+v
s j 1+j
if j-P
g 3
label 4
if j=k.len
 W t
 g 1
s r 94.mult random.rand()
s v string.char 32+r
s t t+v
s j 1+j
g 4

Kullandığınız programlama dili için bir link ekler misiniz?
Solomon Ucko

@ SolomonUcko İşte gidiyoruz.
SuperJedi224

1

C ++ (gcc) , 280 278 bayt

#include<iostream>
#include<chrono>
#include<cstdlib>
#include<thread>
int i,n,t,q;void f(std::string s){for(t=s.size(),n=0;n<=t;n++)for(q=n<t?20:1;q--;std::this_thread::sleep_for(std::chrono::milliseconds(50)))for(std::cout<<"\n"<<s.substr(0,i=n);i++<t;)putchar(32+rand()%84);}

Çevrimiçi deneyin!

Sadece std::chrono::millisecondsaralarında 50 bekleyen 20 rastgele dizeyi basar (böylece saniyede tam 20 satır çıkarır) ve daha sonra bir sonraki "çatlama" aşamasına geçer.


1

Git , 244 bayt

import(."fmt"
."math/rand"
."time")
func a(s string){Seed(Now().Unix())
for i:=0;i<len(s);i++{t:=Now().Truncate(Second).Add(Second)
for Now().Before(t){q:=[]rune(s)
for p:=len(q)-1;p>=i;p--{q[p]=rune(32+Intn(95))}
Println(string(q))}}
Print(s)}

Çevrimiçi deneyin! (sonucu kısaltır, böylece her örneği göstermez)

Bu benim ilk Golang cevabım \ o /

görüntü tanımını buraya girin

(@ 30fps'de çekildi)

Nasıl:

func a(s string) {                      //function a
Seed(Now().Unix())                      //Create a seed for the pRNG
for i := 0; i < len(s); i++ {           //set helper var i (this is the number of characters we'll keep)
t := Now().Truncate(Second).Add(Second) //set helper var t = 1 second from now
for Now().Before(t) {                   //while inside that 1 second window
q := []rune(s)                          //put each character in a rune slice and assign that to q
for p := len(q) - 1; p >= i; p-- {      //loops through the rune slice
q[p] = rune(32 + Intn(95))              //replace the character in position p with a random code point in [32,126]
}
Println(string(q))                      //print the rune slice as a string
}
}
Print(s)                                //finally, print the original string
}

0

PHP, 222 bayt

$a=$argv[1];$c=range(32,126);$t=time();$s=$t;$e=$t+strlen($a);while(time()<=$e){$l=time();$p=$l-$s;$x=substr($a,0,$p);$k=$e-$l;$r='';for($i=$k;$i>0;$i--)$r.=chr($c[rand(0,94)]);$o=$x.$r;echo"$o\n";if($o==$a&&$l==$e)break;}

Ungolfed

<?php
$input = $argv[1];
$chars = range(32, 126); // count() is 95

$startTime = time();
$endTime = time() + strlen($input);

while (time() <= $endTime) {
    $plaintextAmountToPrint = time() - $startTime;

    $plain = substr($input, 0, $plaintextAmountToPrint);

    $cryptAmountToPrint = $endTime - time();

    $crypt = '';

    for ($i = $cryptAmountToPrint; $i > 0; $i--)
        $crypt .= chr($chars[rand(0, 94)]);

    $output = $plain . $crypt;

    echo $output . "\n";

    if ($output == $input && time() == $endTime)
        break;
}

(videonun saçma olduğunu biliyorum) görüntü tanımını buraya girin


Bu çok daha fazla golf olabilir. Örneğin, yerine $c=range(32,127)ve sonra $r=chr($c[rand(0,94)]), neden sadece değil $r=chr(rand(0,94)+32)?
Xanderhall

İyi bir nokta. Bu benim ilk
golf'üm

<?$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";}149 bayt ve bunu daha da golfed edilebilir eminim
Xanderhall

Harika, o adamı göndermelisin.
Nino Škopac

Sadece cevabınızı düzenleyin, değiştirmenize ve geliştirmenize izin verilir.
Xanderhall

0

Tcl , 295 bayt

Tcl'de benim için ilk golf. Çok oynanabilir bir dil değil, çünkü her şey burada ip olarak kabul edilir, bu nedenle boşluk genellikle bir zorunluluktur ...

set l [string length $argv];set s [clock seconds];set r -1;while {$r<$l-1} {puts -nonewline [string range $argv 0 $r];set k $l;while {[set k [expr $k-1]]>$r} {puts -nonewline [format %c [expr int(rand()*95+32)]]};puts "";if {[expr [clock seconds]-$s]>[expr $r+1]} {set r [expr $r+1]}};puts $argv

Ungolfed:

set l [string length $argv]
set s [clock seconds]
set r -1
while {$r < $l-1} {                                      # loop on time
  puts -nonewline [string range $argv 0 $r]
  set k $l
  while {[set k [expr $k-1]] > $r} {                     # loop on "unfound" chars
    puts -nonewline [format %c [expr int(rand()*95+32)]]
  }
  puts ""
  if {[expr [clock seconds]-$s] > [expr $r+1]} {         # advance time
    set r [expr $r+1]
  }
}
puts $argv

Neden önlemek için, bütün onlara katılmak ardından bir değişken üzerinde çıktı saklamayın -nonewlineüzerinde putsparametrenin?
sergiol,

Sanırım exprsonunda ikisine ihtiyacınız yok ; biri yeterli, ayrıca etrafındaki boşluklardan da kaçınabilirsiniz >
sergiol

Teşekkürler @sergiol,>, boşluk yok, yoğunlaştırılmış sürüme bak. Lütfen exprsonunda nasıl kullanılacağını tavsiye et , göremiyorum.
hdrz

iki önerimin demosunu .
sergiol

1
[set k [expr $k-1]]olabilir [incr k -1]. Ve her bir `<` olabilir <, boşluk gerekmez.
sergiol

0

Kotlin, 188 bayt

golfed

val x=readLine()!!;val n=System::currentTimeMillis;val t=n();do{val s=(n()-t)/1000;x.mapIndexed{i,c->print(if(i<s)c else((Math.random()*(126-32))+32).toChar())};println()}while(s<x.length)

Ungolfed

val input = readLine()!!
val time = System::currentTimeMillis
val startTime = time()
do {
    val crackIndex = (time() - startTime) / 1000
    input.mapIndexed{ i, letter ->
        print(
            if (i < crackIndex) letter else ((Math.random()*(126-32))+32).toChar()
        )
    }
    println()
} while(crackIndex < input.length)

görüntü tanımını buraya girin

Yeniden adlandırma System.currentTimeMillisepeyce bayt kurtardı!


0

QBIC , 92 88 bayt

Kırdım!

t=20;_LA|[a*t-t|B=$left$|(A,b/t)[a|B=B+$CHR$|(_r94|+32)]?$left$|(B,a)~b%t=0|$sleep 1|}?A

Bu $sleep 1|, değişmez kodu kullanan LEFT$QBasic'in SLEEP işlevine ve QBIC'in işlevine dayanıyor çünkü bu işlevi QBIC'de henüz uygulamadım ...

Tüm yerine bir kaç bayt kazımak için Yönetilen 20için 's tve aynı zamanda 20'ye kadar olduğunu belirleyen döngü İÇİN rastgele çağrı ve aerodinamik.

Açıklama:

' Get cmd line param with 'password' and the length of that string, set t to 20
t=20;_LA|

' loop from 1 (implicitly) to (#chars-1) * 20 cracks per char
[a*-t|

'have our crack-display start with the first N chars of
'the password, where N is the number of seconds passed   
B=$left$|(A,b/t)

' loop to add the 'crack-visual'
' It's too long, but we'll trim it down to the original length
[a|B=B+$CHR$|(_r92|+34)]?$left$|(B,a)

' if we've done 20 cracks, sleep for 1 second
~b%20=0|$sleep 1|}

' We've cracked it!
?A

Çıktı ('helloworld' orta bölümünün bir parçası)

hewnoluZfs
heb!mrc2g@
hee+yh"5ut
he0?V+O)Uu
heqf(#M/BM
hez|DGX%a8
he<_n[6-.+
helkxQ#g%,
hel&^A9$I8
hel43{b5]t
helszK50%F
hel`kdy ;b
hel Vr6Z}s
helLIR7*7o 
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.