Karşılıklı karşılıklılıklar


21

N> 77 bir sayı verildiğinde , kümenin toplamı n'e eşit olacak şekilde farklı pozitif tamsayılar kümesi bulan bir program veya işlev yazın ve kümenin karşılıklılıklarının toplamı 1'e eşittir.

80 için örnek:

80 = 2 + 4 + 10 + 15 + 21 + 28 ⟶ 1/2 + 1/4 + 1/10 + 1/15 + 1/21 + 1/28 = 1

Programınız veya işlevin (teorik olarak) herhangi bir n <2 32 için çalışması gerekir ve kayan nokta yuvarlama hataları için mazeret yoktur. N> 77’nin tümü için çözümler bulunduğunu unutmayın .


Bayt cinsinden en kısa kod kazanır.

Bonus teşvik var: Herhangi bir n için çalışan ve log (n) çalıştıran en küçük çözüme bir ödül vereceğim . Küçük n için hızlı olmalı (takdirime göre belirlenir). Evet, bu mümkün.


3
Böyle bir ayrışmanın her zaman var olacağı garanti edilir mi? Bunu sağlayan herhangi bir teorik teorem var mı?
Luis Mendo,

Görünen o ki, n> 77 için. (Her ayrıntıyı kontrol etmedim.) Bu, zorluğunuzun tanımında
olmalıydı

1
@flawr, ben bu referansı içermediğini farz ediyorum çünkü O(log n)algoritmayı veriyor .
Peter Taylor,

1
Yine de bu setin verilen n için var olduğunu söylemeliydi. (Ve ben bu kağıdı ilk sayfada googling yaparken buldum.)
kusurlu

1
@flawr, bulmam yaklaşık 10 dakika sürdü. Mısır fraksiyonlarıyla ilgili bir sayfa aracılığıyla anladım ve sen beni 10 saniye boyunca ninja ettin.
Peter Taylor,

Yanıtlar:


3

Mathematica, 54 bayt

Select[IntegerPartitions@#,Unequal@@#&&Tr[1/#]==1&,1]&

Ne kadar verimli olursa olsun, ancak n = 78yaklaşık 9 saniye içinde çözülüyor.

Sonuç, tekil bir listeye sarılmış bir liste olarak döndürülür, örneğin:

{{45, 12, 9, 5, 4, 3}}

Acaba çok mu büyük çalışıyor?
njpipeorgan

@njpipeorgan Yeterince hafıza ve zaman verildi, evet.
Martin Ender,

Tamsayı [n], exp (sqrt (n)), n = 2 ^ 30 için ~ 10 ^ 10 ^ 4.5 olan bir uzunluk için bir tahmin buldum. Matematiğin (hatta herhangi bir mimarinin) diziyi tutabildiğine gerçekten inanmıyorum.
njpipeorgan

@njpipeorgan Zorluk açıkça algoritmanın teorik olarak pratikte değil 2 ^ 32'ye kadar çalışması gerektiğini açıkça belirtmektedir (genellikle kod golf için varsayıldığı gibi, eğer zorluk açıkça programın tüm girdiler için makul bir süre ve bellekte bitmesini gerektirmediği sürece) ).
Martin Ender

4

Python 3, 7306 1995 Bayt

Bu çözüm log (n) karmaşıklığı içinde çalışır (söyleyebileceğim kadarıyla).

def i(s,t):
 for n in s[::-1]:t=t.replace(*n)
 return [[]]*78+[list(bytearray.fromhex(a))for a in t.split(",")]
def f(n):
 g,h=lambda c,n:c+[[[2],[3,7,78,91]][n[len(c)]%2]+[i*2for i in c[-1]]],lambda n:[]if n<78 else h((n-[2,179][n%2])//2)+[n]
 v=h(n);c=[i([['g',',03040'],['h',',,0306080'],['i',',020'],['j','b0c1'],['k','21'],['l','60'],['m','30'],['n','141'],['o','k24'],['p',',g'],['q','618'],['r','0c0'],['s','1e'],['t',',0ml'],['u','283c'],['v','e0f1'],['w','2a38'],['x','80'],['y','a0'],['z','01'],['A','50'],['B','24'],['C','i40'],['D','plb1'],['E','gl'],['F','48'],['G','bre1'],['H','28'],['I','6k'],['J','416s'],['K',',040Al'],['L','90'],['M','2a'],['N','54'],['O','k6o'],['P','3c'],['Q','il'],['R','18'],['S','px'],['T','im'],['U','70'],['V','b1'],['W','23'],['X','pj'],['Y','hj'],['Z','0n']],'020lxycHTaRHCyf1517CyfneC91k51cCLdneQU912MCyf0dBiALyf2dClfPEyfneT9s2dELdneEjIgmLydHg5rd14BKLardsE3n8sQ9rd1517Q9rdneplmdRBgUmcRMC5sPEyf102bgA6sPE91z2miAj41IQmc0dRBQUen7spl31z82bT9RFT3wE7neMgmyf0dRBgUmaHMELc1b36EUdBMQLyfs2d,C710M2bgLardRHT3BFQ9rf0dPQ7rdBMQm9Rs2d,0mAl9100d142bE710M2bQmc0fRPtxarfn8sEc1k4sBTfnePExcwtxarf1k8BExcuT3kkT91663C51964,0mAl71k4BMELe12NTcRwQjOT820ltmarf1z8mExeRNCqBFtmyjIHKLa100ds2bQU91bM36garf1k4sBTcRBFgxarfwE91keB2dtUxcn8sME9nbs36gm9rduC5R78,0mAUyf0d14BME91kbB36QLc12AB2dgyjqkHEUeMNT9157eQU9RMFT8s78C8neuixLc1zk4AtUxc1z8Mmt8re0fn8sWhLyc1bH36pl8neu,Kxycsw,iAxc1420l,K8ren8NS9n81bs36hc0vz8WmYzqkmhyv2WBHhyVOHXkJoSjIwSjIuSvz4WASVZIAXZ6skmSj6oFXzOmplvcsW46D61csk46plv8WBFDqoF,tarvk8WBH,tyjkqoHhGqkN,tmvZ8sWmhVZqskmpc0vZ8WAXZqkAplbnImASbn6skwSbn6skuSVOwSVOupGONSbn6soFpyVkJk5aSj6sk78YJkuDkIP5aYOuhvzk4WBAhVzk416oA,tyjkJ265a,,0mxyjk41q53sYzIHmPXkqowXkqouhyVqoHFYz6omFhb0e1zqkmNSyVIP78YJ20klpyVOHwYk620olpc0vz8WBmFXzqomFpG61ckH38PhyjIP78Yz620kmlDkImLDzINUhGIuNDzIA78hb0e1ZIANYkqk366chG6oFNXkJkP5ahVZ6somFSb0e1620kNlhVk41qomADzIFLXkqso78pGqoFNXzkImP5a,tyjk620oHlhG620kNlXzqskm78,tjZqskHmPYqouFD6sku78YzqkNU,tjZqsomF')[v[0]]]
 for o in range(len(v)-1):c=g(c,v)
 return c[-1]

f(2**32 - 1)Neredeyse anında çalıştığını test edebilirsiniz

Bu kağıdı hesaplamak için bir yöntem üzerinde kullandım . Bu yöntemle, n = 78'den 334'e n için önceden belirlenmiş değerler için 168'den sonraki çift sayılar olmadan büyük bir veri yığını vardır. Bu verileri küçük bir şeye dönüştürmek istedim ve herhangi bir iyi sıkıştırma algoritmasını bilmiyordum. kendim yaptım.

Sıkıştırma yöntemim dize değiştirme kurallarının bir listesini yapmaktı. Kural tanımını göz önünde bulundurarak tüm içeriği en çok azaltan string değiştirme kuralını bulan bir yöntem yarattım. Daha sonra daha fazla kural oluşturamayana kadar bunu tekrarlı bir şekilde uyguladım (gz ve AZ karakterlerini kullandım). Değiştirmek için yaptığım dize, sayıların her biri için onaltılık değerlerin virgülle ayrılmış listesidir. Geçmişe bakıldığında, bunları onaltılık değerlerine dönüştürmek en akıllıca tercih olmayabilir, onları bırakmak daha kısa olacaktır, çünkü hex olması yalnızca 3 basamaklı sayılar için tasarruf sağlar, ancak tek basamaklı sayılar için 0 ekler.

C ayarladığım satırda değiştirme kurallarının listesini ve üzerinde çalıştığı metni görebilirsiniz. Kuralların da tersten uygulanması gerekir, çünkü bazı kurallar diğer kurallardan oluşturulan karakterleri içerir.

Ayrıca, bu kodda, listelerin listesini tek bir listeye dönüştürmek ve ardından metni değiştirmek için kurallara erişmek için farklı bir yöntem kullanmak gibi, muhtemelen sözdizimini azaltabileceğim çok sayıda yer var.


1
n=218[2]beklenen çıktılar ??
officialaimm

1
Hayır, bunun neden biraz sonra olduğunu göreceğim. Özür dilerim. Başlangıçta sıkıştırdığım verilerde bir hata olabilir.
Cameron Aavik

1

Haskell, 93 bayt

import Data.List
import Data.Ratio
p n=[x|x<-subsequences[2..n],sum x==n,1==sum(map(1%)x)]!!0

Korkunç derecede yavaş 1 ama sabit bellekte çalışıyor. Önemsiz çözüm: Toplamın [2..n]ve karşılıklılıkların toplamının tüm altlarını kontrol et .

Biri yerine tüm çözümleri geri döndürmek 3 byte kısadır: sadece kaldırın !!0(dikkat: çalışma süresi daima çizelgelerin dışında kalır).


1 Çalışma süresi, sonuç listesinde alt listenin ne kadar erken görüneceğine bağlıdır. Haskell'in tembelliği, ilk eşleşme bulunursa aramayı durdurur. Derlendiğinde p 89(sonuç [3,4,6,9,18,21,28]:) 35 yaşındaki dizüstü bilgisayarımda (4 yaşında) çalışıyor. Diğer değerler, daha küçük olanlar bile, saatler sürebilir.


0

Julia, 77 bayt

n->collect(filter(i->i==∪(i)&&sum(j->Rational(1,j),i)==1,partitions(n)))[1]

Bu bir tamsayıyı kabul eden ve bir tamsayı dizisi döndüren verimsiz bir lambda işlevidir. Aramak için değişkene atayın.

Kullanarak tamsayının bölümlerini alıyoruz partitions. Daha sonra bölüm kümesini, yalnızca karşılıklı toplamları 1 olan toplamı benzersiz öğelere sahip olanlara filtrelendiriyoruz Rational. filterbir yineleyici döndürür, bu yüzden collectbir dizi haline getirmeliyiz. Bu bize bir dizi dizi verir (sadece tek bir element ile), böylece ilkini kullanabiliriz [1].

Şimdi, verimsiz derken, onu kastediyorum. Bunu n = 80 için çalıştırmak bilgisayarımda 39.113 saniye sürüyor ve 13.759 GB bellek ayırıyor.

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.