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
caso de prueba debería producir la salida: 4.Respuestas:
Pyth,
191814 bytes-1 byte por @FryAmTheEggman
Programa de 14 bytes por @isaacg
Afirmo que el número de pasteles que se pueden formar a partir de una lista ascendente
[x1,x2,x3,x4,x5]
es:O en código:
[Vea el historial de revisiones para los programas TI-BASIC y APL]
Prueba de corrección
Dejar
Queremos demostrar que
P(X)=floor(min(s5/3,s4/2,s3))
siempre es el mayor número de pasteles para una listax1≤x2≤x3≤x4≤x5
de números de frutas 1 ~ 5.Primero, mostramos que los tres números son límites superiores.
Dado que hay
s5
frutas totales, y cada pastel tiene tres frutas,⌊s5/3⌋
es un límite superior.Dado que hay
s4
frutas que no son frutas 5, y se requieren al menos dos frutas que no son 5 en cada pastel,⌊s4/2⌋
es un límite superior.Como hay
s3
frutas que no son ni fruta 4 ni fruta 5, y se requiere al menos una de esas frutas en cada pastel,s3
es un límite superior.En segundo lugar, mostramos que el método de tomar frutos de las tres pilas más grandes siempre satisface el límite. Hacemos esto por inducción.
Caso base: obviamente, se pueden formar 0 pasteles a partir de cualquier lista válida con
P(X)>=0
.Paso inductivo: dada cualquier lista
X
dondeP(X) > 0
, podemos hornear un pastel, dejando una listaX'
conP(X') >= P(X)-1
. Hacemos esto tomando una fruta de las tres pilas más grandes3,4,5
y luego recurriendo si es necesario. Tengan paciencia conmigo; Hay algunos casos.x2<x3
, entonces no necesitamos ordenar la lista después de eliminar las frutas. Ya tenemos un válidoX'
. Sabemos queP(X') = P(X)-1
porques5'
es 3 menos (porque se eliminaron tres frutas de tipo 1 ~ 5),s4'
es 2 menos ys3'
es 1 menos. EntoncesP(X')
es exactamente uno menos que P (X).x3<x4
, entonces hemos terminado de manera similar.Ahora tomamos el caso donde
x2=x3=x4
. Tendremos que reorganizar la lista esta vez.x5>x4
, entonces reorganizamos la lista cambiando las pilas 4 y 2.s5'
ys4'
todavía hay una disminución de 3 y 2 respectivamente, peros3'=s3-2
. Esto no es un problema, porque six2=x3=x4
, entonces2*x4<=s3
->2*x4+s3 <= 2*s3
->(x4 + s4)/2 <= s3
. Tenemos dos subcajas:Igualdad, es decir
(x4,x3,x2,x1)=(1,1,1,0)
, en cuyo casoP(X)
=1
y claramente podemos hacer un pastel a partir de pilas5,4,3
, o:(s4+1)/2 <= s3
, en cuyo caso una disminucións4
adicional1
no significa una disminución adicional a P (X).Ahora nos quedamos con el caso donde
x1<x2=x3=x4=x5
. Ahoras3
también se reducirá en 1, por lo que debemos(s5/3+1)
ser<=s4/2
; es decir8x5+2x1+2<=9x5+3x1
, ox5+x1>=2
. Todos los casos más pequeños que esto se pueden verificar manualmente.Si cada número es igual, está claro que podemos lograr el límite de
⌊s5/3⌋
, que siempre es menor que los otros dos; simplemente pasamos por los números en secuencia.Finalmente hemos terminado. Comente si me falta algo, y le daré una pequeña recompensa por una prueba más elegante.
fuente
JSQhS/Ls~PJ_S3
n
ingredientes ek
ingredientes por pastel, pero es demasiado largo para este cuadro de comentarios . Señale cualquier error que pueda encontrar para que podamos probarlo.CJam, 34
Pruébalo en línea
Explicación:
fuente
Haskell, 62 bytes
Esto define una función
f
que toma en la lista de frutasx
y devuelve el número máximo de pasteles.Explicación
Calculamos el número de pasteles de forma recursiva. La parte se
mapM(\a->a:[a-1|a>0])x
evalúa en la lista de todas las listas obtenidasx
al disminuir cualquier entrada positiva. Six = [0,1,2]
, resulta enLa parte entre el exterior
[]
es una comprensión de la lista: iteramos a través de todoy
en la lista anterior y filtramos aquellos cuya suma no es igualsum(x)-3
, por lo que obtenemos todas las listas donde se han hecho 3 frutas diferentes en un pastel. Luego evaluamos recursivamentef
en estas listas, agregamos1
a cada una y tomamos el máximo de ellas y0
(el caso base, si no podemos hacer pasteles).fuente
C #, 67
Recurrentemente haga un pastel por iteración con las frutas que tenga más hasta que se acabe.
Prueba casos aquí
fuente
p[2]--
al mismo tiempo que la comprobaciónp[2]>-1
?Pyth, 29
Banco de pruebas
Ordena la lista de entrada y elimina los ceros. Luego, siempre que tenga 3 frutas, disminuya el primero y los dos últimos elementos, y agregue los elementos restantes a la lista, antes de ordenarlos y eliminar ceros nuevamente. Luego incremente un contador en 1.
En realidad, esto es bastante rápido siempre que solo haya 5 frutas, puede resolver contenedores de frutas muy grandes, es decir,
1000,1000,1000,1000,1000
en menos de un segundo.fuente
Python, solución general,
12892 bytes-36 bytes de @xnor, eres un verdadero 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)
Esto funciona siempre que mi prueba sea correcta. Si no es así, avíseme por qué para intentar solucionarlo. Si es incomprensible, avíseme y lo atacaré después de unas tazas de café.
fuente
Python 2, 78 bytes
Tomando 5 números como entrada:
91 918988 bytesEditar : Cambio
s=sorted([input()for x in[0]*5])
pors=sorted(map(input,['']*5));x=0
guardar 1 byte.Toma 5 números como entrada e imprime el número de pasteles posibles que se pueden hacer. Toma el mismo enfoque que la respuesta de Reto Koradi -sin mejorar el conteo de bytes- pero parecía que a esta pregunta le faltaba una respuesta en Python.
Gracias @ThomasKwa y @xsot por su sugerencia.
Cómo funciona
Tenga en cuenta que la variable
x
nunca se define, pero el programa aprovecha algunas fugas que tiene Python 2.7. Al definir la listas
con la comprensión de la lista, el último valor en el iterable ([0]*5
en este caso) se almacena en la variable utilizada para iterar.Para aclarar las cosas:
Tomando una lista como entrada: 78 bytes
Gracias @xnor @xsot y @ThomasKwa por sugerir cambiar la entrada a una lista.
Cómo funciona
Funciona de la misma manera que el código anterior, pero en este caso la entrada ya es una lista, por lo que no es necesario crearla y
x
se debe definir la variable .Descargo de responsabilidad: este es mi primer intento de jugar al golf y parece que todavía se puede jugar al golf, así que sugiera cualquier cambio que pueda hacerse para reducir el conteo de bytes.
fuente
s[2]>0
->s[2]
, ya que el número en la pila siempre es no negativo.s=sorted(input())
. Además, su recuento de bytes actual es 89; las nuevas líneas cuentan como un solo personaje.s=sorted(map(input,['']*5));x=0
.CJam, 23 bytes
Pruébalo en línea
Esto toma fruto de las 3 pilas más grandes en cada iteración, y cuenta el número de iteraciones.
No tengo una prueba matemática de que esto siempre dé el resultado correcto. Lo hace para los ejemplos de prueba dados, y creo que funciona para todos los casos hasta que alguien me dé un contraejemplo.
La explicación intuitiva que utilicé para convencerme a mí mismo: para maximizar el número de pasteles, debe mantener tantas pilas no vacías como sea posible. Esto se debe a que pierde la capacidad de hacer más pasteles tan pronto como tenga 3 o más pilas vacías.
Esto se logra tomando siempre fruta de las pilas más grandes. No puedo pensar en un caso en el que tomar fruta de una pila más pequeña conduzca a una situación mejor que tomar fruta de una pila más grande.
Tengo un razonamiento un poco más formal en mi cabeza. Trataré de pensar en una forma de ponerlo en palabras / fórmula.
fuente
> <>, 76 bytes
Resulta que ordenar en> <> no es fácil. Este programa se basa en la prueba presentada por Thomas Kwa para ser cierta, que ciertamente parece ser el caso con los casos de prueba.
Se espera que los 5 números de entrada estén presentes en la pila al inicio del programa.
Las primeras dos líneas clasifican los números en la pila, y la tercera realiza el cálculo
floor(min((x1+x2+x3+x4+x5)/3,(x1+x2+x3+x4)/2,x1+x2+x3))
, tomado de la respuesta de Thomas.fuente
Python 2, 59 bytes
Un método general que funciona para cualquier
n
yk
. Estok=3
hace que las frutas por pastel sean predeterminadas a 3, pero puede pasar un valor diferente. La recursión utiliza el hecho de que las cadenas son más grandes que los números en Python 2, dejando que la cadena vacía represente el caso base del infinito.Este método utiliza el hecho de que tomar siempre la fruta más común es óptimo, por lo que consideramos cada posible rango de fruta como un factor limitante. He reprendido ese hecho a continuación.
La prueba de Mego me hizo pensar en esta prueba más directa de que tomar repetidamente las frutas más comunes es óptimo. Esto se afirma con pasteles de
k
frutas.Teorema: tomar repetidamente las
k
frutas más comunes da la cantidad óptima de pasteles.Prueba: demostraremos que si los
N
pasteles son posibles, entonces la estrategia de fruta más común produce al menosN
pasteles. Hacemos esto cambiando las frutas entre losN
pasteles para que coincidan con los producidos por esta estrategia, mientras mantenemos los pasteles válidos.Hagamos que el primer pastel (llámelo
p
) contenga las frutas más comunes. Si aún no lo hace, debe contener una frutai
, pero no una fruta más comúnj
. Entonces, los pasteles restantes tienen estrictamente más frutaj
que frutai
, por lo que otros pastelesq
deben contenerj
pero noi
. Luego, podemos intercambiar frutai
de pastelp
por frutaj
de pastelq
, lo que hace que losN
pasteles tengan fruta distinta.Repita este proceso hasta que
p
tenga lask
frutas más comunes.Luego, ponga el pastel a
p
un lado y repita este proceso para el próximo pastel para que tenga las frutas restantes más comunes. Siga haciendo esto hasta que los pasteles sean la secuencia producida por la estrategia de fruta más común.fuente
PowerShell, 92 bytes
Utiliza el mismo algoritmo basado en la codicia que la respuesta de FryAmTheEggman ... pero mucho más eficaz en PowerShell ...
fuente