PPCG Jeopardy: Ladri


18

Quanto conosci il sito? Scopriamolo.

Questa è una sfida per . Discussione di Cop .

Come ladro, devi:

  1. Trova una sfida non eliminata, non chiusa che corrisponda alla presentazione di un poliziotto. La sfida non può avere i seguenti tag: , , , , , , , . La sfida deve avere restrizioni sull'output valido.
  2. Pubblica la sfida qui e collega al poliziotto che stai violando
  3. Aggiungi un commento "Cracked" al post della polizia, con un link a questa risposta

Riceverai 1 punto, più 1 punto per ogni periodo di 24 ore in cui l'invio è rimasto senza crack (max 7). Tiebreaker è il numero totale di sottomissioni incrinate.

Appunti:

  • Se una sfida richiede un output di X, e tu output XYo YXdove Yc'è qualcosa oltre lo spazio bianco, l'invio non è valido per quella sfida.
  • Non è consentita una sfida più recente del 17-11-2016.
  • Mi riservo il diritto di vietare alcune sfide se sono ampiamente applicabili (potrebbero essere applicate alla maggior parte di tutte le comunicazioni).
  • Assicurati di aggiungere una o due frasi come spiegazione (aiuta anche la tua richiesta di essere convertita in un commento)
  • Grazie a Daniel per l'idea iniziale!


Risposte:


5

Calcola la probabilità di ottenere la metà delle teste dei lanci di monete.

Voce poliziotti (pubblicato da Conor O'Brien): /codegolf//a/100521/8927

Domanda originale: calcola la probabilità di ottenere la metà delle teste dei lanci di monete.


Alla soluzione pubblicata sono state applicate un paio di tecniche di offuscamento, seguite da più strati della stessa tecnica di offuscamento. Una volta passati i primi trucchi, è diventato un compito semplice (se noioso!) Estrarre la funzione effettiva:

nCr(a,b) = a! / ((a-b)! * b!)
result = nCr(x, x/2) / 2^x

Ci sono voluti un po 'per capire cosa stavo guardando (per un po' sospettavo che qualcosa avesse a che fare con l'entropia), ma una volta risolto, sono riuscito a trovare facilmente la domanda cercando "probabilità di lancio della moneta".


Poiché Conor O'Brien ha sfidato una spiegazione approfondita del suo codice, ecco una carrellata dei bit più interessanti:

Si inizia offuscando alcune chiamate di funzione integrate. Ciò si ottiene con la base-32 codificando i nomi delle funzioni, quindi assegnandoli a nuovi nomi di spazi dei nomi globali di un singolo carattere. Viene effettivamente utilizzato solo "atob"; gli altri 2 sono solo aringhe rosse (eval prende la stessa scorciatoia di atob, solo per essere scavalcato, e btoa semplicemente non viene usato).

_=this;
[
    490837, // eval -> U="undefined"       -> u(x) = eval(x) (but overwritten below), y = eval
    358155, // atob -> U="function (M,..." -> u(x) = atob(x)
    390922  // btoa -> U="function (M,..." -> n(x) = btoa(x), U[10] = 'M'
].map(
    y=function(M,i){
        return _[(U=y+"")[i]] = _[M.toString(2<<2<<2)]
    }
);

Successivamente ci sono un paio di banali confusioni di stringhe per nascondere il codice. Questi sono facilmente invertiti:

u(["","GQ9ZygiYTwyPzE6YSpk","C0tYSki","SkoYSkvZChhLWIpL2QoYikg"].join("K"))
// becomes
'(d=g("a<2?1:a*d(--a)"))(a)/d(a-b)/d(b) '

u("KScpKWIsYShFLCliLGEoQyhEJyhnLGM9RSxiPUQsYT1D").split("").reverse().join("")
// becomes
"C=a,D=b,E=c,g('D(C(a,b),E(a,b))')"

La maggior parte dell'offuscamento è l'uso della gfunzione, che definisce semplicemente nuove funzioni. Questo viene applicato in modo ricorsivo, con funzioni che restituiscono nuove funzioni o che richiedono funzioni come parametri, ma alla fine si semplifica verso il basso. La funzione più interessante da scoprire è:

function e(a,b){ // a! / ((a-b)! * b!) = nCr
    d=function(a){return a<2?1:a*d(--a)} // Factorial
    return d(a)/d(a-b)/d(b)
}

C'è anche un trucco finale con questa linea:

U[10]+[![]+[]][+[]][++[+[]][+[]]]+[!+[]+[]][+[]][+[]]+17..toString(2<<2<<2)
// U = "function (M,i"..., so U[10] = 'M'. The rest just evaluates to "ath", so this just reads "Math"

Sebbene dal momento che il prossimo bit sia ".pow (T, a)", è sempre stato abbastanza probabile che dovesse essere "Math"!

I passi che ho intrapreso lungo il percorso delle funzioni in espansione sono stati:

// Minimal substitutions:
function g(s){return Function("a","b","c","return "+s)};
function e(a,b,c){return (d=g("a<2?1:a*d(--a)"))(a)/d(a-b)/d(b)}
function h(a,b,c){return A=a,B=b,g('A(a,B(a))')}
function j(a,b,c){return a/b}
function L(a,b,c){return Z=a,Y=b,g('Z(a,Y)')}
k=L(j,T=2);
function F(a,b,c){return C=a,D=b,E=c,g('D(C(a,b),E(a,b))')}
RESULT=F(
    h(e,k),
    j,
    function(a,b,c){return _['Math'].pow(T,a)}
);


// First pass
function e(a,b){
    d=function(a){return a<2?1:a*d(--a)}
    return d(a)/d(a-b)/d(b)
}
function h(a,b){
    A=a
    B=b
    return function(a){
        return A(a,B(a))
    }
}
function j(a,b){ // ratio function
    return a/b
}
function L(a,b){ // binding function (binds param b)
    Z=a
    Y=b
    return function(a){
        return Z(a,Y)
    }
}
T=2; // Number of states the coin can take
k=L(j,T); // function to calculate number of heads required for fairness
function F(a,b,c){
    C=a
    D=b
    E=c
    return function(a,b,c){return D(C(a,b),E(a,b))}
}
RESULT=F(
    h(e,k),
    j,
    function(a){return Math.pow(T,a)}
);


// Second pass
function e(a,b){...}
function k(a){
    return a/2
}
function F(a,b,c){
    C=a
    D=b
    E=c
    return function(a,b,c){return D(C(a,b),E(a,b))}
}
RESULT=F(
    function(a){
        return e(a,k(a))
    },
    function(a,b){
        return a/b
    },
    function(a){return Math.pow(2,a)}
);


// Third pass
function e(a,b) {...}
C=function(a){ // nCr(x,x/2) function
    return e(a,a/2)
}
D=function(a,b){ // ratio function
    return a/b
}
E=function(a){return Math.pow(2,a)} // 2^x function
RESULT=function(a,b,c){
    return D(C(a,b),E(a,b))
}

La struttura della funzione di annidamento si basa sull'utilità; la funzione "D" / "j" più esterna calcola un rapporto, quindi le funzioni "C" / "h" ed "E" (in linea) interne calcolano i conteggi di lancio della moneta necessari. La funzione "F", rimossa nel terzo passaggio, è responsabile del collegamento di questi in un insieme utilizzabile. Allo stesso modo la funzione "k" è responsabile della scelta del numero di teste che devono essere osservate; un'attività che delega alla funzione di rapporto "D" / "j" tramite la funzione di associazione dei parametri "L"; qui utilizzato il parametro correzione ba T(qui sempre 2, essendo il numero di stati della moneta può prendere).

Alla fine, otteniamo:

function e(a,b){ // a! / ((a-b)! * b!)
    d=function(a){return a<2?1:a*d(--a)} // Factorial
    return d(a)/d(a-b)/d(b)
}
RESULT=function(a){
    return e(a, a/2) / Math.pow(2,a)
}

Buon lavoro! Questo è leggermente errato - eval è impostato su f. Ma il resto è corretto! Inoltre, un po 'di elaborazione su come RESULTviene derivata potrebbe essere degna;)
Conor O'Brien,

@ ConorO'Brien certo; Ho aggiunto i miei appunti e una spiegazione dell'utilità di ciascuna funzione prima di comprimerli tutti.
Dave,

@ ConorO'Brien grazie per la generosità!
Dave,

Sempre un piacere :)
Conor O'Brien il

3

MATL, Luis Mendo , conta il numero di decimali pesanti tra 2 numeri

&:"@FYAYm7>vs

Ho capito cosa fa giocando con gli input, ma non sono riuscito a capire quale sfida avresti dovuto calcolare il numero di numeri interi in un intervallo la cui somma era maggiore di 7 volte il numero di cifre. Dopo aver letto i documenti MATL, ho messo insieme una spiegazione approssimativa di ciò che fa:

&    % Change default input format
:    % Implictly input two integers, create inclusive range
"    % For each item in this range:
  @    % Push the item
  F    % Push false
  YA   % Convert to base N digits; N is false, so this produces base-10 digits
  Ym   % Calculate arithmetic mean
  7>   % Push 1 if this is greater than 7, 0 otherwise
  v    % Concatenate result into array with previous result
  s    % Sum
     % Implicitly end loop and output

Sono quindi passato dalla ricerca di "somma cifre superiore a 7 volte la lunghezza" a "cifra media maggiore di 7", che ha prodotto la sfida che stavo cercando.





2

Perl, Gabriel Benamy , conveniente pedina palindromo

Il codice era ovviamente una specie di palindromo. Una volta scelta la y- - -struttura e notato ciò che veniva traslitterato, sapevo quale fosse la sfida.


Hai battuto il mio di qualche secondo ... ma ci è voluto tanto tempo per scaricare il perl.
Laikoni,

@Laikoni Onestamente, dopo che una coppia ha provato Ideone, ho rinunciato all'esecuzione del codice e ho provato a leggerlo. ;)
DLosc,





1

Ruby, histocrat , Implementa una macchina della verità

Il codice definisce un sistema di funzioni iterate f(n) = n*(3*n-1)/2che funziona fino a quando la nmod 7 è 0. L'inserimento di 0quindi termina immediatamente (dopo la stampa 0una volta). Input di 11, portando ad un ciclo infinito di stampa 1. Gli altri input terminano dopo 1-3 passaggi se l'iniziale nè congruente a 0, 2, 3, 5 o 6 mod 7, oppure cresce per sempre se è congruente a 1 o 4 mod 7. Ma questo è irrilevante.




0

Python 3, /codegolf//a/100381/31343

Usa la formula di xkcd per approssimare la popolazione mondiale

Ho appena cercato sfide che hanno coinvolto anni bisestili (a causa della divisibilità decodificata da quattro pedine) e che non ha ricevuto input.


Sì! Sapevo che sarebbe stato ovvio a causa del %4e il strftime, ma buon lavoro per individuare le parti importanti del codice (la maggior parte era incomprensibile)
FlipTack

Ah dannazione, mi stavo avvicinando anche io. Avevo capito che era qualcosa a che fare con le date, stavo ottenendo il 2005 e il 2016/2017. Bel lavoro.
Yodle,

Sono sorpreso che nessuno di voi abbia semplicemente eseguito il codice, che genera l'output 7.3 328, e lo abbia cercato. La sfida arriva subito.
FlipTack



Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.