Vous avez peut-être vu celui-ci dans Die Hard: With a Vengeance ... Cette question est basée sur le célèbre Jug Puzzle de 3 et 5 litres, mais avec une inclinaison légèrement différente.
Montez un code qui, lorsqu'il est donné un entier entre 1 et 100, vous fournira les instructions les plus rapides pour mesurer dans un réservoir, le nombre correspondant de litres d'eau d'une fontaine, en utilisant un pot de 3 litres et un pot de 5 litres.
Il n'y a pas de gradations sur les deux cruches; la fontaine est abondante en eau et le réservoir est censé être vidé au début de chaque exécution du code.
Vous ne pouvez pas accéder à l'eau du réservoir une fois qu'elle entre dans le réservoir.
Le format d'exécution est le suivant:
Contribution:
4
par exemple.
Production
Sortez chaque étape numérotée, comme indiqué, suivi d'un décompte des volumes du pichet 5L, du pichet 3L et du réservoir. Format de comptage également indiqué ci-dessous. Le nombre d'étapes doit également être sorti à la fin des étapes.
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
Exemple 2
Contribution: 8
Production:
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
Conventions
Fill xL jug
- remplit la cruche associée vers le haut depuis la fontaineEmpty xL jug
- vide le contenu de la cruche associée dans la fontainePour from xL jug into yL jug
- Verse le contenu de la verseuse xL dans la verseuse yLPour from xL jug into tank
- Verse le contenu du pichet xL dans le réservoir
Le code le plus court gagne.
la source
Réponses:
Rubis,
407376365331324323Cela devient un peu difficile à lire ...
Prend entrée sur STDIN. Exemple d'exécution pour N = 10:
la source
T-SQL 2012:
14101302Une autre tentative quixotique à une question dans SQL, mais celle-ci a offert une occasion agréable de jouer avec certaines des nouvelles options de fonction de fenêtre dans la version 2012. En outre, il exploite les CTE récursifs, qui ne sont peut-être pas impressionnants dans la plupart des langages de programmation, mais la récursivité en SQL, c'est comme passer du cheval et du buggy à une Ferrari.
Le moteur au cœur de ceci est dans les lignes 5-12, qui utilise un CTE récursif et une fonction de fenêtre pour construire un tableau de la plupart des nombres nécessaires pour résoudre le problème. Notons en particulier le test pour 3, 4, 6 ou 9, qui assure une approche optimale de la solution par 3s à partir de ces nombres. (Techniquement, c'est une égalité pour 4 entre l'approche 3-1 et le 2-2, mais le faire de cette façon m'a fait jouer beaucoup de personnages.) Ensuite, il est simple de se joindre à une table de recherche des étapes optimales pour différents des morceaux du problème et utiliser une autre fonction de fenêtre pour numéroter correctement les étapes.
Si vous ne disposez pas de MS SQL, jouez avec lui sur SQLFiddle.
Résultats pour l'entrée 42:
Éditer:
Amélioré le score décent par
la source
Javascript: 481
Première tentative de golf, conseils appréciés
Il dérange certains chiffres car il ne vérifie pas s'il vaut mieux en verser 3 ou 5, exemple: 9 donne 9 tours au lieu de 6, je pourrais le réparer plus tard
Collez-le dans la console
De 553 à 481 grâce à @WallyWest
la source
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")
pour 481 caractères ...if
sJava, 610
J'ai pris la solution de Sumedh et l' . Je voulais le mettre dans les commentaires mais ma réputation ne suffit pas :(. C'est un 40% de moins, je pense qu'il faudrait au moins le partager. Encore loin d'être le premier quand même ...
Voici non golfé:
NB: cela ne fonctionne que sur la première manche. Réexécutez-le et le résultat sera erroné (en raison d'une variable globale).
La version suivante est sûre, mais nous perdons 2 caractères, passant de 610 à 612:
Exemple de sortie pour N = 69:
la source
Java: 984
Voici le code
L'entrée provient de la ligne de commande. par exemple: java X 4
la source
main(String[]s)
,int n=Integer.parseInt(s[0]),t=0,c=0;
,java.io.PrintStream q=System.out;
. En outre, il peut être possible d'écrire le premierwhile
en un ou deux caractères plus courtsfor
. De plus, vosString
s sont répétitifs, vous pouvez essayer de stocker des parties répétitives dans des variables ou créer des fonctions qui les construisent en utilisant un seul préfabriquéString
.Python 2.7 - 437
Ce n'est pas le code le plus court, mais je pense que c'est la façon la plus optimale de résoudre ce problème.
Comme je l'ai indiqué dans les commentaires, la façon la plus optimale de calculer cela:
divmod(amount,5)
. Cela vous donnera l'un des 4,3,2,1 comme reste.Ce qui laisse 1 ou 2 comme reste. Utilisez la solution optimale pour l'un ou l'autre qui peut être connue à l'avance comme:
Le code:
Et une sortie pour 4L en 7 étapes:
la source
Smalltalk (Smalltalk / X),
568 560516entrée en n:
C'est certainement le programme le plus obscur que j'aie jamais écrit ...
Modifier: certains autres Smalltalks peuvent ne pas autoriser les variables d'espace de travail autodéclarées et vous devrez ajouter des déclarations. De plus, bindWith: peut être différent (expandWith: '<p>').
exemple de sortie pour n = 17:
la source
C,
567609version non valide précédente:
et voici le code dégolfé:
la source
C (
480465 octets)Version optimale (ajoute 10 octets)
Probablement plus de golf à faire ici - les fonctions de sortie me tuaient. Cela devrait donner la solution optimale (le moins d'étapes). Semblable à d'autres codes ici, il remplit et vide les cruches de 5 litres jusqu'à ce qu'il atteigne moins de 5, puis passe aux cruches de 3 litres. Il teste 2 cas spéciaux (6 et 9) et s'il les trouve passe à des cruches 3L. Les instructions pour obtenir 1L et 2L sont codées en dur.
Version plus lisible:
Modifications:
Sortie de test pour n = 11 (version optimale):
la source
T-SQL (2012):
794689580Inspiré par la réponse T-SQL de @ Jonathan-Van-Matre en combinaison avec l' algorithme de @ Lego-Stormtroopr . Je voulais le faire parce que j'aimais tellement le défi des 99 bouteilles de bière .
J'ai essayé de garder les
OVER
fonctions window ( ) au minimum, de préférence aux fonctions mathématiques / booléennes.SQLFiddle est ici .
Contribution:
11
Lisible par l'homme:
la source
input = 8
input = 11
Python 3 (417 caractères)
Expliqué
Notez que nous avons 4 objets, à savoir la cruche 3L, la cruche 5L, le réservoir et la fontaine. Les seules opérations que nous pouvons faire sont de déplacer l'eau d'un objet
a
à l'autreb
. Voilà quelle fonctiono(a, b)
fait dans mon code, il déplace l'eau et l'imprime et continue de compter.Des trucs
N=['3L jug','5L jug','tank',0]
. Ici, j'ai besoin du dernier élément à éviterIndexError
. En outre, il peut être utilisé comme variable de comptage globale, sans leglobal
mot clé expansif . Par exemple,N[3] += 1
Puisque
0 <= a < 4, 0 <= b < 4
dans la fonctiono(a, b)
, nous pouvons encoder(a, b)
en un chiffre hexadécimal en utilisant(a << 2) | b
, et le décoder en utilisantdivmod(x, 4)
. Avec cette astuce, les 5 solutions (reminder=0, 1, 2, 3, 4
) peuvent être encodées en tableau['','c1c12','d46','c2','d434d46']
, ce qui est un peu plus court que sa forme originale: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)) ]
Exemple de sortie (n = 17)
la source
COBOL (IBM Enterprise COBOL) 192 lignes de 72 caractères
Ceci est une preuve de concept pour la question, et le début d'une pour Golf-COBOL :-)
La question demande le plus rapidement. Donc, implémentez le parallélisme. Une seule personne peut facilement remplir un pot de 3 litres et un pot de 5 litres en même temps.
Divisez simplement l'entrée par huit, en laissant également le reste. Faites quelques remplissages rapides de 5L / 3L au nombre de fois où huit ajustements sont exacts, puis traitez celui qui reste jusqu'à sept litres.
Le plus intéressant du reste est pour quatre litres. Le faire en un litre plus trois litres pousse beaucoup moins d'eau, seulement 18 litres contre 23 pour les autres possibilités.
Le Code (en marche)
Cela obtient un délestage absolu de messages de diagnostic pour le code démarrant au mauvais endroit et la pénurie d'arrêts complets requis.
Aucun des diagnostics n'indique d'impact sur le code objet. Donc, bien qu'il s'agisse d'un RC cassé = 8, je sais que l'objet sera OK, alors liez-le et exécutez-le.
Voici les sorties pour un à huit litres. Après cela, tous les résultats peuvent être intuitifs. 17 et 100 sont inclus comme exemples de parallélisme.
Il y a encore beaucoup à faire pour compresser le programme en caractères, la sortie correcte était la chose importante en premier. Compter les caractères lorsqu'ils sont sur des lignes de longueur fixe est une tout autre chose.
Exemple de sortie:
la source