Yardım et! Şifremi Unuttum!


24

Yardım et! Stack Exchange'e yeni giriş yaptım ancak şifremin ne olduğunu unuttum! Oturumu kapatmadan önce halletmek için bir yola ihtiyacım var.

Neyse ki ben mükemmel bir bilgisayar korsanıyım. Şifremin karma değerini bulmakla kalmayıp aynı zamanda Stack Exchange'in karma algoritmasını da buldum! Her basamağın ASCII değerini, o basamağın yeri ile çarpılarak alır, ardından tüm bu değerleri bir araya getirir. Örneğin:

"135" -> 1*49 + 2*51 + 3*53 = 310

Parolanın 3 basamak uzunluğunda olduğunu ve her karakterin 0 ile 5 arasında bir sayı (regex ile eşleşecek şekilde ^[0-5]{3}$) arasında olduğunu hatırlıyorum , ancak bu tahmin etmek için hala çok fazla seçenek var. Bir hash'i tekrar potansiyel şifrelere dönüştürebilen bir programa ihtiyacım var, ancak uzman bir bilgisayar korsanı olmasına rağmen, hayatımı kurtarmak için kod yazamıyorum! Bu testleri elle yazabildim:

input -> output
288   -> 000                      // lowest possible hash
290   -> 200, 010
298   -> 022, 050, 103, 131, 212, 240, 321, 402, 430, 511   
318   -> 555                      // highest possible hash

Biriniz benim için bir karmaşa alacak ve kullanabileceğim tüm şifreleri yazdıracak bir program yazabilir mi?

Giriş her zaman en az bir geçerli şifre üretebilecek. Dizeler açıkça tanımlandığı sürece herhangi bir çıktı formatına izin verilir. Önde gelen sıfırlarla ilgili endişelenmiyorum, bu yüzden potansiyel bir şifre ise 001kabul ediyorum 01veya 1.

Lütfen Stack Exchange'in kilitlenmeme yardım et!

puanlama

Bu , yani her dilde en kısa cevap kazanır!


Is not 1'ın Ascii değeri 49yerine 48?
LiefdeWen

1
@LordFarquaad test durumları iyi görünüyor ama örnek olması gerektiği"135" -> 1*49 + 2*51 + 3*53 = 310
LiefdeWen

1
virgülle sınırlandırılmalıdır (bir veya daha fazla boşluk tarafından izlenen virgül de tamamdır) Neden kısıtlayıcı çıkış biçimi? Genelde esnek biçimlere izin veriyoruz
Luis Mendo

1
Buradaki olağan şey, "dizelerin net bir şekilde tanımlanması koşuluyla, herhangi bir çıkış biçimine izin verilir" gibi bir şey söylemek. Veya sayısal olmayan herhangi bir ayırıcıya izin verebilir. Değiştirirseniz, mevcut cevaplayıcıları cevaplarında bir yorum yaparak haberdar edin
Luis Mendo

1
@FelipeNardiBatista Evet, baştaki sıfırlar isteğe bağlıdır. 3 basamak kullandığımı hatırlıyorum, bu yüzden sadece görürsem 54önündeki sıfırları bulabilirim.
Lord Farquaad,

Yanıtlar:



9

C , 113 108 bayt

f(int h){int i=47,j,k;while(++i<54)for(j=47;++j<54)for(k=47;++k<54;)if(h==i+j+j+k*3)printf("%c%c%c",i,j,k);}

Çıktı için ne anlama geldiğini görmek benzersizdir, çıktı şu şekildedir: 200010

Tüm şifreler sınırlayıcı olmadan 3 basamaklı olarak yazılmıştır.


2
Hey, kod okuyabilirim! Jelly ve bunun gibi güzel kontrast. Klasik bir dil kullanmak için +1. :)
Wildcard

8

Jöle , 16 bayt

Ṿ€Oæ.J
6Ḷṗ3Ç⁼¥Ðf

Rakam listelerinin bir listesini döndüren monadik bir bağlantı.

Çevrimiçi deneyin!

Nasıl?

Ṿ€Oæ.J - Link 1, hash: list of integers (the digits of a password)
Ṿ€     - unevaluate €ach (giving a list of characters)
  O    - cast to ordinals (Ṿ€O could actually be replaced with +48 too)
     J - range of length (i.e. [1,2,3] in all use-cases)
   æ.  - dot product

6Ḷṗ3Ç⁼¥Ðf - Main link: number, n
6Ḷ        - lowered range of 6 = [0,1,2,3,4,5]
  ṗ3      - Cartesian power with 3 = [[0,0,0],[0,0,1],...,[5,5,5]] (all passwords)
       Ðf - filter keep if:
      ¥   -   last two links as a dyad (right implicitly n):
    Ç     -     call last link (1) as a monad
     ⁼    -     equals right?


4

MATL , 20 bayt

'0':'5'3Z^t3:*!si=Y)

Çevrimiçi deneyin!

açıklama

'0':'5'   % Push inclusive range from '0' to '5', that is, '012345'
3Z^       % Cartesian power with exponent 3. Each Cartesian tuple is a row
t         % Duplicate
3:        % Push [1 2 3]
*         % Multiply element-wise with broadcast
!s        % Sum of each row
i         % Input number
=         % Logical mask of values that equal the input
Y)        % Use as logical index into the rows of the matrix. Implicit display



2

C # (.NET Core) , 133 131 125 123 bayt

n=>{int i,j,k;for(i=48;i<54;++i)for(j=48;j<54;++j)for(k=48;k<54;++k)if(i+j*2+k*3==n)Console.Write($"{i%48}{j%48}{k%48},");}

Çevrimiçi deneyin!


Daha önce daha ayrıntılı tavsiyeler verdim, ancak doğru çalışmasını sağlayamadım. Şimdilik basit optimizasyonum, Console.Write($"{i%48}{j%48}{k%48},");bir geri dönüş değeri oluşturmak yerine çıktı için kullanmak ve 8 byte tasarruf etmek için if ifadesinin etrafındaki gereksiz parantezleri kaldırmak.
Kamil Drakari

Bu seçeneği daha önce denedim, ancak Lambda bir dönüş değeri gerektiriyor. Parantezleri sökmek de işe yarayacak. Thanks :)
jkelm

Lambda, eğer olarak tanımlarsanız Func<int,string>, ancak o zaman tanımlarsanız, Action<int>bir dönüş değeri beklemiyorsa, bir dönüş değeri gerektirir.
Kamil Drakari

Farkında değildim! Hem c # hem de golf için yeniyim, fakat işte yapacak başka bir şeyim olmadığında denemeye karar verdim. İpuçları için tekrar teşekkürler. Onları çok takdir ediyorum.
jkelm

1
C # ile charve intarasındaki belirsizliklerle oynarsanız , yineleme değişkenlerinizi charilk döngüdeki gibi beyan edebilir ve Console.Write()cümleyi basitleştirirken aynen yaptığınız gibi yine de karma hesaplama yapabilirsiniz . Böylece 119 baytlık uygun bir çözüm elde edebilirsiniz. Çevrimiçi deneyin!
Charlie,

2

Kömür , 33 bayt

F⁶F⁶F⁶¿⁼⁺℅Iι⁺×℅Iκ²×℅Iλ³Iθ«IιIκIλ⸿

Çevrimiçi deneyin!

Diğer cevaplara benzer bir yaklaşım: 0'dan 5'e kadar olan döngü, karma değerini hesaplar ve girdi karma değeriyle çakışırsa yineleme değişkenlerinin durumunu yazdırır.

Bağlantı Ayrıntılı sürümü .


2

CJam , 26 25 bayt

Challenger5 ile -1 bayt

{:H;6Zm*{s:i3,:).*:+H=},}

Yığın üzerinde karma (tamsayı olarak) bekleyen anonim blok ve sonucu yığında (dizelerin bir listesi olarak) bırakır.

Çevrimiçi deneyin!

açıklama

:H;    e# Store the hash in H.
6Zm*   e# 3rd Cartesian power of [0 1 2 3 4 5].
{      e# For each tuple in the power:
 s     e#  Stringify the tuple.
 :i    e#  Get the code point of each digit.
 3,:)  e#  Push [1 2 3].
 .*    e#  Element-wise multiplication of the two lists.
 :+    e#  Sum the result.
 H=    e#  Check if it's equal to the hash.
},     e# Filter the tuples to only ones for which this block gave a truthy result.

@ LordFarquaad Ah, ah ... Bunu ilk başta bile görmedim, bu yüzden bu şanslıdır sanırım
Business Cat

{:H;6Zm*{s:i3,:).*:+H=},}1 bayt daha kısa. m*Otomatik aralığı kullanmak için, sayıları değil, filtredeki rakam dizelerini kullanır .
Esolanging Fruit,

@ Challenger5 Güzel, teşekkürler!
Business Cat

2

Java, 162 Bayt

static void f(int n){for(int i=48;i<54;i++){for(int j=48;j<54;j++){for(int k=48;k<54;k++){if(i+j*2+k*3==n)System.out.println((char)i+""+(char)j+""+(char)k);}}}}

2

JavaScript (Firefox 30-57), 72 bayt

n=>[for(i of s="012345")for(j of s)for(k of s)if(n-i-j*2-k*3==288)i+j+k]


1

QBIC , 40 bayt

[0,5|[0,5|[0,5|~a+b+b+c+c+c+288=:\?a,b,c

açıklama

[0,5|                Make a FOR loop run through the possible digits for pos 1, called a
[0,5|                Loop for #2, b
[0,5|                Loop for #3, c
                     Calculate the hash by taking a once, b twice and c thrice, 
                     and raising all to their ASCII codepoints
 a+b+b+c+c+c+288       
~               =:   IF thta is euqal to the given hash (read from cmd line)
\?a,b,c              THEN print the digits
                     (the IF and the FOR loops are auto-closed by QBIC)

1

R , 67 62 61 bayt

Jarko Dubbeldam sayesinde -5 bayt

b=t(t(expand.grid(rep(list(0:5),3))));b[b%*%1:3==scan()-288,]

Çevrimiçi deneyin!

sayıyı okur stdin; satırların karakter olduğu bir matris döndürür.

Olası tüm basamak basamaklarını bir matris biçiminde ( b) oluşturur, matris ürününü hesaplar, hangi b * [1,2,3]satırları beşleştirir (çıkarır)288 hangi girdiden1*48+2*28+3*48 ) ve döndürür.


1
t(t(m))kısacaas.matrix(m)
JAD
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.