Scrivi un risolutore di complessità Kolmogorov


16

La complessità Kolmogorov di una stringa S è la lunghezza del programma più breve P , scritto in un linguaggio di programmazione L , la cui uscita è esattamente S .
(Sì, la vera definizione è più formale ma questo sarà sufficiente per la sfida.)

Il vostro compito in questa sfida è quello di scrivere il più breve possibile "Kolmogorov complessità solver", che è, un programma scritto in L sé che prende una stringa S e ritorna più breve P scritto in L che le uscite S .

L'approccio naive a questo è di iterare su tutti 1 programmi lunghezza, quindi tutti i 2 programmi lunghezza, tutta 3 programmi di lunghezza, e così via, che esegue ciascuna di esse e misurando la corrente sino a un programma che uscite S viene trovato. Il problema con questo approccio è che alcuni di questi programmi potrebbero non smettere mai di funzionare, il che significa che il risolutore stesso potrebbe non fermarsi mai. E a causa dell'arresto del problema non esiste un modo sicuro per evitare i programmi che non si fermano.

Una semplice, sebbene soluzione imperfetta è mettere un limite di tempo per il tempo di esecuzione di ogni del potenziale P 's. I programmi che non si fermano nel tempo possono essere passati, ma il risolutore si fermerà sicuramente (supponendo che un programma in L possa effettivamente emettere S entro il limite di tempo).

Sfida

Scrivi il tuo risolutore come un programma o una funzione che comprende tre cose:

  • La stringa S .
  • Un numero intero positivo T che è il limite di tempo in secondi o un intervallo di tempo più piccolo (ad esempio millisecondi).
  • Una stringa Una dell'alfabeto di caratteri da usare per il potenziale P 's.

Ed emette il più breve P che contiene solo caratteri in A , viene eseguito in meno di T unità di tempo, e uscite S .

Questo è lo pseudocodice generale:

Function KolmogorovComplexitySolver(S, T, A):
    Assign N to 0
    Loop until function returns:
        In any order, iterate over all strings of length N that only contain characters from *A*. Call the current string P:
            Execute P, saving the output to O, stopping the execution if it takes longer than time T
            If (P did not throw any errors) and (P did not timeout) and (O and S are identical):
                Return P
        Add 1 to N

Dettagli

  • Si può presumere che ci sarà sempre un P realizzati con i personaggi in una che viene eseguito in tempo T che le uscite S .
  • Si può presumere che l'esecuzione delle potenziali P non avrà effetti collaterali che impediscono al solutore di funzionare o funzionare correttamente (come fare confusione con la memoria allocata del solutore).
  • Si può non supporre che i potenziali P s' sono privi di errori. Assicurati di includere try/ catchblocchi o qualsiasi altra cosa applicabile intorno alla chiamata di esecuzione.
  • Se ci sono più P più brevi , allora ne basterà una qualsiasi. "Shortness" è misurato in caratteri non byte.
  • L'output di potenziali P è ciò che viene stampato su stdout (o l'area di output normale della tua lingua). La stringa vuota è un potenziale P .
  • Idealmente, il tuo risolutore consentirà ad A di contenere qualsiasi personaggio. Un must almeno per essere in grado di contenere caratteri ASCII stampabili più tab e newline.
  • L'input può provenire da args file / stdin / command line / function. L'output va su stdout o simile o può essere restituito come stringa se si scrive una funzione.

punteggio

Vince l'invio con il minor numero di byte . Tiebreaker arriva alla prima pubblicazione inviata.


7
Mi fa male il cervello.
Alex A.

1
Riesci a rilassare il requisito secondo cui la lingua di destinazione e la lingua in cui è scritto il meta-solutore devono essere le stesse?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

E non sarebbe possibile semplicemente scrivere un programma che converte l'output in una rappresentazione letterale stringa della lingua?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ No, il punto è farlo nella stessa lingua. Sì, ma non sarebbe sempre il programma più breve.
Calvin's Hobbies,

@ Calvin'sHobbies: Quindi, alla fine, è solo una sfida di golf del codice scoprire quale lingua può facilmente scrivere codice per chiamare strutture (o implementare un compilatore dove assente) per compilare la lingua stessa?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

Risposte:


11

Python 3, 240 236 byte

import subprocess as s,itertools as i
def f(S,T,A,N=0):
 while 1:
  for P in i.product(A,repeat=N):
   try:
    P="".join(P);open("a","w").write(P)
    if s.check_output(["py","-3","a"],timeout=T).decode()==S:return P
   except:1
  N+=1

Non eseguire questo. Sul mio computer, almeno, ho trovato il programma davvero difficile da arrestare una volta iniziato a causa delle finestre pop-up create per processo.

timeoutsono stati aggiunti solo subprocess.check_outputin Python 3, motivo per cui stiamo usando questo piuttosto che Python 2.

Ecco una versione alternativa con una time.sleepche stampa anche tutti i programmi validi trovati lungo il percorso, così come il loro output corrispondente:

import subprocess as s,itertools as i
import time
def f(S,T,A,N=0):
 while 1:
  for P in i.product(A,repeat=N):
   time.sleep(0.2)
   try:
    P="".join(P);open("a","w").write(P);C=s.check_output(["py","-3","a"],timeout=T).decode()
    print(P,repr(C))
    if C==S:return P
   except:1
  N+=1

Il programma utilizza il nome file aper ciascun programma Pda testare, quindi se lo esegui assicurati di non avere già un file con quel nome. Sostituire ["py","-3","a"]con il comando appropriato per la propria configurazione (ad es. ["python","a"]O ["python3","a"]).

Sentiti libero di cambiare la sleepdurata a tuo rischio e pericolo :). Chiama come f("1\r\n",1,"1()print"), dov'è il Ttimeout in secondi.

Prime linee di uscita dal tester con la chiamata sopra:

 ''
1 ''
11 ''
() ''
111 ''
(1) ''
int ''
1111 ''

(Se vuoi aiutare un po 'il programma, puoi passare P="".join(P)a P="print"+"".join(P))

Poiché tutti i programmi precedenti non hanno output, ecco il risultato per f("1\r\n",1,["print","(",")","1"])(i token non fanno parte della sfida, ma volevo mostrare cosa succede):

 ''
print ''
1 ''
() ''
11 ''
print() '\r\n'
(print) ''
(1) ''
111 ''
print(print) '<built-in function print>\r\n'
print(1) '1\r\n'

Il valore restituito è la stringa 'print(1)'.

Infine, solo per divertimento, ecco cosa succede se l'alfabeto è string.printable, ad es

0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c

Collegamento Pastebin di tutti i programmi Python 3 validi 0-2 caratteri

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.