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
Réponses:
Pyth,
191814 octets-1 octet par @FryAmTheEggman
Programme de 14 octets par @isaacg
Je prétends que le nombre de tartes qui peuvent être formées à partir d'une liste ascendante
[x1,x2,x3,x4,x5]
est:Ou en code:
[Voir l'historique des révisions pour les programmes TI-BASIC et APL]
Preuve d'exactitude
Laisser
Nous voulons montrer que
P(X)=floor(min(s5/3,s4/2,s3))
c'est toujours le plus grand nombre de tartes pour une listex1≤x2≤x3≤x4≤x5
de nombres de fruits 1 ~ 5.Premièrement, nous montrons que les trois nombres sont des bornes supérieures.
Puisqu'il y a un
s5
total de fruits, et chaque tarte a trois fruits,⌊s5/3⌋
c'est une limite supérieure.Puisqu'il y a des
s4
fruits qui ne sont pas des fruits 5 et qu'au moins deux fruits non 5 sont nécessaires dans chaque tarte,⌊s4/2⌋
c'est une limite supérieure.Puisqu'il y a des
s3
fruits qui ne sont ni des fruits 4 ni des fruits 5, et au moins un tel fruit est requis dans chaque tarte,s3
est une limite supérieure.Deuxièmement, nous montrons que la méthode de prélèvement des fruits des trois plus gros tas satisfait toujours la limite. Nous le faisons par induction.
Cas de base: 0 tartes peuvent évidemment être formées à partir de n'importe quelle liste valide avec
P(X)>=0
.Étape inductive: Étant donné n'importe quelle liste
X
oùP(X) > 0
, nous pouvons faire cuire une tarte, laissant derrière une listeX'
avecP(X') >= P(X)-1
. Nous faisons cela en prenant un fruit des trois plus gros tas3,4,5
, puis en recourant si nécessaire. Restez avec moi; il y a du travail.x2<x3
, alors nous n'avons pas besoin de trier la liste après avoir retiré les fruits. Nous avons déjà un valideX'
. Nous savons queP(X') = P(X)-1
parce ques5'
c'est 3 de moins (parce que trois fruits de type 1 ~ 5 ont été retirés),s4'
c'est 2 de moins, ets3'
1 de moins.P(X')
Est donc exactement un de moins que P (X).x3<x4
, alors nous avons fait de même.Maintenant, nous prenons le cas où
x2=x3=x4
. Nous devons réorganiser la liste cette fois.x5>x4
, alors nous réorganisons la liste en changeant les piles 4 et 2.s5'
ets4'
sommes toujours une diminution de 3 et 2 respectivement, maiss3'=s3-2
. Ce n'est pas un problème, car six2=x3=x4
, alors2*x4<=s3
->2*x4+s3 <= 2*s3
->(x4 + s4)/2 <= s3
. Nous avons deux sous-cas:L'égalité, c'est
(x4,x3,x2,x1)=(1,1,1,0)
-à- dire , dans ce casP(X)
=1
et nous pouvons clairement faire une tarte à partir de tas5,4,3
, ou:(s4+1)/2 <= s3
, auquel cas une diminutions4
supplémentaire1
ne signifie pas une diminution supplémentaire de P (X).Maintenant, nous nous retrouvons avec le cas où
x1<x2=x3=x4=x5
. Maintenant,s3
sera également diminué de 1, nous devons(s5/3+1)
donc être<=s4/2
; c'est-à-dire8x5+2x1+2<=9x5+3x1
, oux5+x1>=2
. Tous les cas plus petits que cela peuvent être vérifiés manuellement.Si chaque nombre est égal, il est clair que nous pouvons atteindre la limite de
⌊s5/3⌋
, qui est toujours inférieure aux deux autres - nous passons simplement par les nombres en séquence.Enfin, nous avons terminé. Veuillez commenter si je manque quelque chose, et je donnerai une petite prime pour une preuve plus élégante.
la source
JSQhS/Ls~PJ_S3
n
ingrédients et lesk
ingrédients par tarte, mais c'est trop long pour cette boîte de commentaire . Veuillez signaler toutes les erreurs que vous pourriez trouver, afin que nous puissions prouver cela.CJam, 34
Essayez-le en ligne
Explication:
la source
Haskell, 62 octets
Cela définit une fonction
f
qui prend la liste des fruitsx
et renvoie le nombre maximum de tartes.Explication
Nous calculons le nombre de tartes de manière récursive. La partie est
mapM(\a->a:[a-1|a>0])x
évaluée à la liste de toutes les listes obtenues à partirx
de la décrémentation des entrées positives. Six = [0,1,2]
cela se traduit parLa partie entre l'extérieur
[]
est une compréhension de liste: nous parcourons touty
dans la liste ci-dessus et filtrons ceux dont la somme n'est pas égalesum(x)-3
, nous obtenons donc toutes les listes où 3 fruits différents ont été transformés en tarte. Ensuite, nous évaluons récursivementf
sur ces listes, ajoutons1
à chacune et prenons le maximum d'entre elles et0
(le cas de base, si nous ne pouvons pas faire de tartes).la source
C #, 67
Faites récursivement une tarte par itération avec les fruits que vous avez le plus jusqu'à épuisement.
Cas de test ici
la source
p[2]--
en même temps que la vérificationp[2]>-1
?Pyth, 29
Suite de tests
Trie la liste d'entrée et supprime les zéros. Ensuite, tant que vous avez 3 fruits, décrémentez le premier et les deux derniers éléments, et ajoutez les éléments restants à la liste, avant de la trier et de supprimer à nouveau les zéros. Incrémentez ensuite un compteur de 1.
C'est en fait assez rapide tant qu'il n'y a que 5 fruits, cela peut résoudre pour de très grandes corbeilles de fruits, c'est-
1000,1000,1000,1000,1000
à- dire en moins d'une seconde.la source
Python, solution générale,
12892 octets-36 octets de @xnor, vous da mvp réel
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)
Cela fonctionne tant que ma preuve est correcte. Si ce n'est pas le cas, faites-moi savoir pourquoi afin que je puisse essayer de le réparer. Si c'est incompréhensible, faites-le moi savoir et je l'attaquerai après quelques tasses de café.
la source
Python 2, 78 octets
Prendre 5 nombres en entrée:
918988 octetsModifier : la modification
s=sorted([input()for x in[0]*5])
pars=sorted(map(input,['']*5));x=0
enregistre 1 octet.Prend 5 chiffres en entrée et imprime le nombre de tartes possibles qui peuvent être faites. Il adopte la même approche que la réponse de Reto Koradi - sans améliorer le nombre d'octets - mais il semblait que cette question manquait de réponse en Python.
Merci @ThomasKwa et @xsot pour votre suggestion.
Comment ça marche
Notez que la variable
x
n'est jamais définie, mais le programme profite d'une fuite de python 2.7. Lors de la définition de la listes
avec compréhension de la liste, la dernière valeur de l'itérable ([0]*5
dans ce cas) est stockée dans la variable utilisée pour l'itération.Pour rendre les choses plus claires:
Prendre une liste en entrée: 78 octets
Merci @xnor @xsot et @ThomasKwa d'avoir suggéré de changer l'entrée en liste.
Comment ça marche
Il fonctionne de la même manière que le code ci-dessus, mais dans ce cas, l'entrée est déjà une liste, il n'est donc pas nécessaire de la créer et une variable
x
doit être définie.Avis de non-responsabilité: il s'agit de ma première tentative de golf et il me semble qu'il peut toujours être joué, alors suggérez toutes les modifications qui pourraient être apportées afin de réduire le nombre d'octets.
la source
s[2]>0
->s[2]
, car le nombre dans la pile est toujours non négatif.s=sorted(input())
. En outre, votre nombre d'octets actuel est de 89; les sauts de ligne comptent comme un seul caractère.s=sorted(map(input,['']*5));x=0
.CJam, 23 octets
Essayez-le en ligne
Cela prend des fruits des 3 plus gros tas de chaque itération et compte le nombre d'itérations.
Je n'ai pas de preuve mathématique que cela donne toujours le bon résultat. C'est le cas pour les exemples de test donnés, et je pense que cela fonctionne pour tous les cas jusqu'à ce que quelqu'un me donne un contre-exemple.
L'explication intuitive que j'ai utilisée pour me convaincre: Pour maximiser le nombre de tartes, vous devez garder autant de piles non vides que possible. C'est parce que vous perdez la possibilité de faire plus de tartes dès que vous avez 3 piles ou plus vides.
Ceci est réalisé en prenant toujours des fruits des plus gros tas. Je ne peux pas penser à un cas où prendre des fruits d'un plus petit tas conduirait à une meilleure situation que de prendre des fruits d'un plus gros tas.
J'ai un raisonnement un peu plus formel dans ma tête. Je vais essayer de trouver un moyen de le mettre en mots / formule.
la source
> <>, 76 octets
Il s'avère que le tri dans> <> n'est pas facile! Ce programme s'appuie sur la preuve avancée par Thomas Kwa pour être vraie, ce qui semble certainement être le cas avec les cas de test.
Les 5 numéros d'entrée devraient être présents sur la pile au début du programme.
Les deux premières lignes trient les nombres sur la pile et la troisième effectue le calcul
floor(min((x1+x2+x3+x4+x5)/3,(x1+x2+x3+x4)/2,x1+x2+x3))
, tiré de la réponse de Thomas.la source
Python 2, 59 octets
Une méthode générale qui fonctionne pour tout
n
etk
. Lek=3
rend les fruits par tarte par défaut à 3, mais vous pouvez passer une valeur différente. La récursivité utilise le fait que les chaînes sont plus grandes que les nombres en Python 2, laissant la chaîne vide représenter le cas de base de l'infini.Cette méthode utilise le fait que toujours prendre le fruit le plus commun est optimal, donc nous considérons chaque rang de fruit possible comme un facteur limitant. J'ai repris ce fait ci-dessous.
La preuve de Mego m'a fait penser à cette preuve plus directe que la prise répétée des fruits les plus courants est optimale. Ceci est indiqué avec des tartes de
k
fruits.Théorème: Prendre à plusieurs reprises le
k
des fruits plus courants donne le nombre optimal de tartes.Preuve: Nous montrerons que si les
N
tartes sont possibles, la stratégie de fruits la plus courante produit au moins desN
tartes. Nous le faisons en changeant les fruits entre lesN
tartes pour les faire correspondre à ceux produits par cette stratégie, tout en gardant les tartes valides.Faisons en sorte que la première tarte (appelez-la
p
) contienne les fruits les plus courants. Si ce n'est pas encore fait, il doit contenir un fruiti
, mais pas un fruit plus communj
. Ensuite, les tartes restantes ont strictement plus de fruitsj
que de fruitsi
, et donc une autre tarteq
doit contenirj
mais pasi
. Ensuite, nous pouvons échanger des fruitsi
de tartep
avec des fruitsj
de tarteq
, ce qui permet auxN
tartes d'avoir des fruits distincts.Répétez ce processus jusqu'à ce que
p
lek
fruits soient plus courants.Ensuite, mettez la tarte de
p
côté et répétez ce processus pour la prochaine tarte pour lui donner les fruits restants les plus courants. Continuez ainsi jusqu'à ce que les tartes soient la séquence produite par la stratégie de fruits la plus courante.la source
PowerShell, 92 octets
Utilise le même algorithme gourmand que la réponse de FryAmTheEggman ... juste beaucoup plus verbeux dans PowerShell ....
la source