Inversioni nascoste (Discussione della polizia)


35

Questo è un enigma di qui puoi trovare il filo dei ladri .

Il tuo compito sarà di scrivere due programmi (o funzioni) in modo tale che siano anagrammi l' uno dell'altro e uno esegua l' inverso sinistro dell'altro. Questi programmi possono accettare e produrre quanti numeri interi o numeri complessi desideri. Se scegli di prendere i numeri come punti personaggio o qualsiasi altro mezzo ragionevole, devi indicare che lo stai facendo nella tua risposta. Se scegli di limitare il dominio della tua funzione, devi anche indicare il dominio limitato nella tua risposta.

Presenterai quindi il primo programma sotto forma di una risposta con l'inverso sinistro nascosto per essere trovato dai ladri.

Il programma mostrato deve implementare una funzione iniettiva (altrimenti sarebbe impossibile che esista una risposta nascosta).

Se la tua risposta non è stata decifrata in una settimana, puoi rivelare la risposta nascosta e contrassegnarla come sicura . Le risposte sicure non possono essere decifrate dai ladri e rimarranno indisturbate indefinitamente.

L'obiettivo sarà quello di creare la risposta non crackata più breve in byte.

Esempio

È possibile mostrare il seguente programma Python che ne aggiunge uno all'input

lambda x:~-x

Una soluzione potrebbe essere:

lambda x:-~x

Questo sottrae uno dall'input


Possiamo avere numeri interi immaginari / complessi?
Stewie Griffin,

@stewie se lo indichi, puoi
Wheat Wizard

1
L'anagramma è definito come permutare i caratteri o permutare i byte (in lingue che non usano un set di caratteri a byte singolo)?

1. " Presenterai quindi uno dei programmi " sembra suggerire che possiamo scegliere quale presentare, ma la frase continua " con l'inverso sinistro nascosto ", il che implica che dobbiamo presentarne uno specifico. Cos'è questo? 2. La domanda specifica nello specifico " programma " e non sembra consentire le funzioni, ma l'esempio è una funzione piuttosto che un programma. Cos'è questo?
Peter Taylor,

È importante la capitalizzazione?
Kritixi Lithos,

Risposte:


12

Python 3, 80 byte ( Cracked )

bhmq = int(input())
print(bhmq ** 2)
(1 or [(sqrt),(specification+of*integerr)])

Dominio: numeri interi positivi. La funzione è solo la quadratura di un numero. Input su stdin, output su stdout, nonché nella funzione inversa. Nota che Python ignora la terza riga qui, perché è sintatticamente valida e 1 è già un valore veritiero, quindi Python non guarda nemmeno se la parte giusta di 'o' è ben definita.

I ladri dovrebbero scrivere una funzione sqrt che funzionerà correttamente su tutti i quadrati diversi da zero, stampando il valore intero così com'è, senza virgola mobile (quindi sull'input '4' l'output dovrebbe essere '2' o '2 \ n', non '2.0' o '2.0 \ n').


1
Mi piace questo. È ingannevolmente difficile da decifrare
Wheat Wizard il

3
Benvenuto in ppcg! Bel primo post!
Rɪᴋᴇʀ

1
Non importa su quella crepa, ho incasinato. La domanda è ancora valida.
orlp

1
Direi "no", se mi è davvero permesso mettere questa restrizione secondo le regole della sfida.
Wolfram,


11

Python 3, 46 byte, incrinato

lambda x:x*(1999888577766665//844333333222200)

Raddoppia l'ingresso.


3
Come funziona 'Python' nei poliziotti e ladri? Possiamo scegliere una versione arbitraria con cui attaccare la tua risposta?
orlp,

Oh, questo è Python 3 in particolare, scusa. Anche la /divisione float.
Lynn,

3
Bene, hai appena dimostrato che questa sfida non vale il mio tempo. Andare avanti.
mbomb007,


11

7 , 9 byte, Cracked

Questo programma è pieno di caratteri non stampabili, quindi ecco un hexdump:

00000000: 2573 dc01 7e13 dcb6 1f                   %s..~....

Nota: utilizza una routine di input numerico che non è in grado di inserire numeri negativi, quindi questo invio è limitato solo a numeri interi non negativi.

Un problema con le sfide di è che non scrivi spiegazioni sul codice (per rendere più difficile decifrare). D'altra parte, ciò significa che qui non devo andare ai guai.

Ho scelto 7 come lingua perché, specialmente nella sua notazione compressa, è piuttosto difficile da leggere, e non vedo perché dovrei essere solo io a dover affrontare il problema di spostare blocchi di programmi a 8 bit scritti in una codifica a 3 bit. In bocca al lupo!

Spiegazione

Ora che il programma è stato decifrato (dalla forza bruta, sfortunatamente; questo è sempre un pericolo in queste brevi soluzioni), posso anche spiegare a cosa stavo arrivando. Questo era in realtà abbastanza risolvibile leggendo il programma; Avrei potuto renderlo molto più difficile, ma mi è sembrata una cattiva idea quando esistono crepe a forza bruta.

Inizieremo rappresentando il programma in una codifica più naturale. Come al solito, i numeri in grassetto indicano i comandi che vengono eseguiti immediatamente (non tutti sono rappresentabili in un programma, 6e 7sono, ma 2per 5non), i numeri rappresentano unbolded loro equivalenti sfuggite ( 0a 5, che sono tutti rappresentabili nel programma originale; nota che 0è un escape 6ed 1è un escape 7):

112 7 1 7 34002 77 023 67 13303

L'insieme di comandi disponibili in una sorgente di programma 7 significa che è fondamentalmente solo un valore letterale che rappresenta lo stack originale (non c'è nient'altro che puoi fare con i soli comandi di escape 6e 7). Quindi la prima cosa che farà un programma è spingere un sacco di roba nello stack. Ecco come lo stack si occupa dell'esecuzione del programma ( |separa gli elementi dello stack, come al solito in 7):

772 | 7 | 34662 | 023 | 73.363

L'elemento stack finale viene quindi copiato per diventare il codice da eseguire (rimanendo nello stack). Come succede, questa è l'unica parte del programma che è il codice; tutto il resto sono solo dati. Ecco cosa si traduce in:

73363 
7       Spingi un elemento vuoto sullo stack 3 Emetti l'elemento stack
       superiore, scarta l'elemento sottostante
 73      Effetto combinato di questi: elimina l'elemento stack superiore
   3     Emetti l'elemento stack superiore, elimina l'elemento sottostante
    6    Esci dall'elemento stack superiore, quindi aggiungilo all'elemento sottostante
     3   Emetti l'elemento stack superiore, scarta l'elemento sottostante

In altre parole, questo è principalmente solo un mucchio di istruzioni I / O. Analizziamo questo in dettaglio:

  • 73scarta 73363ciò che è ancora in cima alla pila.
  • 3genera il 023, e scarta il 34662. Si può quindi vedere che 34662è un commento, che è stato usato per memorizzare i byte necessari nell'altra versione del programma. Per quanto riguarda ciò che 023fa durante l'output, seleziona il formato I / O 0 (numeri interi), quindi 23è una direttiva che richiede l'implementazione per immettere un numero intero (in 7, si fa input tramite l'output di codici specifici che richiedono input). L'input viene eseguito facendo copie dell'elemento stack di seguito, ad esempio se l'input integer è 10, l'elemento stack successivo (attualmente 7) diventerà 7777777777. Pertanto, accettiamo l'input dell'utente in decimale, ma viene memorizzato come unario.
  • 6sfugge all'elemento stack superiore (modificando ciascuna istanza di 7in 1; questo è il modo in cui le stringhe costituite interamente da 7s vengono evase), quindi lo aggiunge all'elemento stack prima ( 772). Quindi i nostri dati ora sono qualcosa di simile 7721111111111.
  • Infine, 3genera l'elemento stack in questione (e apre un elemento stack vuoto che fa parte dello stack iniziale predefinito). Il suo valore è calcolato prendendo il numero di 1s e 7s, e sottraendo il numero di 0s e 6s. (La 2parte centrale viene ignorata nella maggior parte dei casi; se si trova alla fine della stringa, diventerà una nuova riga finale invece di essere ignorata, ma le regole PPCG non se ne preoccupano.) Pertanto, l'output è l'originale input più 2.

A questo punto, non c'è nulla di utile nello stack e niente nel programma, quindi il programma termina.

Come possiamo invertire questo? È una semplice questione di cambiare 11in 00, in modo che stiamo anteponendo caratteri all'input che lo rendono 2 più basso, anziché 2 più alto. Ci sono 00otto cifre ottali comodamente nascoste più avanti nel programma (in modo che cifre ottali e byte si allineino l'una con l'altra), quindi possiamo semplicemente scambiarlo con 11all'inizio.



Nota a margine: non devi spiegare il tuo codice, ma sapere cosa fa il tuo programma sarebbe bello.
GB

@GB: ho fornito una spiegazione completa del programma (inclusa una spiegazione di come funziona il crack).


6

Python 2, 83 byte, incrinato

#((()))****+,,---/2289;==oppppppqqqqqw~~
lambda n:pow(n,65537,10998167423251438693)

Questo è simile alla mia altra risposta. Tuttavia, questo utilizza RSA a 64 bit ed è crittograficamente abbastanza debole. Se riesci a derubare questa risposta, in teoria puoi derubare anche l'altro mio, dato abbastanza tempo.



5

Python 2, 47 byte, Cracked

lambda x:x**2or (iron() and saxifrage.extend())

Il dominio per questa funzione è {x ∈ ℤ | x> 0}. Raddoppia il suo input.


nmjcman101 ha trovato la soluzione prevista:

lambda x:sorted(a**2for a in range(x)).index(x)


1
Haha, adoro le chiamate di funzioni
inventate

1
Cracked È stato divertente, mi sono bloccato sull'anagramma smistato che mi era rimasto!
nmjcman101,

5

JavaScript (ES6), 46 byte, Cracked

x=>Math.log(x+(+String(t=985921996597669)[5]))

Questa funzione restituisce ln(x+1)dove xè un numero non negativo.

uso

(x=>Math.log(x+(+String(t=985921996597669)[5])))(5)

Nota: a causa della natura dei numeri in virgola mobile f(g(x))potrebbe non essere esattamente uguale x. Esempio:f(g(4))=3.9999999999999996


Cracked. È stato davvero divertente :-)
ETHproductions


4

Processing.js, 59 byte, Cracked!

float igetuwebaoli(int p){return p*(((17*-4*-3)))+0+0;}//,,

Questa funzione moltiplica l'input per 204( 17*-4*-3=204). Prende un int come input e genera un float. Come previsto, l'inverso divide l'input per 204.

Un interprete online per processing-js può essere trovato qui .





4

J , 29 byte ( incrinato per miglia)

5#.[:,(3 5&#:(-$]-)7)#.inv"0]

Questo è un verbo che accetta un intero positivo come input e procede come segue:

  1. Converti in basi 2 e 4.
  2. Riempi la rappresentazione base-4 con 0 per avere la stessa lunghezza della rappresentazione base-2.
  3. Concatenare le due rappresentazioni (prima la base-2).
  4. Interpreta la concatenazione come rappresentazione base-5 e converti in numero intero.

Provalo online!

La mia soluzione

La logica è praticamente la stessa della crack. La congiunzione dei ranghi "può essere bloccata in molti luoghi diversi (e la uso per sbarazzarmi del superfluo 0e 3), dal momento che in realtà non fa nulla nella soluzione.

(7-5)#.[:(]-:&#$,)5#.inv"0 3]

Non capisco J, ma i miei esperimenti mostrano che questo in realtà richiede un numero intero nelle basi 2 e 4, aggiunge zeri alla fine della base 4 per rendere uguale la loro lunghezza e solo allora concatena. Sono previsti questi zeri?
Wolfram,

@Wolfram Gli zeri sono destinati, questo è quello che ho cercato di dire con "simultaneamente". Altrimenti non penso che sarebbe reversibile.
Zgarb,

@Wolfram Ho aggiunto una descrizione più esplicita.
Zgarb,


4

Elaborazione (Java), 59 byte, SICURO

float igetuwebaoli(int p){return p*(((17*-4*-3)))+0+0;}//,,

Questa funzione moltiplica l'input per 204( 17*-4*-3=204). Prende un int come input e genera un float. Come previsto, l'inverso divide l'input per 204. Nota: entrambi i programmi prendono un int come input e producono un float.

Questa risposta è esattamente la stessa della mia altra risposta, tranne per il fatto che l'altra mia risposta è stata scritta in Processing.js. Ti presentiamo Processing-java, il cugino meno prolisso di Java. Puoi scaricare Processing qui su processing.org.

La crepa

float ap(int i){return i*pow(blue(get(0,0)),-1);}//++7*4*-3

Questo programma divide l'argomento per 204. Ma come? Andiamo all'interno della funzione.

i *                              //multiply i by
         blue( get(0, 0) )       //this (evaluates to 204)
    pow(                  , -1)  //raises to the -1 power (ie its reciprocal)

Abbastanza semplice, ma come blue( get(0, 0) )diventa 204? Questo è il fulcro di questa presentazione. Prima di tutto, get(0,0)ottiene il colore del pixel situato in (0,0)(l'angolo in alto a sinistra della finestra, che si apre sempre in uno schizzo di elaborazione). Quindi, blue()ottiene il valore blu di quel pixel, che è 204!

Per elaborare questa proposta, ho sperimentato stampando i diversi attributi del colore ottenuto da get(0,0). Ho scoperto che i, verde, blu, rosso valori alfa sono 204, 204, 204e 255rispettivamente. Da questo, ho deciso di fare una semplice operazione con questo numero e ho finito con questo post.


Pensavo che Kotlin fosse il cugino meno prolisso di Java! Ammetto che la famiglia di lingue C è piuttosto grande ... ma come sarebbe effettivamente l'albero genealogico ...
CAD97

Credo che ce l'abbia fatta, nessuno ha violato il tuo post ed è passata una settimana.
miglia

3

JavaScript (ES6), 63 byte Cracked di Ilmari Karonen

x=>eval(atob`eCp4KzEvLyAgfXBModLS4TvEn4wp1iys9YRRKC85KLIhNMC=`)

Tempo per qualche atobsciocchezza. Questa funzione restituisce x*x+1dove xè un numero non negativo.

uso

(x=>eval(atob`eCp4KzEvLyAgfXBModLS4TvEn4wp1iys9YRRKC85KLIhNMC=`))(5)

destinato

x=>eval(atob`Lyp5fMRwICAgKi9NYXRoLnBvdyh4LTEsMC41KS8veCp4KzE=`)

Esiste un gran numero di potenziali soluzioni, ma speravo che i personaggi principali eliminassero l'ordine dei byte abbastanza da renderlo più difficile. C'est laatob



Hai appena ripubblicato accidentalmente il tuo codice sfida come soluzione prevista? :)
Ilmari Karonen il

@IlmariKaronen Grazie, questo mi insegnerà a copiare / incollare ... lol sì, giusto: P
SLuck49,


2

Python 2, 225 byte, crackato da Sp3000

#((()))****+,,---/000555666888;==oppppppqqqqqw~~
lambda n:pow(n,65537,9273089718324971160906816222280219512637222672577602579509954532420895497077475973192045191331307498433055746131266769952623190481881511473086869829441397)

Il dominio di questa funzione è [0, n), dove n è il numero enorme sopra. Sì, questa funzione è invertibile su questo dominio. E a meno che non abbia sbagliato, rompere questa risposta è difficile quanto rompere RSA a 512 bit.


1
La forza bruta è molto più semplice della RSA a forza bruta perché hai già un anagramma approssimativo della costante di cui hai bisogno. D'altra parte, è probabilmente ancora troppo difficile da gestire in pratica.

4
Tieni presente che esiste un meta post relativo alla randomizzazione nelle sfide CnR
Kritixi Lithos

5
@KritixiLithos La mia risposta non contiene randomizzazione, hash o codice crittografico incorporato. È letteralmente un'esponenziazione modulare.
orlp

2
La tua risposta mira intenzionalmente a un problema noto per essere difficile da risolvere e quindi corrisponde al meta post (soprattutto perché menziona direttamente RSA). Penso che anche se la tua meta-scappatoia la tua sceneggiatura merita ancora il mio voto negativo.
Christoph,


0

J, 15 byte

(".&,'10.')#.#:

Accetta un numero intero non negativo n , lo converte in un elenco di cifre binarie e combina tali cifre come un numero di base 10.

Provalo online!

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.