Bir Kolmogorov Karmaşıklık Çözücüsü Yazın


16

Kolmogorov karmaşıklığı bir dize ait S en kısa programı uzunluğudur P bazı programlama dili ile yazılmış, L , çıkış tam olarak, S .
(Evet, gerçek tanım daha formeldir, ancak bu meydan okuma için yeterli olacaktır.)

Bu meydan okuma Your iştir en kısa "Kolmogorov karmaşıklığı çözücüsü", yazılmış bir program yazmaktır L bir dize alır kendisi S ve getiri kısa P yazılmış L çıkışları olduğunu S .

Bunun naif yaklaşımı, tüm uzunluk 1 programlarını, sonra tüm uzunluk 2 programlarını, sonra tüm uzunluk 3 programlarını, vb. Yinelemektir, her birini çalıştırır ve S çıktısı olan bir program bulunana kadar çıktıyı ölçer . Bu yaklaşımla ilgili sorun, bu programların bazılarının çalışmayı asla durduramayacağı, yani çözücünün kendisinin asla durmayabileceği anlamına geliyor. Durma problemi nedeniyle, durmayan programlardan kaçınmanın kesin bir yolu yoktur.

Basit ama mükemmel olmayan bir çözüm, potansiyel P'lerin her birinin yürütme süresine bir zaman sınırı koymaktır . Zamanında durmayan programlar aktarılabilir, ancak çözücü kesinlikle duracaktır ( L' deki bir programın gerçekten S zaman sınırı içinde çıkabileceği varsayılarak ).

Meydan okuma

Çözücünüzü üç şey alan bir program veya işlev olarak yazın:

  • S dizesi .
  • Saniye cinsinden zaman sınırı veya daha küçük bir zaman aralığı olan pozitif bir tamsayı T (örneğin milisaniye).
  • Bir dize A potansiyel kullanım karakter alfabe P 's.

Ve yalnızca A harflerini içeren en kısa P çıktısını verir, T zaman biriminden daha az bir sürede çalışır ve S çıktısını verir .

Bu genel sahte kod:

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

ayrıntılar

  • Her zaman olacağını varsayabiliriz P karakter yapılmış A süresi içinde çalışır o T çıkışları olduğunu S .
  • Potansiyel yürütülmesi varsayabiliriz P 's çalışan ya da (çalısan kisinin ayrılan bellek ile karıştırmasını gibi) düzgün çalışmasını çözücüsü önlemek yan etkileri olmaz.
  • Sen olabilir değil potansiyel farz P 'nin hata ücretsizdir. try/ catchÇağrıları veya yürütme çağrısının etrafına uygulanabilir her şeyi eklediğinizden emin olun .
  • Birden çok kısa P ' varsa , o zaman herhangi biri yeterli olacaktır. "Kısalık", bayt değil, karakter cinsinden ölçülür.
  • Potansiyel çıkış P 'nin Stdout'a (veya dilinizin zamanki çıkış yüzölçümü) basılmış olan bu. Boş dize potansiyel bir P'dir .
  • İdeal olarak çözücünüz A'nın herhangi bir karakter içermesine izin verecektir . A en azından yazdırılabilir ASCII karakterleri artı sekmeler ve yeni satırlar içerebilmelidir .
  • Girdi, dosya / stdin / komut satırı / işlev argümanlarından gelebilir. Çıktı stdout veya benzerine gider veya bir işlev yazdıysanız dize olarak döndürülebilir.

puanlama

En az bayt içeren gönderim kazanır. Tiebreaker en erken gönderilen gönderime gider.


7
Beynim acıyor.
Alex

1
Meta çözücünün yazıldığı hedef dil ile dilin aynı olması gerekliliğini rahatlatabilir misiniz?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

Ve çıktıyı sadece dilin dizgesel gösterimine dönüştüren bir program yazmak mümkün olmaz mıydı?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ Hayır, asıl mesele bunu aynı dilde yapmak. Evet, ama bu her zaman en kısa program olmaz.
Calvin'in Hobileri

@ Calvin'sHobbies: Sonuçta, hangi dili dilin kendisini derlemek için tesisleri aramak (veya yokken derleyici uygulamak) için kod yazabileceğini öğrenmek sadece bir kod golf mücadelesi mi?
ǹ̷̰ĥ̷̳h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

Yanıtlar:


11

Piton 3, 240 236 bayt

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

Bunu yapma. Bilgisayarımda, en azından, işlem başına oluşturulan pop-up pencereler nedeniyle programın çalışmaya başladıktan sonra durmasını gerçekten zor buldum.

timeouts sadece subprocess.check_outputPython 3'e eklendi , bu yüzden bunu Python 2 yerine kullanıyoruz.

Aşağıda time.sleep, yol boyunca bulunan tüm geçerli programları ve ilgili çıktılarını da yazdıran alternatif bir sürüm bulunmaktadır :

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

Program, test edilecek aher program Piçin dosya adını kullanır , bu nedenle bunu çalıştırırsanız, o adda bir dosyanız olmadığından emin olun. ["py","-3","a"]Kurulumunuz için uygun komutla değiştirin (örn. ["python","a"]Veya ["python3","a"]).

sleepSüreyi kendi sorumluluğunuzda değiştirmekten çekinmeyin :). Gibi Çağrı f("1\r\n",1,"1()print"), nerede Tsaniye cinsinden zaman aşımı olduğunu.

Yukarıdaki çağrı ile test cihazından ilk birkaç çıkış hattı:

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

(Eğer biraz boyunca programına yardımcı olmak istiyorsanız değiştirebileceğiniz P="".join(P)için P="print"+"".join(P))

Yukarıdaki programların hepsinin çıktısı olmadığından, sonuç f("1\r\n",1,["print","(",")","1"])şöyledir (jetonlar mücadelenin bir parçası değildir, ancak ne olduğunu göstermek istedim):

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

Dönüş değeri dizedir 'print(1)'.

Son olarak, sadece eğlence için, alfabe ise ne olur string.printable, yani

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

Tüm geçerli 0-2 karakter Python 3 programlarının Pastebin bağlantısı

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.