var QUESTION_ID=59192,OVERRIDE_USER=20260;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
1 1 4 2 0
przypadek testowy powinien dać wynik: 4.Odpowiedzi:
Pyth,
191814 bajtów-1 bajt @FryAmTheEggman
14-bajtowy program @isaacg
Twierdzę, że liczba ciast, które można uformować z rosnącej listy,
[x1,x2,x3,x4,x5]
wynosi:Lub w kodzie:
[Zobacz historię zmian dla programów TI-BASIC i APL]
Dowód poprawności
Pozwolić
Chcemy pokazać, że
P(X)=floor(min(s5/3,s4/2,s3))
jest to zawsze największa liczba ciast na liściex1≤x2≤x3≤x4≤x5
liczb owoców 1 ~ 5.Po pierwsze, pokazujemy, że wszystkie trzy liczby są górnymi granicami.
Ponieważ są
s5
wszystkie owoce, a każde ciasto ma trzy owoce,⌊s5/3⌋
jest górną granicą.Ponieważ istnieją
s4
owoce, które nie są owocami 5, a co najmniej dwa owoce inne niż 5 są wymagane w każdym cieście,⌊s4/2⌋
górna granica.Ponieważ istnieją
s3
owoce, które nie są ani owocami 4, ani owocami 5, a przynajmniej jeden taki owoc jest wymagany w każdym cieście,s3
jest to górna granica.Po drugie, pokazujemy, że metoda zbierania owoców z trzech największych stosów zawsze spełnia oczekiwania. Robimy to przez indukcję.
Przypadek podstawowy: 0 ciastek można oczywiście utworzyć z dowolnej prawidłowej listy z
P(X)>=0
.Indukcyjny krok: Biorąc pod uwagę żadnej listy
X
, gdzieP(X) > 0
możemy upiec jeden placek, zostawiając listyX'
zP(X') >= P(X)-1
. Robimy to, pobierając owoce z trzech największych stosów3,4,5
, a następnie uciekając w razie potrzeby. Zrób ze mną; jest trochę spraw.x2<x3
, to nie musimy sortować listy po usunięciu owoców. Mamy już ważnyX'
. Wiemy, żeP(X') = P(X)-1
ponieważs5'
jest o 3 mniej (ponieważ usunięto trzy owoce typu 1 ~ 5),s4'
jest o 2 mniej is3'
jest o 1 mniej. CzyliP(X')
dokładnie o jeden mniej niż P (X).x3<x4
to zrobimy podobnie.Teraz bierzemy przypadek gdzie
x2=x3=x4
. Tym razem będziemy musieli zmienić kolejność listy.x5>x4
, to przestawiamy listę, zmieniając stosy 4 i 2.s5'
is4'
nadal spadamy odpowiednio o 3 i 2, ales3'=s3-2
. To nie jest problem, ponieważ jeślix2=x3=x4
, to2*x4<=s3
->2*x4+s3 <= 2*s3
->(x4 + s4)/2 <= s3
. Mamy dwie podklasy:Równość, tj.
(x4,x3,x2,x1)=(1,1,1,0)
W którym przypadkuP(X)
=1
i możemy wyraźnie zrobić ciasto ze stosów5,4,3
lub:(s4+1)/2 <= s3
, w którym to przypadku zmniejszas4
się o dodatkowy1
nie oznacza dodatkowego zmniejszenia do P (X).Teraz pozostaje nam przypadek, w którym
x1<x2=x3=x4=x5
. Terazs3
również zostanie zmniejszona o 1, więc musimy(s5/3+1)
być<=s4/2
; to jest,8x5+2x1+2<=9x5+3x1
, lubx5+x1>=2
. Wszystkie przypadki mniejsze niż to można sprawdzić ręcznie.Jeśli każda liczba jest równa, jasne jest, że możemy osiągnąć granicę
⌊s5/3⌋
, która jest zawsze mniejsza niż pozostałe dwie - po prostu przeglądamy liczby w sekwencji.Wreszcie skończyliśmy. Proszę o komentarz, jeśli coś mi umknie, a ja dam małą nagrodę za bardziej elegancki dowód.
źródło
JSQhS/Ls~PJ_S3
n
składniki ik
składniki na ciasto, ale na to pole komentarza jest za długie . Wskaż wszelkie błędy, które możesz znaleźć, abyśmy mogli to udowodnić.CJam, 34
Wypróbuj online
Wyjaśnienie:
źródło
Haskell, 62 bajty
Definiuje funkcję,
f
która pobiera listę owocówx
i zwraca maksymalną liczbę ciast.Wyjaśnienie
Rekurencyjnie obliczamy liczbę ciast. Część
mapM(\a->a:[a-1|a>0])x
ewaluuje do listy wszystkich list uzyskanychx
przez zmniejszenie wartości pozytywnych wpisów. Jeślix = [0,1,2]
spowoduje toCzęść między zewnętrznym
[]
jest rozumieniem listy: iterujemy wszystkoy
na powyższej liście i odfiltrowujemy tych, których suma nie jest równasum(x)-3
, więc otrzymujemy wszystkie listy, w których 3 różne owoce zostały przetworzone w ciasto. Następnie rekurencyjnie oceniamyf
te listy, dodajemy1
do każdej z nich i bierzemy ich maksimum oraz0
(podstawowy przypadek, jeśli nie możemy zrobić żadnych ciast).źródło
C #, 67
Rekurencyjnie zrób jedno ciasto na iterację z owocami, które masz najwięcej, aż do wyczerpania.
Przypadki testowe tutaj
źródło
p[2]--
w tym samym czasie, co sprawdzaniep[2]>-1
?Pyth, 29 lat
Zestaw testowy
Sortuje listę danych wejściowych i usuwa zera. Następnie, o ile masz 3 owoce, zmniejsz pierwszy i dwa ostatnie elementy i dodaj pozostałe elementy do listy, zanim posortujesz je i ponownie usuniesz zera. Następnie zwiększ licznik o 1.
Jest to faktycznie dość szybkie, o ile jest tylko 5 owoców, może rozwiązać bardzo duże pojemniki z owocami, tj.
1000,1000,1000,1000,1000
W ciągu sekundy.źródło
Python, rozwiązanie ogólne,
12892 bajty-36 bajtów od @xnor, da real mvp
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)
Działa to tak długo, jak długo mój dowód jest poprawny. Jeśli nie, daj mi znać, dlaczego mogę spróbować to naprawić. Jeśli jest to niezrozumiałe, daj mi znać, a zaatakuję go po kilku filiżankach kawy.
źródło
Python 2, 78 bajtów
Biorąc 5 liczb jako dane wejściowe:
918988 bajtówEdycja : Zmiana
s=sorted([input()for x in[0]*5])
os=sorted(map(input,['']*5));x=0
zapisuje 1 bajt.Pobiera 5 liczb jako dane wejściowe i drukuje liczbę możliwych ciasta, które można zrobić. Przyjmuje to samo podejście, co odpowiedź Reto Koradi - bez poprawiania liczby bajtów - ale wydawało się, że w pytaniu brakowało odpowiedzi.
Dzięki @ThomasKwa i @xsot za sugestię.
Jak to działa
Zauważ, że zmienna
x
nigdy nie jest zdefiniowana, ale program korzysta z niektórych wycieków Pythona 2.7. Podczas definiowania listys
ze zrozumieniem listy ostatnia wartość w iterowalnym ([0]*5
w tym przypadku) jest przechowywana w zmiennej używanej do iteracji.Aby wszystko było jaśniejsze:
Biorąc listę jako dane wejściowe: 78 bajtów
Dzięki @xnor @xsot i @ThomasKwa za sugestię zmiany danych wejściowych na listę.
Jak to działa
Działa tak samo jak powyższy kod, ale w tym przypadku dane wejściowe są już listą, więc nie ma potrzeby ich tworzenia i
x
należy zdefiniować zmienną .Oświadczenie: To moja pierwsza próba gry w golfa i wydaje mi się, że nadal można grać w golfa, więc sugeruj wszelkie zmiany, które można wprowadzić, aby zmniejszyć liczbę bajtów.
źródło
s[2]>0
->s[2]
, ponieważ liczba w stosie jest zawsze nieujemna.s=sorted(input())
. Ponadto bieżąca liczba bajtów wynosi 89; znaki nowej linii liczą się jako pojedynczy znak.s=sorted(map(input,['']*5));x=0
.CJam, 23 bajty
Wypróbuj online
Daje to owoce z 3 największych stosów w każdej iteracji i liczy liczbę iteracji.
Nie mam matematycznego dowodu, że zawsze daje to właściwy wynik. Działa w przypadku podanych przykładów testowych i uwierzę, że działa we wszystkich przypadkach, dopóki ktoś nie poda mi kontrprzykładu.
Intuicyjne wyjaśnienie, które sam sobie przekonywałem: Aby zmaksymalizować liczbę ciast, musisz zachować jak najwięcej stosów, które nie są puste. Dzieje się tak, ponieważ tracisz możliwość robienia większej liczby ciast, gdy tylko masz 3 lub więcej pustych stosów.
Osiąga się to zawsze biorąc owoce z największych stosów. Nie mogę wymyślić przypadku, w którym pobranie owoców z mniejszego stosu doprowadziłoby do lepszej sytuacji niż pobranie owoców z większego stosu.
Mam nieco bardziej formalne rozumowanie. Spróbuję wymyślić sposób, aby umieścić to w słowach / formule.
źródło
> <>, 76 bajtów
Okazuje się, że sortowanie w> <> nie jest łatwe! Program ten opiera się na prawdziwości dowodu przedstawionego przez Thomasa Kwa, co z pewnością wygląda na przypadek przypadków testowych.
Oczekuje się, że 5 liczb wejściowych będzie obecnych na stosie na początku programu.
Pierwsze dwa wiersze sortują liczby na stosie, a trzeci wykonuje obliczenia na podstawie
floor(min((x1+x2+x3+x4+x5)/3,(x1+x2+x3+x4)/2,x1+x2+x3))
odpowiedzi Thomasa.źródło
Python 2, 59 bajtów
Ogólna metoda, która działa dla każdego
n
ik
.k=3
Sprawia, że owoce domyślnie pie do 3, ale można przejść na inną wartość. Rekurencja wykorzystuje fakt, że ciągi są większe niż liczby w Pythonie 2, pozwalając, aby pusty ciąg reprezentował podstawowy przypadek nieskończoności.Ta metoda wykorzystuje fakt, że zawsze przyjmowanie najbardziej powszechnych owoców jest optymalne, dlatego uważamy każdą możliwą rangę owoców za czynnik ograniczający. Potwierdziłem ten fakt poniżej.
Dowód Mego sprawił, że pomyślałem o tym bardziej bezpośrednim dowodzie, że wielokrotne przyjmowanie najczęstszych owoców jest optymalne. Jest to stwierdzone w przypadku ciast
k
owocowych.Twierdzenie: Wielokrotne przyjmowanie
k
najczęstszych owoców daje optymalną liczbę ciast.Dowód: pokażemy, że jeśli
N
ciasta są możliwe, to strategia najczęstszych owoców produkuje przynajmniejN
ciasta. Robimy to, zmieniając owoce wN
cieście, aby dopasować je do tych wyprodukowanych przez tę strategię, jednocześnie zachowując ważność ciast.Zróbmy to, aby pierwsze ciasto (nazwij je
p
) zawierało najczęstsze owoce. Jeśli jeszcze nie ma, musi zawierać owoci
, ale nie bardziej powszechny owocj
. Następnie pozostałe ciasta mają więcej owocówj
niż owocówi
, więc niektóre inne ciastaq
muszą zawierać,j
ale nie musząi
. Następnie możemy zamienić owocei
z ciasta nap
owocej
z ciastaq
, dzięki czemuN
ciasta mają wyraźne owoce.Powtórz ten proces, dopóki
p
mak
najczęstsze owoce.Następnie
p
odłóż ciasto na bok i powtórz ten proces dla następnego ciasta, aby uzyskać najczęściej występujące owoce. Rób to dalej, aż ciasta będą sekwencją produkowaną przez strategię najczęstszych owoców.źródło
PowerShell, 92 bajty
Używa tego samego algorytmu opartego na chciwości, co odpowiedź FryAmTheEggman ... o wiele bardziej tekstowa w PowerShell ...
źródło