Myślę o liczbie (Wątek gliny)


32

Wątek rabusia tutaj

W tym wyzwaniu gliniarze gliniarze pomyślą o dodatniej liczbie całkowitej. Następnie napiszą program lub funkcję, która wyprowadza jedną wartość, gdy poda liczbę jako dane wejściowe, a drugą wartość dla wszystkich innych dodatnich liczb całkowitych. Następnie policjanci ujawnią program w odpowiedzi, zachowując numer w tajemnicy. Rabusie mogą złamać odpowiedź, znajdując numer.

Oto haczyk: to nie jest , zamiast tego twój wynik będzie tajną liczbą z niższym wynikiem, który będzie lepszy. Oczywiście nie możesz ujawnić swojego wyniku, gdy rabusie wciąż próbują go znaleźć. Odpowiedź, która nie została złamana tydzień po opublikowaniu, może mieć wynik i zostać oznaczona jako bezpieczna. Bezpiecznych odpowiedzi nie można złamać.

Prawdopodobnie jest to oczywiste, ale powinieneś być w stanie zdobyć swoją odpowiedź. Oznacza to, że powinieneś dokładnie wiedzieć, jaką wartość akceptuje maszyna decyzyjna. Sama wiedza, że ​​istnieje, nie wystarczy.

Korzystanie z funkcji kryptograficznych

W przeciwieństwie do większości wyzwań gliniarzy i rabusiów, którzy proszą cię o nieużywanie funkcji kryptograficznych, wyzwanie to nie tylko całkowicie im pozwala, ale zachęca. Możesz tworzyć odpowiedzi w dowolny sposób, dopóki próbujesz wygrać. Biorąc to pod uwagę, mile widziane są również odpowiedzi przy użyciu innych metod. Celem tego wyzwania jest zwycięstwo i dopóki nic nie oszukasz, nic nie jest poza stołem.


1
Jeśli zezwalasz na funkcje cytograficzne, zaleciłbym ograniczenie czasowe programów.
Okx,

12
Odrzuciłem to wyzwanie, ponieważ w większości języków można je po prostu złamać za pomocą algorytmu mapowania lub prostej pętli. Uważam, że jest to trochę zbyt łatwe na wyzwanie dla gliniarzy i rabusiów .
Mr. Xcoder

2
Wydaje mi się, że będzie wielu gliniarzy, którzy znają jedną (prawdopodobnie najmniejszą) akceptowaną wartość, ale nie wiedzą, czy jest więcej poprawnych odpowiedzi lub jakie są.
histocrat

12
@ Mr.Xcoder Możesz swobodnie głosować, jednak zaznaczę, że jest to swego rodzaju wyzwanie, a nie moim zdaniem wada. Wyzwanie jest przede wszystkim zabawne dla gliniarzy, którzy muszą maksymalnie utrudniać brutalną siłę, spowalniając obliczenia. Bardziej kreatywne odpowiedzi powinny sprawić, że brutalne zmuszanie będzie coraz trudniejsze, umożliwiając im używanie coraz mniejszych liczb.
Wheat Wizard

1
@WheatWizard Zakładam, że nie byłoby wygranej, ale nie byłoby to możliwe do zgryzienia przykład program, który po prostu porównuje wkład A(9,9)gdzie Ajest funkcja Ackerman.
flawr

Odpowiedzi:


10

Tampio , pęknięty

m:n tulos on luvun funktio tulostettuna m:ään, missä luku on x:n kerrottuna kahdella seuraaja, kun x on luku m:stä luettuna
x:n funktio on luku sadalla kerrottuna sadalla salattuna, missä luku on x alempana sadan seuraajaa tai nolla
x:n seuraajan edeltäjä on x
x:n negatiivisena edeltäjä on x:n seuraaja negatiivisena
nollan edeltäjä on yksi negatiivisena
x salattuna y:llä on örkin edeltäjä, missä örkki on x:n seuraajan seuraaja jaettuna y:llä korotettuna kahteen
sata on kiven kolo, missä kivi on kallio katkaistuna maanjäristyksestä
kallio on yhteenlasku sovellettuna mannerlaatan jäseniin ja tulivuoren jäseniin
tulivuori on nolla lisättynä kallioon
mannerlaatta on yksi lisättynä mannerlaattaan
maanjäristys on kallion törmäys
a:n lisättynä b:hen kolo on yhteenlasku kutsuttuna a:lla ja b:n kololla
tyhjyyden kolo on nolla
x:n törmäys on x tutkittuna kahdellatoista, missä kaksitoista on 15 ynnä 6
x ynnä y on y vähennettynä x:stä

Biegnij z:

python3 suomi.py file.suomi --io

Instrukcje instalacji interpretera znajdują się na stronie Github. Poinformuj, czy masz jakiekolwiek trudności z uruchomieniem tego.

Program w pseudokodzie.Program działa bardzo wolno, ponieważ mój tłumacz jest bardzo nieefektywny. Nie korzystałem też z żadnych dostępnych optymalizacji opt-in, które mogą skrócić czas oceny z kilku minut do około 10 sekund.


1
Czy nie ma tłumacza internetowego dla Tampio?
Kudłaty

@Shaggy Jeszcze niestety. Prawdopodobnie powinienem zapytać, czy można go dodać do TIO.
fergusq


5

Perl 6 - Cracked!

W ścisłym znaczeniu nie jest to akceptowalne poddanie się, ponieważ nie stara się bardzo wygrać. Zamiast tego ma nadzieję zaoferować przyjemną łamigłówkę.

Jest to program „czystej matematyki” przeznaczony do łamania przez kontemplację. Jestem pewien, że możesz brutalnie wymusić rozwiązanie (po oczyszczeniu niektórych niechlujnych programów, które celowo popełniłem), ale dla pełnego uznania (: -)) powinieneś być w stanie wyjaśnić, co robi z powodów matematycznych .

sub postfix:<!>(Int $n where $n >= 0)
{
	[*] 1 .. $n;
}

sub series($x)
{
	[+] (0 .. 107).map({ (i*($x % (8*π))) ** $_ / $_! });
}

sub prefix:<∫>(Callable $f)
{
	my $n = 87931;
	([+] (0 .. $n).map({
		π/$n * ($_ == 0 || $_ == $n ?? 1 !! 2) * $f(2 * $_/$n)
	})).round(.01);
}

sub f(Int $in where $in >= 0)
{
	 { series($_)**11 / series($in * $_) }
}

Powinieneś złamać funkcję f (). (Jest to funkcja, która pobiera jedną liczbę naturalną i zwraca jeden z dwóch wyników.) Ostrzeżenie: Jak pokazuje @Nitrodon, program zachowuje się nieprawidłowo i „akceptuje” nieskończoność liczbę danych wejściowych. Ponieważ nie mam pojęcia, jak to naprawić, zwracam uwagę na przyszłe rozwiązania, że liczba, o której myślałem, jest mniejsza niż 70000 .

Jeśli spróbujesz uruchomić to w TIO, to upłynie czasu. To celowe. (Ponieważ to wcale nie powinno być uruchamiane!)

W końcu próbowałem napisać dość rozsądny kod. Powinieneś być w stanie płynnie czytać, nawet jeśli nie znasz języka. Tylko dwie uwagi: nawiasy kwadratowe [ op ] oznaczają zmniejszenie („składanie”, w języku żargonowym Haskell) listy z operatorem op ; a wywołany sub postfix:<!>określa operator postfiksu o nazwie! (tj. używane jak5! - robi dokładnie to, czego można oczekiwać). Podobnie dla tego prefix:<∫>jednego.

Mam nadzieję, że komuś się to spodoba, ale nie jestem pewien, czy dobrze poradziłem sobie z trudem. Nie krępuj mnie w komentarzach :—).

Wypróbuj online!



4

JavaScript, pęknięty

Zaciemniłem to tak bardzo, jak potrafię, do tego stopnia, że ​​nie mieści się w tej odpowiedzi.

Wypróbuj tutaj! Kliknij Uruchom, a następnie wpisz w konsoliguess(n)

Zwraca niezdefiniowany, jeśli otrzymujesz złą odpowiedź, w przeciwnym razie zwraca true.

Edycja: Jakoś przeoczyłem część dotyczącą tego, że mój wynik to liczba. No cóż, mój numer jest bardzo, bardzo duży. I tak powodzenia w rozwiązywaniu problemu.



3

Galaretka , wynik: ... 1 ( pęknięty )

5ȷ2_c⁼“ḍtṚøWoḂRf¦ẓ)ṿẒƓSÑÞ=v7&ðþạẆ®GȯżʠṬƑḋɓḋ⁼Ụ9ḌṢE¹’

Wypróbuj online!

1 Naprawdę spodziewałem się, że to ujawnię? Daj spokój! No cóż, ma wynik 134. Tam, powiedziałem!



@ Mr.Xcoder żył długo ...
Erik the Outgolfer

Właśnie dodałem Ç€Gi zakres 1...1000jako dane wejściowe: P
Mr. Xcoder

Widziałeś tę 5ȷ2_część, prawda?
Erik the Outgolfer

Nie, nawet nie spojrzałem na kod lol. Właśnie dodałem zestaw testowy i zobaczyłem, gdzie 1jest, a następnie wkleiłem ciąg od początku do 1skryptu w języku Python i policzyłem liczbę zer przed nim ...
Pan Xcoder

3

Python 2 (cracked)

Nie sugerowałbym brutalnej siły. Mam nadzieję, że lubisz generatory!

print~~[all([c[1](c[0](l))==h and c[0](l)[p]==c[0](p^q) for c in [(str,len)] for o in [2] for h in [(o*o*o+o/o)**o] for p,q in [(60,59),(40,44),(19,20),(63,58),(61,53),(12,10),(43,42),(1,3),(35,33),(37,45),(17,18),(32,35),(20,16),(22,30),(45,43),(48,53),(58,59),(79,75),(68,77)]] + [{i+1 for i in f(r[5])}=={j(i) for j in [q[3]] for i in l} for q in [(range,zip,str,int)] for r in [[3,1,4,1,5,9]] for g in [q[1]] for s in [[p(l)[i:i+r[5]] for p in [q[2]] for i in [r[5]*u for f in [q[0]] for u in f(r[5])]]] for l in s + g(*s) + [[z for y in [s[i+a][j:j+r[0]] for g in [q[0]] for a in g(r[0])] for z in y] for k in [[w*r[0] for i in [q[0]] for w in i(r[0])]] for i in k for j in k] for f in [q[0]]]) for l in [int(raw_input())]][0]

Wypróbuj online!

Wyjścia 1dla poprawnej liczby, w 0przeciwnym razie.



@LeakyNun Wow, trochę szybciej niż się spodziewałem.
Syzyf

Znalezienie internetowego rozwiązania sudoku nie jest trudne.
Leaky Nun

Wystąpił problem z programem do sprawdzania sudoku: sprawdziłeś, czy linie poziome i pionowe są w porządku, ale sprawdziłeś tylko pierwsze trzy komórki.
Leaky Nun

@LeakyNun Masz rację, apowinno być i+a. Naprawiłem to, ale i tak pękło wzruszenie ramionami
Syzyf

3

Haskell , popękany

Jest to oparte wyłącznie na arytmetyce. Zauważ, że myfunjest to faktyczna funkcja, podczas gdy hjest tylko funkcją pomocniczą.

h k = sum $ map (\x -> (x*x)**(-1) - 1/(x**(2-1/(fromIntegral k)))) [1..2*3*3*47*14593]
myfun inp | inp == (last $ filter (\k -> h k < (-7.8015e-5)  )[1..37*333667-1]) = 1
          | otherwise = 0

main = print $ show $ myfun 42 -- replace 42 with your input

Wypróbuj online!


Program musi zakończyć się bez błędów na wszystkich wejściach. Czy to kończy się nawet w ciągu jednego dnia na nieograniczonej pamięci?
michi7x7

Potrzebujesz sporo pamięci, ale na pewno nie potrzebujesz nieograniczonej pamięci. Prawdopodobnie zależy to od implementacji i sprzętu. Ale jest oczywiście zaprojektowany, aby poświęcić trochę czasu na obliczenia, aby utrudnić ataki brutalną siłą i zachęcić do analizy programu. Powodzenia :)
błąd


2

Java, Cracked by Nitrodon

import java.math.BigDecimal;

public class Main {
    private static final BigDecimal A = BigDecimal.valueOf(4);
    private static final BigDecimal B = BigDecimal.valueOf(5, 1);
    private static final BigDecimal C = BigDecimal.valueOf(-191222921, 9);
    private static BigDecimal a;
    private static BigDecimal b;
    private static int c;

    private static boolean f(BigDecimal i, BigDecimal j, BigDecimal k, BigDecimal l, BigDecimal m) {
        return i.compareTo(j) == 0 && k.compareTo(l) >= 0 && k.compareTo(m) <= 0;
    }

    private static boolean g(int i, int j, BigDecimal k) {
        c = (c + i) % 4;
        if (j == 0) {
            BigDecimal l = a; BigDecimal m = b;
            switch (c) {
                case 0: a = a.add(k); return f(C, b, B, l, a);
                case 1: b = b.add(k); return f(B, a, C, m, b);
                case 2: a = a.subtract(k); return f(C, b, B, a, l);
                case 3: b = b.subtract(k); return f(B, a, C, b, m);
                default: return false;
            }
        } else {
            --j;
            k = k.divide(A);
            return g(0, j, k) || g(1, j, k) || g(3, j, k) || g(3, j, k) || g(0, j, k) || g(1, j, k) || g(1, j, k) || g(3, j, k);
        }
    }

    private static boolean h(int i) {
        a = BigDecimal.ZERO; b = BigDecimal.ZERO; c = 0;
        return g(0, i, BigDecimal.ONE);
    }

    public static void main(String[] args) {
        int i = Integer.valueOf(args[0]);
        System.out.println(!h(i) && h(i - 1) ? 1 : 0);
    }
}

Chciałem wypróbować coś innego niż zwykłe funkcje skrótu i ​​losowe. Możesz przekazać liczbę jako argument wiersza poleceń. Wyprowadzane, 1jeśli podana jest poprawna liczba i 0inaczej. W przypadku małych liczb możesz także spróbować online .

Wskazówka:

Główna część programu implementuje wariant bardzo dobrze znanego algorytmu. Gdy dowiesz się, co robi, będziesz mógł zoptymalizować dany program, aby obliczyć tajną liczbę.

Wyjaśnienie:

Ten program realizuje przejście wariantu kwadratowego (typ 2) dobrze znanej krzywej Kocha (zdjęcie z Wikipedii): Tajna liczba jest pierwszą iteracją, która nie przechodzi przez punkt (B, C). Jak poprawnie rozpoznał Nitrodon , z wyjątkiem pierwszej iteracji możemy bezpiecznie zignorować rekurencję wszystkich części krzywej, które nie przechodzą przez dany punkt. Zmieniając odpowiednio wiersz w oryginalnym programie, możemy sprawdzić poprawny numer nawet w tłumaczu online .

Quadratic_Koch_curve_type2_iterations.png


Chyba pęknięty ; czas działania jest zbyt długi, aby zweryfikować bezpośrednio, ale sprawdziłem łatwiejsze wartości i mój crack wydaje się działać.
Nitrodon


1

Oktawa, wynik: ???

Jest prawie pewne, że żadna inna liczba nie będzie miała dokładnie tych samych 20 liczb losowych na końcu listy 1e8liczb.

function val = cnr(num)
rand("seed", num);
randomints = randi(flintmax-1,1e4,1e4);
val = isequal(randomints(end+(-20:0))(:), ...
 [7918995738984448
  7706857103687680
  1846690847916032
  6527244872712192
  5318889109979136
  7877935851634688
  3899749505695744
  4256732691824640
  2803292404973568
  1410614496854016
  2592550976225280
  4221573015797760
  5165372483305472
  7184095696125952
  6588467484033024
  6670217354674176
  4537379545153536
  3669953454538752
  5365211942879232
  1471052739772416
  5355814017564672](:));
end

Dane wyjściowe 1dla tajnego numeru, w 0przeciwnym razie.

Uruchomiłem to w Octave 4.2.0.


„Sen i inne spowolnienia można usunąć podczas brutalnego wymuszania”.

Powodzenia z tym :)


wydaje się, że nawet nie działa na tio
Okx

1
@Okx Przekroczono limit czasu w TIO, ale działa w wersji komputerowej.
Rɪᴋᴇʀ

1
Dlaczego głosowanie negatywne?
Wheat Wizard

3
@WheatWizard prawdopodobnie dlatego, że teoretycznie możliwe jest, że ma wiele liczb. Poza tym to trochę nudne. Chciałbym zobaczyć więcej matematycznych rozwiązań, RNG jest trochę nudne.
Rɪᴋᴇʀ

1
@Riker But because you're guessing at a seed to the RNG, he's using the RNG itself as his function which is actually deterministic. But yeah, considering it's relying on the difficultly of inverting what you hope is a one-way function, one might as well, just encrypt a string "true" with a random number and then the challenge almost amounts to breaking whatever encryption scheme was chosen to discover the private key.
Shufflepants

1

Ly, score 239, cracked

(1014750)1sp[l1+sp1-]28^RrnI24^=u;

Try it online!

I'm banking on nobody knowing Ly here, although I know how easily that could change... sweats

Explanation:

(1014750)1sp[l1+sp1-]              # meaningless code that counts up to 1014750 and discards the result
                     28^Rr         # range from 255 to 0
                          nI       # get the index from the range equal to the input
                            24^=   # check if it's 16
                                u; # print the result


1

Brain-Flak, score 1574 (cracked)

<>(((((((((((((((((((([([(((()()()){}){}){}])]){})))){}{}{}{}()){}){})){}{})){}{})){}((((((((()()){}){}){}){}[()]){}){}){}){}())){})){}){}{}{}){})(((((((((((((((((((()()){}){}()){}){}){}()){}){}()){}){})){}{}())){}{})){}{}){}){}){})(((((((((((((((()()){}()){}()){}){}){}()){}){}){}()){}){}){}()){}()){}()){})<>{({}[()])<>({}({})<({}({})<({}({})<({}({}))>)>)>)<>}({}<>(){[()](<{}>)}<>)

Try it online!



1

dc

#!/bin/dc
[[yes]P] sy [[no]P] sn [ly sp] sq [ln sp] sr [lp ss] st [ln ss] su
?  sa
119560046169484541198922343958138057249252666454948744274520813687698868044973597713429463135512055466078366508770799591124879298416357795802621986464667571278338128259356758545026669650713817588084391470449324204624551285340087267973444310321615325862852648829135607602791474437312218673178016667591286378293
la %
d 0 r 0
=q !=r
10 154 ^ 10 153 ^ +
d la r la
<t !<u
1 la 1 la
>s !>n

Try it online!


Note: This submission has been modified since it was submitted. The original submission (below) was invalid and cracked by Sleafar in the comments below. (An input of 1 gives rise to the output yes, but there is one other number that gives the same result.)

#!/bin/dc
[[yes]P] sy [[no]P] sn [ly sp] sq [ln sp] sr
?  sa
119560046169484541198922343958138057249252666454948744274520813687698868044973597713429463135512055466078366508770799591124879298416357795802621986464667571278338128259356758545026669650713817588084391470449324204624551285340087267973444310321615325862852648829135607602791474437312218673178016667591286378293
la %
d 0 r 0
=q !=r
10 154 ^ 10 153 ^ +
d la r la
<p !<n

Try it online!


The online interpreter returns "yes" for the input "1". Does this count as cracked now?
Sleafar

@Sleafar Sigh...yes, that was a stupid mistake on my part.
John Gowers

However, that means that this challenge is now invalid, since there are two inputs that make it print yes, so I'm not sure if you're allowed to claim it. I'll add a corrected version to this post, but leave the original up in case you are.
John Gowers

1

Ruby, safe, score:

63105425988599693916

#!ruby -lnaF|
if /^#{eval [$F,0]*"**#{~/$/}+"}$/ && $_.to_i.to_s(36)=~/joe|tim/
  p true
else
  p false
end

Try it online!

Explanation:

The first conditional checks the input number for narcissism. The thread I originally wrote for was coincidentally bumped around the same time I posted this, but I guess nobody noticed. The second converts the number to base 36, which uses letters as digits, and checks if the string contains "joe" or "tim". It can be proven (through exhaustion) that there is only one narcissistic number named either Joe or Tim (Joe), because the narcissistic numbers are finite. Proof that they're finite: the result of taking an n-digit number, raising each digit to the nth power, and summing is bounded above by n*9^n, while the value of an n-digit number is bounded below by n^10. The ratio between these terms is n*(9/10)^n, which eventually decreases monotonically as n increases. Once it falls below 1, there can be no n-digit narcissistic numbers.


1

PHP, safe, score:

60256

<?php

$a = $argv[1];

$b ='0123456789abcdefghijklmnopqrstuvwxyz';

$c = strlen($b);

$d = '';
$e = $a;
while ($e) {
    $d .= $b[$e % $c];
    $e = floor($e / $c);
}

echo ((function_exists($d) && $d($a) === '731f62943ddf6733f493a812fc7aeb7ec07d97b6') ? 1 : 0) . "\n";

Outputs 1 if correct, 0 otherwise.

Edit: I don't think anyone even tried to crack this because:

it would be easy to brute force.

Explanation:

I take the input and convert it to "base 36", but I don't reverse the remainders to produce the final number. The number 60256 is "1ahs" in base 36. Unreversed, that is "sha1", which is a function in PHP. The final check is that sha1(60256) equals the hash.



0

Python 3, score: ???

Hopefully this, if anything, demonstrates how broken of a problem this really is:

from hashlib import sha3_512

hash_code = 'c9738b1424731502e1910f8289c98ccaae93d2a58a74dc3658151f43af350bec' \
            'feff7a2654dcdd0d1bd6952ca39ae01f46b4260d22c1a1b0e38214fbbf5eb1fb'


def inc_string(string):
    length = len(string)
    if length == 0 or all(char == '\xFF' for char in string):
        return '\x00' * (length + 1)
    new_string = ''
    carry = True
    for i, char in enumerate(string[::-1]):
        if char == '\xFF' and carry:
            new_string = '\x00' + new_string
            carry = True
        elif carry:
            new_string = chr(ord(char) + 1) + new_string
            carry = False
        if not carry:
            new_string = string[0:~i] + new_string
            break
    return new_string


def strings():
    string = ''
    while True:
        yield string
        string = inc_string(string)


def hash_string(string):
    return sha3_512(string.encode('utf-8')).hexdigest()


def main():
    for string in strings():
        if hash_string(string) == hash_code:
            exec(string)
            break


main()

Essentially, what this code does is lazily generate every string possible until one of the strings has a hash that exactly matches hash_code above. The unhashed code takes the basic form of:

num = int(input('Enter a number:\n'))
if num == <insert number here>:
    print(1)
else:
    print(0)

Except <insert number here> is replaced with a number and there are comments in the code for the purpose of making the code nearly unguessable.

I've taken every precaution to ensure that I do not benefit from this post. For starters, it's community wiki so I will not gain rep for it. Also, my score is rather large, so hopefully a much more creative answer will come along and win.

Hope you all aren't too furious at my response, I just wanted to show off why cops and robbers posts usually ban hashing algorithms.


Input is taken from stdin. Output is a 1 (for a correctly guessed number) or a 0 (for an incorrectly guessed one).
sonar235

I don't know why you have made this a community wiki. This is your answer that looks like it took considerable work to make. I certainly wouldn't call this answer evidence of the question being broken either. This is a clever answer, that could likely score well, (I can't even prove this doesn't work for 1). The point of a question is always to attract answers that approach the question in clever interesting ways (and also to have fun but I can't vouch for your entertainment), and as far as I'm concerned this does that.
Wheat Wizard

3
In fact this answer is invalid. It will almost certainly (with astronomical probability of no string of length 512 bits matching the hash) exec() something else that probably isn't even valid python code before reaching the intended code.
Joshua

1
@sonar235: Your fragment template has more than 512 bits in it.
Joshua

1
To expand on Joshua's answer: your bit of code is 102 characters long. In particular, your program will iterate over every 100-character string before it gets to your code. Since your code iterates over characters in the range 0x00-0xFF, that is 256 ^ 100 or 2 ^ 800 strings. Meanwhile, there are only 2 ^ 512 possible 512-bit hashes. That means that the strings you iterate over outnumber the possible hashes at least 2 ^ 288 to one - a number 10,000 times greater than the number of atoms in the universe. The probability of that particular hash going unused is incredibly small.
John Gowers

0

Python 3, 49 bytes, Cracked by sonar235

x = input()
print(int(x)*2 == int(x[-1]+x[0:-1]))

Try it online!


Zero is not a postive integer fyi. I don't know if that was the intended solution but it does work.
Wheat Wizard

0 is not the intended solution.
E.D.

8
Uhh, your TIO page is showing the solution...
LyricLy

2
Also "write a program or function that outputs one value when provided the number as input and another value for all other positive integer inputs"
Jonathan Allan


0

Java, score: 3141592 (Cracked)

\u0070\u0075\u0062\u006c\u0069\u0063\u0020\u0063\u006c\u0061\u0073\u0073\u0020\u004d\u0061\u006e\u0067\u006f\u0020\u007b
\u0073\u0074\u0061\u0074\u0069\u0063\u0020\u0076\u006f\u0069\u0064\u0020\u0063\u006f\u006e\u0076\u0065\u0072\u0074\u0028\u0053\u0074\u0072\u0069\u006e\u0067\u0020\u0073\u0029\u007b\u0066\u006f\u0072\u0028\u0063\u0068\u0061\u0072\u0020\u0063\u0020\u003a\u0020\u0073\u002e\u0074\u006f\u0043\u0068\u0061\u0072\u0041\u0072\u0072\u0061\u0079\u0028\u0029\u0029\u007b\u0020\u0053\u0079\u0073\u0074\u0065\u006d\u002e\u006f\u0075\u0074\u002e\u0070\u0072\u0069\u006e\u0074\u0028\u0022\u005c\u005c\u0075\u0030\u0030\u0022\u002b\u0049\u006e\u0074\u0065\u0067\u0065\u0072\u002e\u0074\u006f\u0048\u0065\u0078\u0053\u0074\u0072\u0069\u006e\u0067\u0028\u0063\u0029\u0029\u003b\u007d\u007d
\u0070\u0075\u0062\u006c\u0069\u0063\u0020\u0073\u0074\u0061\u0074\u0069\u0063\u0020\u0076\u006f\u0069\u0064\u0020\u006d\u0061\u0069\u006e\u0028\u0053\u0074\u0072\u0069\u006e\u0067\u005b\u005d\u0020\u0061\u0072\u0067\u0073\u0029\u0020\u007b\u0069\u006e\u0074\u0020\u0078\u0020\u0020\u003d\u0020\u0049\u006e\u0074\u0065\u0067\u0065\u0072\u002e\u0070\u0061\u0072\u0073\u0065\u0049\u006e\u0074\u0028\u0061\u0072\u0067\u0073\u005b\u0030\u005d\u0029\u003b
\u0064\u006f\u0075\u0062\u006c\u0065\u0020\u0061\u003d\u0020\u0078\u002f\u0038\u002e\u002d\u0033\u0039\u0032\u0036\u0039\u0039\u003b\u0064\u006f\u0075\u0062\u006c\u0065\u0020\u0062\u0020\u003d\u0020\u004d\u0061\u0074\u0068\u002e\u006c\u006f\u0067\u0031\u0030\u0028\u0028\u0069\u006e\u0074\u0029\u0020\u0028\u0078\u002f\u004d\u0061\u0074\u0068\u002e\u0050\u0049\u002b\u0031\u0029\u0029\u002d\u0036\u003b
\u0053\u0079\u0073\u0074\u0065\u006d\u002e\u006f\u0075\u0074\u002e\u0070\u0072\u0069\u006e\u0074\u006c\u006e\u0028\u0028\u0061\u002f\u0062\u003d\u003d\u0061\u002f\u0062\u003f\u0022\u0046\u0061\u0069\u006c\u0022\u003a\u0022\u004f\u004b\u0022\u0020\u0029\u0029\u003b
\u007d\u007d

1
I don't think the obfuscation is going to do anything except add an annoying first step.
Engineer Toast


2
@EngineerToast no, not really, it was purely for scaring off lazy people.
user902383

0

Python 3, score 1 (safe)

Not a very interesting solution, but better a safe cop than a dead cop.

import hashlib

def sha(x):
    return hashlib.sha256(x).digest()

x = input().encode()
original = x

for _ in range(1000000000):
    x = sha(x)

print(int(x==b'3\xdf\x11\x81\xd4\xfd\x1b\xab19\xbd\xc0\xc3|Y~}\xea83\xaf\xa5\xb4]\xae\x15wN*!\xbe\xd5' and int(original.decode())<1000))

Outputs 1 for the target number, 0 otherwise. Input is taken from stdin. The last part (and int(original.decode())<1000) exists only to ensure only one answer, otherwise there would obviously be infinitely many answers.


1
Can you add a TIO link, please?
Shaggy

1
For future robbers: The integer doesn't seem to be in smaller than 100000000.
Mr. Xcoder

1
@Shaggy It will timeout on TIO, it took about half an hour on my computer to run the billion iterations of SHA256.
L3viathan

2
Any robbers fancy forming a team to solve this one? We just need to split the numbers less than 1000 up among us so we have time to compute the iterated-SHA digests before the deadline.
John Gowers

2
Unless you can prove that 1 is the only solution, this answer is invalid. The burden of proof should be on the person claiming to have a valid answer.
Dennis

0

C (gcc), score ???

#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <wmmintrin.h>

#include <openssl/bio.h>
#include <openssl/pem.h>
#include <openssl/rsa.h>

union State
{
    uint8_t u8[128];
    __m128i i128[8];
} state;

void encrypt()
{
    BIO *key = BIO_new_mem_buf
    (
        "-----BEGIN PUBLIC KEY-----\n"
        "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5CBa50oQ3gOPHNt0TLxp96t+6\n"
        "i2KvOp0CedPHdJ+T/wr/ATo7Rz+K/hzC7kQvsrEcr0Zkx7Ll/0tpFxekEk/9PaDt\n"
        "wyFyEntgz8SGUl4aPJkPCgHuJhFMyUflDTywpke3KkSv3V/VjRosn+yRu5mbA/9G\n"
        "mnOvSVBFn3P2rAOTbwIDAQAB\n"
        "-----END PUBLIC KEY-----\n",
        -1
    );

    RSA *rsa = PEM_read_bio_RSA_PUBKEY(key, &rsa, NULL, NULL);

    uint8_t ciphertext[128];

    RSA_public_encrypt(128, state.u8, ciphertext, rsa, RSA_NO_PADDING);
    memcpy(state.u8, ciphertext, 128);
}

void verify()
{
    if (memcmp
    (
        "\x93\xfd\x38\xf6\x22\xf8\xaa\x2f\x7c\x74\xef\x38\x01\xec\x44\x19"
        "\x76\x56\x27\x7e\xc6\x6d\xe9\xaf\x60\x2e\x68\xc7\x62\xfd\x2a\xd8"
        "\xb7\x3c\xc9\x78\xc9\x0f\x6b\xf0\x7c\xf8\xe5\x3c\x4f\x1c\x39\x6e"
        "\xc8\xa8\x99\x91\x3b\x73\x7a\xb8\x56\xf9\x28\xe7\x2e\xb2\x82\x5c"
        "\xb8\x36\x24\xfb\x26\x96\x32\x91\xe5\xee\x9f\x98\xdf\x44\x49\x7b"
        "\xbc\x6c\xdf\xe9\xe7\xdd\x26\x37\xe5\x3c\xe7\xc0\x2d\x60\xa5\x2e"
        "\xb8\x1f\x7e\xfd\x4f\xe0\x83\x38\x20\x48\x47\x49\x78\x18\xfb\xd8"
        "\x62\xaf\x0a\xfb\x5f\x64\xd1\x3a\xfd\xaf\x4b\xaf\x93\x23\xf4\x36",
        state.u8,
        128
    ))
        exit(0);
}

static inline void quarterround(int offset)
{
    int dest = (offset + 1) % 8, src = offset % 8;

    state.i128[dest] = _mm_aesenc_si128(state.i128[src], state.i128[dest]);
}

int main(int argc, char *argv[])
{
    if (argc != 2)
        exit(0);

    uint64_t input = strtoull(argv[1], NULL, 0);

    state.i128[0] = _mm_set_epi32(0, 0, input >> 32, input);

    for (uint64_t round = 0; round < 0x1p45; round += 2)
    {
        quarterround(0);
        quarterround(2);
        quarterround(4);
        quarterround(6);

        quarterround(7);
        quarterround(1);
        quarterround(3);
        quarterround(5);
    }

    encrypt();
    verify();
    puts("something");
}

Since cryptographic solutions are encouraged, here. Exactly one positive integer will print something, all others will print nothing. This takes a long time, so it cannot be tested online.


0

Java, 164517378918, safe

import java.math.*;import java.util.*;
public class T{
    static boolean f(BigInteger i){if(i.compareTo(BigInteger.valueOf(2).pow(38))>0)return false;if(i.longValue()==0)return false;if(i.compareTo(BigInteger.ONE)<0)return false;int j=i.multiply(i).hashCode();for(int k=3^3;k<2000;k+=Math.abs(j%300+1)){j+=1+(short)k+i.hashCode()%(k+1);}return i.remainder(BigInteger.valueOf(5*(125+(i.hashCode()<<11))-7)).equals(BigInteger.valueOf(0));}
    @SuppressWarnings("resource")
    public static void main(String[]a){long l=new Scanner(System.in).nextLong();boolean b=false;for(long j=1;j<10;j++){b|=f(BigInteger.valueOf(l-j));}System.out.println(f(BigInteger.valueOf(l))&&b);}
}

0

TI-BASIC, score: 196164532 non-competing

Returns 1 for secret number, 0 otherwise.

Ans→rand
rand=1

Refer to the note on this page on the rand command for more info.


8
Is this guaranteed to have exactly one matching input number?
Rɪᴋᴇʀ

@Riker: I think the TI calculator uses some kind of floating point internally; if RAND uses the same floating point as the rest of it, I'm pretty sure there's only 1 solution.
Joshua

@Joshua I believe it uses L'Ecuyer's Algorithm.
kamoroso94

@Joshua "pretty sure" isn't enough. Unless you can prove that only 1 solution exists, this isn't a valid answer.
Rɪᴋᴇʀ

1
@Dennis: Probe for 196164532*2; if that's not a solution than there is no other solution.
Joshua

0

Python 3, score:?

def check(x):
    if x < 0 or x >= 5754820589765829850934909 or pow(x, 18446744073709551616, 5754820589765829850934909) != 2093489574700401569580277 or x % 4 != 1:
        return "No way ;-("
    return "Cool B-)"

Try it online!

Simple, but may take some time to brute-force ;-) Looking forward to a fast crack ;-)

Footnote: the first two and the last conditions make the answer unique.

BTW how the score is calculated?

Hint 1

You may expect there will be 264 answers within 0 <= x < [the 25-digit prime], but actually there are only 4, and the last condition eliminates the other 3. If you can crack this, then you will also know the other 3 solutions.



0

Aceto, safe

  P'*o*7-9JxriM'lo7*9Yxx.P',xe*ikCKxlI.D+∑\a€'#o*84/si5s:i»I9Ji8:i+∑€isi.s1+.i2\H/iQxsUxsxxsxiss*i1dJi/3d2*Ji-d*id*IILCh98*2JixM'e9hxBNRb!p

Outputs TrueFalse if correct, FalseFalse otherwise

The number was

15752963

Try it online!


-2

C#, Mono, Linux, Alpha, score 1 (safe)

class Program
{
public static void Main()
{
//Excluding out-of-range inputs at ppperry's request; does not change solution
//original code:
//var bytes = System.BitConverter.GetBytes((long)int.Parse(System.Console.ReadLine()));
int i;
if (!int.TryParse(System.Console.ReadLine(), out i || i <= 0 || i > 1000000) { System.Console.WriteLine(0); Environment.Exit(0); }
var bytes = System.BitConverter.GetBytes((long)i);
using (var x = System.Security.Cryptography.HashAlgorithm.Create("MD5"))
{
    for (int i = 0; i < 1000000; ++i)
            for (int j = 0; j < 86400; ++j)
                    bytes = x.ComputeHash(bytes);
}
if (bytes[0] == 91 && bytes[1] == 163 && bytes[2] == 41 && bytes[3] == 169)
    System.Console.WriteLine(1);
else
    System.Console.WriteLine(0);
}
}

Careful. I mean it. There's plenty of alpha simulators out there. Use one with a jitter or this won't finish.

This depends on the fact that Alpha is big-endian, causing System.BitConverter to do the wrong thing if somebody tries this on x86 or x64. I wrote this answer to demonstrate the badness of the challenge more than anything else.


1
This can't have exactly one solution; there are an infinite number of integers, and the MD5 function has a finite number of possible outputs, so there must be a collision
pppery

@ppperry: There are only 2 billion and change positive ints though.
Joshua

If you think about it that way, this errors on inputs greater than 2^31, and thus is invalid.
pppery

@ppperry: There now it won't error on that.
Joshua

2
Unless you can prove that 1 is the only solution, this answer is invalid. The burden of proof should be on the person claiming to have a valid answer.
Dennis
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.