Você pode ter visto este em Die Hard: With a Vengeance ... Esta questão é baseada no famoso Jug Puzzle de 3 e 5 litros, mas com uma inclinação ligeiramente diferente.
Use um código que, quando fornecido um número inteiro entre 1 e 100, forneça as instruções mais rápidas para medir em um tanque, o número correspondente de litros de água de uma fonte, usando um jarro de 3 litros e um jarro de 5 litros.
Não há gradações em nenhum dos jarros; a fonte é abundante no suprimento de água e supõe-se que o tanque seja esvaziado no início de cada execução do código.
Você não pode acessar a água do tanque depois que ele entra no tanque.
O formato da execução é o seguinte:
Entrada:
4
por exemplo.
Resultado
Faça a saída de cada etapa numerada, conforme mostrado, seguido de uma contagem dos volumes do jarro de 5L, do jarro de 3L e do tanque. Formato Tally também mostrado abaixo. O número de etapas também deve ser emitido no final das etapas.
1) Fill 5L jug
5L: 5, 3L: 0, T: 0
2) Pour from 5L jug into 3L jug
5L: 2, 3L: 3, T: 0
3) Empty 3L jug
5L: 2, 3L: 0, T: 0
4) Pour from 5L jug into 3L jug
5L: 0, 3L: 2, T: 0
5) Fill 5L jug
5L: 5, 3L: 2, T: 0
6) Pour from 5L jug into 3L jug
5L: 4, 3L: 3, T: 0
7) Pour from 5L jug into tank
5L: 0, 3L: 3, T: 4
Volume measured out in 7 turns
Exemplo 2
Entrada: 8
Resultado:
1) Fill 5L jug
5L: 5, 3L: 0, T: 0
2) Pour from 5L jug into tank
5L: 0, 3L: 0, T: 5
3) Fill 3L jug
5L: 0, 3L: 3, T: 5
4) Pour from 3L jug into tank
5L: 0, 3L: 0, T: 8
Volume measured out in 4 turns
Convenções
Fill xL jug
- enche o jarro associado até o topo da fonteEmpty xL jug
- esvazia o conteúdo do jarro associado na fontePour from xL jug into yL jug
- Coloca o conteúdo do jarro xL no jarro yLPour from xL jug into tank
- Deita o conteúdo do jarro xL no tanque
O menor código vence.
fonte
Respostas:
Rubi,
407376365331324323Isso está ficando meio difícil de ler ...
Recebe entrada em STDIN. Exemplo de execução para N = 10:
fonte
T-SQL 2012:
14101302Outra tentativa quixotesca de fazer uma pergunta no SQL, mas essa ofereceu uma oportunidade agradável de brincar com algumas das novas opções de funções da janela na versão 2012. Além disso, explora CTEs recursivos, que podem não ser nada impressionantes na maioria das linguagens de programação, mas a recursão no SQL é como mudar de cavalo e buggy para uma Ferrari.
O mecanismo no centro disso está nas linhas 5 a 12, que usam um CTE recursivo e uma função de janela para criar uma tabela com a maioria dos números necessários para resolver o problema. Observe em particular o teste para 3, 4, 6 ou 9, que garante uma abordagem ideal da solução em 3s a partir desses números. (Tecnicamente, há um empate em 4 entre a abordagem de 3-1 e a de 2-2, mas dessa maneira, eu joguei muitos caracteres para mim.) Então é uma questão simples se juntar a uma tabela de pesquisa das etapas ideais para diferentes partes do problema e use outra função da janela para numerar corretamente as etapas.
Se você não tem o MS SQL por aí, brinque com ele no SQLFiddle.
Resultados para a entrada 42:
Editar:
Conseguiu uma melhoria decente na pontuação
fonte
Javascript: 481
Primeira tentativa de golfe, conselhos apreciados
Ele mexe com alguns números porque não verifica se é melhor derramar 3 ou 5, por exemplo: 9 dá 9 turnos em vez de 6, posso corrigi-lo mais tarde
Cole-o no console
De 553 a 481, graças a @WallyWest
fonte
n=["3L jug","5L jug","tank"];l=[0,0,0];t=[3,5,0];h=0;c=console;function e(d){l[d]=t[d];c.log(++h+") Fill "+n[d]);k()}function m(d,g){s=l[d];f=l[g];b=s+f>t[g];l[g]=b?t[g]:f+s;l[d]=b?s-(t[g]-f):0;c.log(++h+") Pour from "+n[d]+" into "+n[g]);k()}function k(){c.log("5L: "+l[1]+", 3L: "+l[0]+", T: "+l[2])}a=prompt();for(t[2]=a;4<a;)e(1),m(1,2),a-=5;2<a&&(e(0),m(0,2),a-=3);1<a&&(e(1),m(1,0),m(1,2),a=0);0<a&&(e(0),m(0,1),e(0),m(0,1),m(0,2));c.log("Volume measured out in "+h+" turns")
para 481 caracteres ...if
sJava, 610
Peguei a solução de Sumedh e joguei -a no golfe . Eu queria colocá-lo nos comentários, mas minha reputação não é suficiente :(. É um 40% menos, acho que deveria pelo menos ser compartilhado. Ainda está longe do começo ...
Aqui está não destruído:
Nota: funciona apenas na primeira execução. Execute-o novamente e o resultado estará errado (devido a uma variável global).
A versão a seguir é segura, mas perdemos 2 caracteres, passando de 610 para 612:
Saída de amostra para N = 69:
fonte
Java: 984
Aqui está o código
A entrada é da linha de comando. por exemplo: java X 4
fonte
main(String[]s)
,int n=Integer.parseInt(s[0]),t=0,c=0;
,java.io.PrintStream q=System.out;
. Além disso, pode ser possível escrever o primeirowhile
como um ou dois caracteres mais curtosfor
. Além disso, seusString
s são repetitivos; você pode tentar armazenar partes repetitivas em variáveis ou criar funções que as construam usando apenas uma pré-fabricadaString
.Python 2.7 - 437
Não é o código mais curto, mas acho que essa é a maneira mais ideal de resolver isso.
Como afirmei nos comentários, a maneira mais ideal de calcular isso:
divmod(amount,5)
. Isso fornecerá um de 4,3,2,1 como o restante.O que deixa 1 ou 2 como o restante. Use a solução ideal para qualquer um que possa ser conhecido antecipadamente como:
O código:
E uma saída para 4L em 7 etapas:
fonte
Smalltalk (Smalltalk / X),
568560516entrada em n:
garoto, esse é definitivamente o programa mais ofuscado que eu já escrevi ...
Edit: Alguns outros Smalltalks podem não permitir variáveis de área de trabalho autodeclaradas e você precisará anexar declarações. Também bindWith: pode ser diferente (expandWith: '<p>').
saída de amostra para n = 17:
fonte
C,
567609versão inválida anterior:
e aqui está o código degolfado:
fonte
C (
480465 bytes)Versão ideal (adiciona 10 bytes)
Provavelmente mais golfe aqui - as funções de saída estavam me matando. Isso deve fornecer a solução ideal (menor número de etapas). Semelhante a outro código aqui, ele preenche e esvazia jarros de 5L até ficar abaixo de 5 e depois muda para jarros de 3L. Ele testa 2 casos especiais (6 e 9) e se os encontrar muda para jarros de 3L. As instruções para obter 1L e 2L são codificadas.
Versão mais legível:
Editar% s:
Teste de saída para n = 11 (versão ideal):
fonte
T-SQL (2012):
794689580Inspirado na resposta T-SQL de @ Jonathan-Van-Matre em combinação com o algoritmo de @ Lego-Stormtroopr . Queria fazer isso porque gostei muito do desafio das 99 garrafas de cerveja .
Tentei manter as
OVER
funções window ( ) no mínimo, de preferência nas funções math / bool.A SQLFiddle está aqui .
Entrada:
11
Legível por humanos:
fonte
input = 8
input = 11
Python 3 (417 caracteres)
Explicado
Observe que temos 4 objetos, a saber, o jarro 3L, o jarro 5L, o tanque e a fonte. As únicas operações que podemos fazer é mover a água de um objeto
a
para outrob
. É isso que funçãoo(a, b)
faz no meu código: ele move a água, imprime e continua contando.Truques
N=['3L jug','5L jug','tank',0]
. Aqui eu preciso do último elemento a evitarIndexError
. Além disso, ele pode ser usado como a variável de contagem global, sem a amplaglobal
palavra-chave . Por exemplo,N[3] += 1
Como
0 <= a < 4, 0 <= b < 4
na funçãoo(a, b)
, podemos codificar(a, b)
em um dígito hexadecimal usando(a << 2) | b
e decodificá-lo usandodivmod(x, 4)
. Com esse truque, todas as 5 soluções (reminder=0, 1, 2, 3, 4
) podem ser codificadas em array['','c1c12','d46','c2','d434d46']
, que é um pouco menor que sua forma original:A=[ (), ((3,0),(0,1),(3,0),(0,1),(0,2)), ((3,1),(1,0),(1,2)), ((3,0),(0,2)), ((3,1),(1,0),(0,3),(1,0),(3,1),(1,0),(1,2)) ]
Saída de amostra (n = 17)
fonte
COBOL (IBM Enterprise COBOL) 192 linhas de 72 caracteres
Esta é uma prova de conceito para a pergunta e o início de uma para Golf-COBOL :-)
A pergunta pede o mais rápido. Então, implemente o paralelismo. Mesmo uma pessoa pode encher facilmente um jarro de 3 litros e um jarro de 5 litros ao mesmo tempo.
Simplesmente divida a entrada por oito, deixando também o restante. Faça alguns preenchimentos rápidos de 5L / 3L até o número exato de oito encaixes e, em seguida, lide com o restante dos sete a sete litros restantes.
O mais interessante do restante é para quatro litros. Fazê-lo como um litro mais três litros empurra muito menos água, apenas 18 litros vs 23 para as outras possibilidades.
O Código (trabalhando)
Isso gera uma carga absoluta de mensagens de diagnóstico para o código que começa no lugar errado e falta de pontos finais necessários.
Nenhum dos diagnósticos indica qualquer impacto no código do objeto. Portanto, apesar de ser um RC quebrado = 8, eu sei que o objeto estará OK, então o vinculei e o executei.
Aqui estão as saídas para um a oito litros. Depois disso, todos os resultados podem ser intuídos. 17 e 100 são incluídos como exemplos do paralelismo.
Ainda há muito a ser feito para reduzir o programa em caracteres, a saída correta foi a coisa mais importante primeiro. Contar os caracteres quando eles estão em linhas de comprimento fixo é outra coisa.
Saída de amostra:
fonte