Kaç tane üç meyveli turta yapabilirsin?


32

Üç meyveli turta üç farklı meyveden yapılır. Sahip olduğunuz 5 meyvenin miktarından alabileceğiniz en üç meyveli turta hangisidir?

Örneğin,

1 apple
1 banana
4 mangoes 
2 nectarines
0 peaches

2 turta yapabilirsiniz:

apple, mango, nectarine
banana, mango, nectarine

Girdi: Beş negatif olmayan tam sayı veya bir listesi.

Çıktı: Bu miktardaki meyvelerden yapabileceğiniz maksimum üç meyveli turta sayısı. En az bayt kazanır.

Test durumları:

1 1 4 2 0
2
2 2 2 2 2
3
0 6 0 6 0
0
12 5 3 2 1
5
1 14 14 3 2
6
0 0 1 0 50
0

Liderler Sıralaması:


Örneğinizin iki ek seçenek eksik olduğuna inanıyorum: Elma, Muz, Mango ve Elma, Muz, Nektarin. Bu nedenle, 1 1 4 2 0test
senaryosunun

@cobaltduck Ancak, ilk pastanızda Elma ve Muz kullanıyorsanız (Elma / Muz / Mango), ikinci pastanızda (Elma / Muz / Nektarin) kullanılacak Elma veya Muz yoktur.
AdmBorkBork

2
@ Timmy D: Ah, anladım. Turta aynı anda yapıldığı belli değildi.
kobaltduck

@cobaltduck Aynı anda yapılması gerekmediğine inanıyorum, ancak ilk önce kullandığınız meyveleri yeniden kullanarak hile yapamazsınız.
Bay Lister,

@Bay. Lister: Anlambilim. Belirsiz olan (en az bir okuyucuya) ve o zamandan beri netleştirilmiş bir kuralın olması yeterlidir.
kobaltduck

Yanıtlar:


34

Pyth, 19 18 14 bayt

-1 Bayt @ FryAmTheEggman tarafından

14-baytlık program @isaacg tarafından

Yükselen bir listeden oluşabilecek turta sayısının [x1,x2,x3,x4,x5]:

floor(min((x1+x2+x3+x4+x5)/3,(x1+x2+x3+x4)/2,x1+x2+x3))

Veya kodda:

JSQhS/Ls~PJ_S3

[TI-BASIC ve APL programları için revizyon geçmişine bakınız]

Doğruluk kanıtı

let

s3 = x1+x2+x3
s4 = x1+x2+x3+x4
s5 = x1+x2+x3+x4+x5

Bunun 1 - 5 numaralı meyve P(X)=floor(min(s5/3,s4/2,s3))listesi için her zaman en fazla turta olduğunu göstermek istiyoruz x1≤x2≤x3≤x4≤x5.

İlk önce, üç sayının da üst sınır olduğunu gösteriyoruz.

  • Olduğundan s5toplam meyveler ve her bir pasta üç meyve vardır, ⌊s5/3⌋bir üst sınırdır.

  • Olduğu için s4olan meyve olmayan meyve 5, ve en az iki non-5 meyve her pasta gerekmektedir, ⌊s4/2⌋bir üst sınırıdır.

  • Olduğu için s3de meyve 4 de meyve 5 olan meyveler ve en az bir adet bu tür meyve her pasta gereklidir, s3bir üst sınırıdır.

İkinci olarak, meyvelerin en büyük üç kümeden alınma yönteminin her zaman sınırı sağladığını gösterdik. Bunu indüksiyonla yapıyoruz.

Temel durum: 0 turta açıkça geçerli bir listeden oluşturulabilir P(X)>=0.

Endüktif adım: Herhangi listesi verildiğinde bir listede geride bırakarak bir pasta fırında yapabilirsiniz, ile . Bunu, en büyük üç kümeden bir meyve alarak ve ardından gerekirse başvurmakla yapıyoruz . Benimle ayı; bazı işler var.XP(X) > 0X'P(X') >= P(X)-13,4,5

  • Eğer x2<x3öyleyse, meyveleri çıkardıktan sonra listeyi sıralamamız gerekmez. Zaten geçerli bir yolumuz var X'. P(X') = P(X)-1Çünkü s5'3 az (üç tür meyve 1 ~ 5 çıkarıldığı için), s4'2 az ve s3'1 az olduğunu biliyoruz . Yani P(X')tam olarak P (X) den daha az.
  • Eğer x3<x4öyleyse, biz de aynı şekilde yaptık.
  • Şimdi nerede olayı ele alalım x2=x3=x4. Bu sefer listeyi yeniden düzenlememiz gerekecek.

    • Öyleyse x5>x4, 4. ve 2. kazıkları değiştirerek listeyi yeniden düzenleriz s5've s4'yine de sırasıyla 3 ve 2 oranında bir düşüş vardır, ancak s3'=s3-2. Bu sorun değil, çünkü eğer x2=x3=x4öyleyse 2*x4<=s3-> 2*x4+s3 <= 2*s3-> (x4 + s4)/2 <= s3. İki alt bölümümüz var:
    • Eşitlik, yani (x4,x3,x2,x1)=(1,1,1,0), bu durumda P(X)= 1ve açıkça kazıklardan bir turta yapabiliriz 5,4,3veya:

    • (s4+1)/2 <= s3Bu durumda s4ekstra 1bir değerin düşmesi P (X) değerine ekstra bir düşüş anlamına gelmez.

  • Şimdi nerede olacağız x1<x2=x3=x4=x5. Şimdi s3ihtiyacımız yüzden de, 1 ile azalacak (s5/3+1)olması <=s4/2; bu 8x5+2x1+2<=9x5+3x1, veya x5+x1>=2. Bundan daha küçük olan tüm durumlar manuel olarak kontrol edilebilir.

  • Her sayı eşitse, ⌊s5/3⌋her zaman diğer ikisinden daha az olan sınırını elde edebileceğimiz açıktır - sadece sırayla sayıları gözden geçiririz.

Sonunda bittik. Lütfen bir şeyi kaçırıyorsam yorum yapın ve daha şık bir kanıt için küçük bir ödül vereceğim.


Bence hak talebiniz @ fryamtheeggman'ın yinelemeli çözümü ile uyuşuyor.
Sparr

@Sparr Bağlamın fryamtheeggman metodunu kullanarak ulaşılabilir olduğunu kanıtlamaya çalışıyorum.
lirtosiast

2
Bu, bir döngüye dönüştürerek 4 byte'lık bir JSQhS/Ls~PJ_S3
golf ile oynanabilir

3
Pasta başına nmalzemeler ve kmalzemeler için bir kanıt bulduğuma inanıyorum , ancak bu yorum kutusu için çok uzun . Lütfen kanıtlayabilmemiz için bulabileceğiniz herhangi bir hatayı işaretleyin.
Mego

7

CJam, 34

q~L{J2be!\f{\.-_W#){j)7}|;}0+:e>}j

Çevrimiçi deneyin

Açıklama:

q~          read and evaluate the input array
L{…}j       calculate with memoized recursion and no initial values
             using the input array as the argument
  J2b       convert 19 to base 2 (J=19), obtaining [1 0 0 1 1]
  e!        get permutations without duplicates
             these are all the combinations of three 1's and two 0's
             which represent the choices of fruit for one pie
  \         swap with the argument array
  f{…}      for each combination and the argument
    \       swap to bring the combination to the top
    .-      subtract from the argument array, item by item
    _       duplicate the resulting array
    W#)     does it contain the value -1? (calculate (index of W=-1) + 1)
    {…}|    if not
      j     recursively solve the problem for this array
      )7    increment the result, then push a dummy value
    ;       pop the last value (array containing -1 or dummy value)
  0+        add a 0 in case the resulting array is empty
             (if we couldn't make any pie from the argument)
  :e>       get the maximum value (best number of pies)

Özyinelemenin kayda alınması bayt maliyeti mi? Çalışma zamanı sınırı yok.
xnor

2
@xnor Aslında burada 1 bayt kurtardığını düşünüyorum :)
aditsu

7

Haskell, 62 bayt

f x=maximum$0:[1+f y|y<-mapM(\a->a:[a-1|a>0])x,sum y==sum x-3]

Bu f, meyve listesinde yer alan xve maksimum turta sayısını döndüren bir işlevi tanımlar .

açıklama

Turta sayısını tekrarlı olarak hesaplıyoruz. Bölüm mapM(\a->a:[a-1|a>0])x, xolumlu girdileri azaltarak elde edilen tüm listelerin listesini değerlendirir . Eğer x = [0,1,2], sonuçlanır

[[0,1,2],[0,1,1],[0,0,2],[0,0,1]]

Dış kısım [], bir liste kavrayışıdır: yYukarıdaki listedeki tüm kısımları yineleriz ve toplamı eşit olmayanları filtreleriz sum(x)-3, böylece 3 farklı meyvenin bir turta haline getirildiği tüm listeleri alırız. Sonra fbu listeleri tekrar tekrar değerlendiriyoruz , 1her birine ekliyoruz , ve bunlardan en fazlasını alıyoruz 0(eğer turta yapamıyorsak temel örnek).


7

C #, 67

Tekrarlayan olarak, tükenene kadar en çok elde ettiğiniz meyvelerle yineleme başına bir turta yapın.

int f(List<int>p){p.Sort();p[3]--;p[4]--;return p[2]-->0?1+f(p):0;}

Test davaları burada


C # ile aşina değilsin, ama belki de p[2]--kontrol ederken aynı anda yapabilir misin p[2]>-1?
xnor

iyi nokta, cevabı bir saniyede güncelleyeceğim.
AXMIM

6

Pyth, 29

Wtt=QS-Q0=Q+tPPQtM>3.<Q1=hZ;Z

Test odası

Giriş listesini sıralar ve sıfırları siler. Ardından, 3 meyveniz olduğu sürece, ilk ve iki son öğeyi azaltın ve kalan öğeleri listeye ekleyin ve yeniden sıralamadan önce sıfırlayın. Ardından bir sayacı 1 arttırın.

Bu aslında sadece 5 meyve olduğu sürece oldukça hızlıdır, yani meyvelerin çok büyük kutularını, yani 1000,1000,1000,1000,1000bir saniyenin altında çözebilir .


Bunun doğru olduğunu kanıtlayabilir misin?
aditsu

@aditsu Bunu ispat etmedim, ancak birkaç ek değer olup olmadığını kontrol ediyorum. Daha önce böyle bir şey için bir kanıt yazmadım, ama deneyeceğim. Şimdilik, çalışması gerektiğini mantıklı bir şekilde söyleyeceğim çünkü her zaman sadece en büyük meyve yığınlarından alırsınız, küçük olanları tüketene kadar. Açgözlü stratejiler her zaman doğal olarak doğru olmasa da, neden burada işe yaramadığını düşünemiyorum.
FryAmTheEggman 30:15

@FryAmTheEggman En yaygın iki meyveyi ve en nadir meyveyi aldığınızı doğru muyum?
xnor

@xnor Evet, doğru. Bu işe yaramıyor mu?
FryAmTheEggman 30:15

1
@TimmyD Hayır, sanmıyorum (sanırım), ancak bu işlevselliğin kaldırılması herhangi bir bayta mal olmuyor (aslında daha fazlaya mal oluyor). Bununla birlikte, Reto Koradi'nin çözümünün çoğu dilde daha kısa olmasını ve açıkça Thomas'ın daha özlü olduğunu söyledi. Yeniden sıralama yapmamanın sebebinin, hangisinden daha küçük 3 kazıktan aldığının önemi yok.
FryAmTheEggman

6

Python, genel çözüm, 128 92 bayt

@Xnor'dan -36 bayt, sen gerçek mvp

g=lambda l,k:0if k>sum(l)else-(-1in l)or-~g(map(sum,zip(sorted(l),[0]*(len(l)-k)+[-1]*k)),k))

def g(a,k):b=[i for i in a if i];return 0if len(b)<k;c=sorted(b,reverse=True);return 1+g([c[i]-(k-1>i)for i in range(len(c))],k)

Kanıtım doğru olduğu sürece bu işe yarıyor . Değilse, nedenini bana bildir ki düzeltmeyi deneyebilirim. Eğer anlaşılmazsa bana haber ver, ben de birkaç fincan kahveden sonra saldırırım.


Artık her şey bana sıkı geliyor.
lirtosiast

@Mego Bunun üzerinde çalıştığın için teşekkürler! Lütfen SE postasındaki ispatı ekler misiniz? Bu yıllar sonra okuyan birinin ölü bağlantılar bulabileceğine dair genel bir endişe var. LaTeX formatlaması çoğunlukla MathJax'ta çalışmalıdır.
xnor

@Mego Oops, MathJax'ın burada etkin olmadığını unuttum. Hmm, ne yapacağımı soracağım.
xnor

Bu kanıt için lütuf veriyorum. Tebrikler!
xnor,

@Mego Nope, MathCloud bağlantınızın sahip olduğumuz en iyisi olduğunu düşünüyorum.
xnor,

5

Python 2,78 bayt

Giriş olarak 5 rakam alarak: 91 89 88 bayt

s=sorted([input()for x in[0]*5])
while s[2]:s[2]-=1;s[3]-=1;s[4]-=1;s.sort();x+=1
print x

Düzenleme : Değişen s=sorted([input()for x in[0]*5])tarafından s=sorted(map(input,['']*5));x=01 bayt kaydeder.

Giriş olarak 5 sayı alır ve yapılabilecek olası turta sayısını yazdırır. Reto Koradi'nin cevabı, bayt sayısını artırmadan aynı yaklaşımı kullanıyor ama bu sorunun Python'da bir cevabı eksik olduğunu hissettim.

Öneriniz için @ThomasKwa ve @xsot teşekkür ederiz.

Nasıl çalışır

 s=sorted([input()for x in[0]*5]) takes 5 numbers as input, puts them in a list 
                                  and sorts it in ascending order. The result
                                  is then stored in s 

 while s[2]:                      While there are more than 3 types of fruit 
                                  we can still make pies. As the list is                     
                                  sorted this will not be true when s[2] is 0. 
                                  This takes advantage of 0 being equivalent to False.

 s[2]-=1;s[3]-=1;s[4]-=1          Decrement in one unit the types of fruit 
                                  that we have the most

 s.sort()                         Sort the resulting list

 x+=1                             Add one to the pie counter

 print x                          Print the result

Değişkenin xhiçbir zaman tanımlanmadığına dikkat edin, ancak program, bazı sızıntı python 2.7'ye sahip olmanın avantajını alır. sListeyi kavrayarak listeyi tanımlarken, yinelenebilirdeki ( [0]*5bu durumda) en son değer yinelemek için kullanılan değişkende saklanır.

İşleri netleştirmek için:

>>>[x for x in range(10)]
>>>x
9

Listeyi giriş olarak alarak: 78 bayt

Girdiyi bir listeye değiştirmeyi önerdiğiniz için @xnor @xsot ve @ThomasKwa 'ya teşekkürler.

s=sorted(input());x=0
while s[2]:s[2]-=1;s[3]-=1;s[4]-=1;s.sort();x+=1
print x

Nasıl çalışır

Yukarıdaki kodla aynı şekilde çalışır, ancak bu durumda giriş zaten bir listedir, bu nedenle oluşturmaya ve değişkene gerek yoktur x tanımlanmalıdır.

Sorumluluk reddi: Bu benim ilk golf denemem ve hala golf oynayabileceğimi düşünüyor, bu yüzden bayt sayısını azaltmak için yapılabilecek değişiklikleri önerin.


1
Girişin zaten bir listede olmasına izin verilir; s[2]>0-> s[2], çünkü kümedeki sayı her zaman negatif değildir.
lirtosiast

Thomas Kwa, girişin zaten bir liste halinde verildiğini kabul edebileceğinizi belirtti, bu yüzden sadece yapabilirsiniz s=sorted(input()). Ayrıca, geçerli bayt sayınız 89; newlines, tek bir karakter olarak sayılır.
xnor

@ThomasKwa zaten bir liste olarak girdi kabul edebileceğini belirtti, ancak çok satırlı girişi kabul ısrar, bir byte kaydetmek için aşağıdaki ilk satırı değiştirin: s=sorted(map(input,['']*5));x=0.
xsot

4

CJam, 23 bayt

0l~{\)\$2/~+:(+_2=)}g;(

Çevrimiçi deneyin

Bu, her bir yinelemedeki en büyük 3 yığından meyve alır ve yinelemelerin sayısını sayar.

Bunun her zaman doğru sonucu verdiğine dair matematiksel bir kanıtım yok. Verilen test örnekleri için geçerlidir ve birileri bana bir karşı örnek verene kadar her durum için işe yaradığına inanıyorum.

Sezgisel açıklama kendimi ikna etmek için kullandım: Turta sayısını en üst düzeye çıkarmak için, mümkün olduğunca çok sayıda kazık boş tutmanız gerekir. Bunun nedeni, 3 veya daha fazla boş kazık olduğunuzda daha fazla turta yapma yeteneğinizi kaybetmenizdir.

Bu her zaman en büyük yığınlardan meyve alarak elde edilir. Daha küçük bir yığıntan meyve almanın, daha büyük bir yığıntan meyve almaktan daha iyi bir duruma neden olacağı bir durumu düşünemiyorum.

Kafamda biraz daha resmi bir akıl yürütme var. Bunu kelimeleri / formüle koymanın bir yolunu düşünmeye çalışacağım.


Ben indüksiyon kullanmaya çalışıyorum; belki resmi bir kanıt bulmak için fikirlerimizi birleştirebiliriz.
lirtosiast

@ThomasKwa Eğer yazarsam, inandırıcı gelebilecek kadar net bir şey bulamadım. Her şey, daha küçük bir yığından daha büyük bir yığından daha iyi bir istif almanın neden daha iyi olacağı konusunda hiçbir neden göremediğim gerçeğine bağlı. Daha küçük bir yığından almanın daha kötü olacağı açık durumlar olsa da. Ayrıca hem mayın hem de aditsu'nun çözümlerine rastgele çok fazla sayı girdim ve aynı sonucu verdiler. Benim çözümüm, denediğim örnekler için formülünle de tutarlı.
Reto Koradi

3

> <>, 76 bayt

0&4\/~}&?!/
@:@<\!?:}$-1@@$!?&+&:)@:@
,:&:@(?$n;/++:&+::2%-2,:&:@(?$&~+:3%-3

> <> Sıralamasının kolay değil! Bu program, Thomas Kwa tarafından ortaya konan kanıtın gerçek olduğuna dayanıyor, ki bu kesinlikle test durumlarında olduğu gibi görünüyor.

Programın başlangıcında 5 giriş numarasının yığında bulunması beklenir.

İlk iki satır yığındaki sayıları sıralar ve üçüncüsü floor(min((x1+x2+x3+x4+x5)/3,(x1+x2+x3+x4)/2,x1+x2+x3))Thomas'ın cevabından alınan hesaplamayı yapar .


Üç / dört elementin toplamının toplamını ve bunların miktarını hesaplarsanız daha kısa olur mu?
lirtosiast

@ThomasKwa Girdi setinin permütasyonlarını bulmak, her birinin en üstteki 3 ve 4 elementini toplamak ve en küçüğünü almak gibi görünüyor mu? Özellikle yığın tabanlı bir dilde kullandığım sıralama / hesaplama yaklaşımından daha kısa olan izinleri bulmak sanmıyorum. Yığın tabanlı bir dilde permütasyon üretmek için kullanışlı algoritmalar biliyorsanız, şunu görmek isterim: o)
Sok

2

Python 2, 59 bayt

h=lambda l,k=3:k*'_'and min(h(sorted(l)[:-1],k-1),sum(l)/k)

Herhangi biri için nve çalışan bir genel yöntem k. k=33 pasta varsayılan başına meyve yapar, ancak farklı bir değer iletebilirsiniz. Özyineleme, Python 2'deki dizgilerin sayılardan daha büyük olduğu gerçeğini kullanır, boş dizginin sonsuzluk temel durumunu temsil etmesine izin verir.

Bu yöntem her zaman en yaygın meyveyi almanın en uygun yol olduğu gerçeğini kullanır, bu nedenle meyvelerin her sıralamasını sınırlayıcı bir faktör olarak kabul ederiz. Bu gerçeği aşağıda ispatladım.


Mego'nun kanıtı , en sık rastlanan meyveleri tekrar tekrar almanın en uygun olduğuna dair daha doğrudan bir kanıt olduğunu düşündürdü. Bu kmeyve turta ile belirtilir .

Teorem:k En sık meyvelerin tekrar tekrar alınması en uygun turta sayısını verir.

İspat:N Turtalar mümkün olduğunda en yaygın meyve stratejisinin en az Nturta ürettiğini göstereceğiz . Bunu, meyveleri Nturtalar arasında değiştirerek , bu stratejinin ürettiği meyvelerle eşleştirerek meyveleri turtalar arasında değiştirerek yapıyoruz.

Hadi, ilk turta (buna hitap edin p) en yaygın meyveleri içerelim. Henüz değilse, bir meyve içermeli i, fakat daha yaygın bir meyve içermemelidir j. Daha sonra, kalan turta meyve kesinlikle daha fazlasına sahip jmeyveden daha ive diğer bazı pasta böylece qiçermelidir jancak i. Sonra biz meyve takas olabilir ipastadan pmeyve ile jpastadan qtutar Nfarklı meyve olan turta.

Kadar bu işlemi tekrarlayın pvardır ken yaygın meyve.

Ardından, bir pkenara koyun ve kalan en yaygın meyvelere sahip olmasını sağlamak için bir sonraki turta için bu işlemi tekrarlayın. Turta en yaygın meyve devletinin ürettiği dizi olana kadar bunu yapmaya devam edin.


1

PowerShell, 92 Bayt

$a=($args|sort)-ne0;while($a.count-ge3){$a[0]--;$a[-1]--;$a[-2]--;$a=($a-ne0;$c++}($c,0)[!$c]

Kullanımları FryAmTheEggman en aynı açgözlü tabanlı algoritma cevap PowerShell içinde ... sadece çok wordier ....

$a=($args|sort)-ne0  # Take input arguments, sort them, remove any 0's
while($a.count-ge3){ # So long as we have 3 or more fruit piles
  $a[0]--            # Remove one from the first element...
  $a[-1]--           # ... the last element ...
  $a[-2]--           # ... and the second-to-last.
  $a=$a-ne0          # Remove any 0's from our piles
  $c++               # Increment how many pies we've made
}                    #
($c,0)[!$c]          # Equivalent to if($c){$c}else{0}
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.