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
Testfall die Ausgabe ergeben: 4.Antworten:
Pyth,
191814 Bytes-1 Byte von @FryAmTheEggman
14-Byte-Programm von @isaacg
Ich behaupte, dass die Anzahl der Kuchen, die aus einer aufsteigenden Liste gebildet werden können,
[x1,x2,x3,x4,x5]
ist:Oder im Code:
[Siehe Versionsverlauf für TI-BASIC- und APL-Programme]
Beweis der Richtigkeit
Lassen
Wir wollen zeigen, dass
P(X)=floor(min(s5/3,s4/2,s3))
immer die größte Anzahl von Torten für eine Listex1≤x2≤x3≤x4≤x5
von Anzahl von Früchten 1 ~ 5 ist.Zunächst zeigen wir, dass alle drei Zahlen obere Schranken sind.
Da es
s5
insgesamt Früchte gibt und jeder Kuchen drei Früchte hat,⌊s5/3⌋
ist eine Obergrenze.Da es
s4
Früchte gibt, die nicht Frucht 5 sind, und in jeder Torte mindestens zwei Nicht-5-Früchte erforderlich sind,⌊s4/2⌋
ist eine Obergrenze.Da es
s3
Früchte gibt, die weder Frucht 4 noch Frucht 5 sind und in jeder Torte mindestens eine solche Frucht erforderlichs3
ist , ist eine Obergrenze.Zweitens zeigen wir, dass die Methode, Früchte von den drei größten Haufen zu nehmen, immer die Grenze erfüllt. Wir machen das durch Induktion.
Basisfall: Aus jeder gültigen Liste mit können natürlich 0 Torten gebildet werden
P(X)>=0
.Induktionsschritt: jede Liste gegeben ,
X
woP(X) > 0
können wir einen Kuchen backen, hinter einer Liste zu verlassenX'
mitP(X') >= P(X)-1
. Wir tun dies, indem wir eine Frucht von den drei größten Haufen nehmen3,4,5
und bei Bedarf erneut greifen . Trage mit mir; Es gibt ein paar Fälle.x2<x3
ja, müssen wir die Liste nach dem Entfernen der Früchte nicht sortieren. Wir haben bereits eine gültigeX'
. Wir wissen , dassP(X') = P(X)-1
das5'
drei weniger ist (weil drei Früchte vom Typ 1 bis 5 entfernt wurden),s4'
2 weniger ist, unds3'
ist 1 weniger. IstP(X')
also genau eins weniger als P (X).x3<x4
, dann sind wir ähnlich fertig.Nun nehmen wir den Fall wo
x2=x3=x4
. Diesmal müssen wir die Liste neu ordnen.x5>x4
, dann ordnen wir die Liste von Pfählen 4 und 2. Schaltens5'
unds4'
sind immer noch ein Rückgang von 3 bzw. 2, abers3'=s3-2
. Das ist kein Problem, denn wennx2=x3=x4
, dann2*x4<=s3
->2*x4+s3 <= 2*s3
->(x4 + s4)/2 <= s3
. Wir haben zwei Unterfälle:Gleichheit, dh
(x4,x3,x2,x1)=(1,1,1,0)
in welchem FallP(X)
=1
und wir können eindeutig einen Kuchen aus Haufen machen5,4,3
, oder:(s4+1)/2 <= s3
In diesem Fall bedeutet das Verringerns4
um ein Extra1
kein zusätzliches Verringern auf P (X).Jetzt bleiben wir bei dem Fall, wo
x1<x2=x3=x4=x5
. Jetzts3
wird auch um 1 verringert, also müssen wir(s5/3+1)
sein<=s4/2
; das heißt8x5+2x1+2<=9x5+3x1
, oderx5+x1>=2
. Alle kleineren Fälle können manuell überprüft werden.Wenn jede Zahl gleich ist, ist es klar, dass wir die Grenze von erreichen können
⌊s5/3⌋
, die immer kleiner ist als die beiden anderen - wir gehen die Zahlen einfach der Reihe nach durch.Endlich sind wir fertig. Bitte kommentieren Sie, wenn mir etwas fehlt, und ich werde ein kleines Kopfgeld für einen eleganteren Beweis geben.
quelle
JSQhS/Ls~PJ_S3
n
Zutaten undk
Zutaten pro Torte gefunden, aber für dieses Kommentarfeld ist es zu lang . Bitte machen Sie auf eventuelle Fehler aufmerksam, damit wir diese nachweisen können.CJam, 34
Probieren Sie es online aus
Erläuterung:
quelle
Haskell, 62 Bytes
Dies definiert eine Funktion
f
, die die Fruchtliste aufnimmtx
und die maximale Anzahl von Torten zurückgibt.Erläuterung
Wir berechnen die Anzahl der Torten rekursiv. Der Teil
mapM(\a->a:[a-1|a>0])x
wertet alle Listen aus, diex
durch Dekrementieren aller positiven Einträge erhalten wurden. Wennx = [0,1,2]
, ergibt sichDer Teil zwischen dem Äußeren
[]
ist ein Listenverständnis: Wir durchlaufen alley
oben genannten Listen und filtern diejenigen heraus, deren Summe nicht gleich istsum(x)-3
, sodass wir alle Listen erhalten, in denen 3 verschiedene Früchte zu einer Torte verarbeitet wurden. Dann werten wirf
diese Listen rekursiv aus , addieren1
sie und nehmen das Maximum von ihnen und0
(der Grundfall, wenn wir keine Torten machen können).quelle
C #, 67
Bilden Sie rekursiv eine Torte pro Iteration mit Früchten, die Sie am meisten haben, bis Sie ausgehen.
Testfälle hier
quelle
p[2]--
gleichzeitig mit der Überprüfung tunp[2]>-1
?Pyth, 29
Testsuite
Sortiert die Eingabeliste und entfernt Nullen. Verringern Sie dann, solange Sie 3 Früchte haben, das erste und die beiden letzten Elemente und fügen Sie die verbleibenden Elemente zur Liste hinzu, bevor Sie sie sortieren und die Nullen wieder entfernen. Dann inkrementiere einen Zähler um 1.
Dies ist eigentlich ziemlich schnell, solange es nur 5 Früchte gibt, es kann für sehr große Fruchtbehälter, dh
1000,1000,1000,1000,1000
in weniger als einer Sekunde, aufgelöst werden.quelle
Python, allgemeine Lösung,
12892 Bytes-36 Bytes von @xnor, du bist ein richtiger 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)
Dies funktioniert solange mein Beweis korrekt ist. Wenn dies nicht der Fall ist, lassen Sie mich wissen, warum, damit ich versuchen kann, das Problem zu beheben. Wenn es unverständlich ist, lassen Sie es mich wissen, und ich werde es nach ein paar Tassen Kaffee angreifen.
quelle
Python 2, 78 Bytes
Eingabe von 5 Zahlen:
918988 BytesBearbeiten : Durch Ändern
s=sorted([input()for x in[0]*5])
von wirds=sorted(map(input,['']*5));x=0
1 Byte gespeichert.Nimmt 5 Zahlen als Eingabe und druckt die Anzahl der möglichen Kuchen, die gemacht werden können. Es folgt dem gleichen Ansatz wie die Antwort von Reto Koradi - ohne die Anzahl der Bytes zu verbessern -, aber es schien, als würde diese Frage in Python nicht beantwortet.
Vielen Dank an @ThomasKwa und @xsot für Ihren Vorschlag.
Wie es funktioniert
Beachten Sie, dass die Variable
x
niemals definiert wird, das Programm jedoch die Vorteile von Python 2.7 nutzt. Bei der Definition der Listes
mit Listenverständnis wird der letzte Wert in der Iterationsdatei ([0]*5
in diesem Fall) in der zum Iterieren verwendeten Variablen gespeichert.Um die Dinge klarer zu machen:
Eingabe einer Liste: 78 Bytes
Vielen Dank an @xnor @xsot und @ThomasKwa für den Vorschlag, die Eingabe in eine Liste zu ändern.
Wie es funktioniert
Es funktioniert genauso wie der obige Code, aber in diesem Fall ist die Eingabe bereits eine Liste, sodass es nicht erforderlich ist, sie zu erstellen, und eine Variable
x
muss definiert werden.Haftungsausschluss: Dies ist mein erster Versuch, Golf zu spielen, und ich habe das Gefühl, er kann noch gespielt werden. Schlagen Sie daher Änderungen vor, die vorgenommen werden könnten, um die Anzahl der Bytes zu verringern.
quelle
s[2]>0
->s[2]
, da die Zahl im Stapel immer nicht negativ ist.s=sorted(input())
. Außerdem beträgt Ihre aktuelle Byteanzahl 89; Zeilenumbrüche gelten als einzelnes Zeichen.s=sorted(map(input,['']*5));x=0
.CJam, 23 Bytes
Probieren Sie es online aus
Dies entnimmt den drei größten Haufen in jeder Iteration Früchte und zählt die Anzahl der Iterationen.
Ich habe keinen mathematischen Beweis dafür, dass dies immer das richtige Ergebnis liefert. Dies gilt für die angegebenen Testbeispiele, und ich glaube, dass dies in allen Fällen funktioniert, bis mir jemand ein Gegenbeispiel gibt.
Die intuitive Erklärung, die ich verwendet habe, um mich selbst zu überzeugen: Um die Anzahl der Kuchen zu maximieren, müssen Sie so viele Stapel wie möglich nicht leer halten. Das liegt daran, dass Sie die Fähigkeit verlieren, mehr Kuchen zu machen, sobald Sie 3 oder mehr leere Stapel haben.
Dies wird erreicht, indem die Früchte immer von den größten Haufen genommen werden. Ich kann mir keinen Fall vorstellen, in dem die Entnahme von Obst von einem kleineren Stapel zu einer besseren Situation führen würde als die Entnahme von Obst von einem größeren Stapel.
Ich habe etwas formelleres Denken im Kopf. Ich werde versuchen, einen Weg zu finden, um es in Worte / Formeln zu fassen.
quelle
> <> 76 Bytes
Es stellte sich heraus, dass das Sortieren in> <> nicht einfach ist! Dieses Programm stützt sich auf den von Thomas Kwa vorgebrachten Beweis für die Richtigkeit, was bei den Testfällen sicherlich der Fall zu sein scheint.
Es wird erwartet, dass die 5 Eingabenummern beim Programmstart auf dem Stapel vorhanden sind.
Die ersten beiden Zeilen sortieren die Zahlen auf dem Stapel, und die dritte Zeile berechnet
floor(min((x1+x2+x3+x4+x5)/3,(x1+x2+x3+x4)/2,x1+x2+x3))
sie anhand der Antwort von Thomas.quelle
Python 2, 59 Bytes
Eine allgemeine Methode, die für alle
n
und funktioniertk
. Dask=3
macht die Früchte pro Torte Standard bis 3, aber Sie in einem anderen Wert passieren können. Die Rekursion verwendet die Tatsache, dass Zeichenfolgen in Python 2 größer als Zahlen sind, sodass die leere Zeichenfolge den Grundfall der Unendlichkeit darstellt.Diese Methode nutzt die Tatsache, dass es immer optimal ist, die am häufigsten vorkommenden Früchte zu nehmen. Daher betrachten wir jeden möglichen Rang der Früchte als begrenzenden Faktor. Ich habe diese Tatsache weiter unten widerlegt.
Megos Beweis ließ mich an diesen direkteren Beweis denken, dass die wiederholte Einnahme der häufigsten Früchte optimal ist. Dies wird mit Obstkuchen angegeben
k
.Satz: Wiederholtes Nehmen der
k
häufigsten Früchte ergibt die optimale Anzahl von Torten.Beweis: Wir werden zeigen, dass wenn
N
Kuchen möglich sind, die gängigste Fruchtstrategie mindestensN
Kuchen hervorbringt . Wir tun dies, indem wir die Früchte zwischen denN
Torten vertauschen, um sie mit denen dieser Strategie in Einklang zu bringen und gleichzeitig die Gültigkeit der Torten zu erhalten.Lassen Sie es uns so machen, dass der erste Kuchen (nennen wir es
p
) die häufigsten Früchte enthält. Wenn dies noch nicht der Fall ist, muss es eine Frucht enthalteni
, aber keine häufigere Fruchtj
. Dann haben die restlichen Torten streng mehr Obstj
als Obsti
, und so muss eine andere Torteq
enthalten,j
aber nichti
. Dann können wir Obsti
vom Kuchenp
gegen Obst tauschenj
vom Kuchenq
, wodurchN
Kuchen mit unterschiedlichen Früchten erhalten bleiben.Wiederholen Sie diesen Vorgang bis
p
diek
häufigsten Früchte haben.Legen Sie dann die Torte
p
beiseite und wiederholen Sie diesen Vorgang für die nächste Torte, damit sie die häufigsten verbleibenden Früchte enthält. Machen Sie so lange weiter, bis die Torten die Sequenz sind, die mit der gängigsten Fruchtstrategie erstellt wurde.quelle
PowerShell, 92 Bytes
Verwendet denselben gierigen Algorithmus wie die Antwort von FryAmTheEggman ... nur viel wortreicher in PowerShell ....
quelle