Inspiré par /puzzling//q/626
Dans vos aventures, vous arrivez à une série de 7 ponts que vous devez traverser. Sous chaque pont vit un troll. Pour traverser le pont, vous devez d'abord donner au troll un certain nombre de gâteaux en pourcentage du nombre de gâteaux que vous portez. Parce que ce sont de gentils trolls, ils vous rendront un certain nombre de gâteaux.
Au début de chaque journée, le roi des trolls local fixe le pourcentage de taxe sur les gâteaux que chaque voyageur doit payer et le remboursement des gâteaux de trolls - le nombre de gâteaux que chaque troll doit rendre aux voyageurs.
Votre travail consiste à calculer le nombre minimum de gâteaux nécessaires pour passer les 7 ponts de pêche à la traîne pour les conditions données ce jour-là.
Présumer:
- Deux paramètres d'entrée: taxe sur le gâteau en pourcentage (entier de 0 à 100) et remboursement du gâteau troll.
- Personne, pas même les trolls, ne veut un gâteau partiellement mangé par un autre troll. Si vous vous retrouvez avec une fraction de gâteau, le troll l'obtient.
- Si un troll accepte une taxe sur les gâteaux, mais doit ensuite vous rendre tous les gâteaux (avec les mêmes gâteaux ou moins qu'auparavant), il se mettra en colère et vous dévorera, vous et vos gâteaux.
- Chaque troll doit garder au moins un gâteau complet.
- Vous ne pouvez transporter qu'un maximum de 100 gâteaux.
- Vous devez terminer la journée où vous vous trouvez actuellement ou de l'autre côté des 7 ponts.
Défi:
Écrivez un programme complet pour sortir le nombre minimum de gâteaux à voyager pour la journée en cours ou zéro s'il n'est pas possible de voyager en toute sécurité aujourd'hui - vous attendez de voir quels sont les nombres demain.
L'entrée doit être passée en tant que stdin, arguments de ligne de commande ou entrée de fichier.
Le code le plus court (nombre d'octets) gagne.
Exemple:
25% de taxe sur les gâteaux, 2 remboursements de gâteau troll.
commencer avec 19 gâteaux
avant le troll 1: (19 * 0,75) = 14,25
après le troll 1: (14 + 2) = 16
avant le troll 2: (16 * 0,75) = 12
après le troll 2: (12 + 2) = 14
etc.
19 gâteaux -> 16 -> 14 -> 12 -> 11 -> 10 -> 9 -> 8
18 gâteaux -> 15 -> 13 -> 11 -> 10 -> 9 -> 8 -> 8 (règle 3)
Pour 18 gâteaux, le dernier troll n'aurait pas pu garder de gâteaux. Par conséquent, le nombre minimum de gâteaux pour 25% / 2 jours est de 19.
input: 25 2
output: 19
Exemple 2:
90% de taxe sur les gâteaux, 1 remboursement de gâteau troll
100 gâteaux -> 11 -> 2 -> 1 (règle 4)
Le troisième troll n'a pu garder aucun gâteau. Il n'est donc pas possible de voyager sur 90% / 1 jour même à partir du nombre maximum de gâteaux.
input: 90 1
output: 0
Les données
Créez un graphique rapide des valeurs d'entrée et de sortie. J'ai été surpris que ce ne soit pas "lisse" (comme une courbe en cloche ou similaire); il y a plusieurs îles visibles.
Données pour les personnes intéressées. Les colonnes sont divisées en intervalles de 5%, les rangées sont des unités de 1 intervalle de remboursement de gâteau (Excel a fait pivoter l'image). Vous pouvez voir qu'il ne peut y avoir de remboursement supérieur à 28 gâteaux.
27, 17, 13, 14, 15, 18, 20, 24, 53, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
47, 27, 20, 19, 19, 19, 24, 39, 48, 68, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0
67, 37, 28, 24, 23, 28, 27, 29, 50, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
87, 47, 33, 29, 27, 28, 31, 44, 37, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 57, 40, 34, 31, 29, 34, 34, 62, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 67, 48, 39, 35, 38, 37, 49, 57, 76, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 77, 53, 44, 39, 38, 47, 39, 59, 78, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 87, 60, 49, 43, 39, 40, 54, 46, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 97, 68, 54, 47, 48, 44, 44, 71, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 73, 59, 51, 48, 47, 59, 73, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 80, 64, 55, 49, 51, 49, 68, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 88, 69, 59, 58, 54, 64, 70, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 93, 74, 63, 58, 57, 54, 57, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 100, 79, 67, 59, 67, 69, 82, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 84, 71, 68, 60, 59, 77, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 89, 75, 68, 64, 74, 79, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 94, 79, 69, 67, 64, 66, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 99, 83, 78, 71, 79, 91, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 87, 78, 74, 69, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 91, 79, 77, 84, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 95, 88, 87, 74, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 99, 88, 80, 89, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 89, 84, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 98, 87, 94, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 98, 91, 84, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 99, 94, 99, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 97, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
25 2
cas de 11 gâteaux, vous donnez au troll 2,75 gâteaux et récupérez 2 pour que le troll garde 0,75 (+ 0,25) et que vous survivez. Dans le90 1
cas des 2 gâteaux, vous donnez le troll 1,8 et récupérez 1 pour que le troll garde 0,8 (+. 2) mais vous mourrez.Réponses:
CJam,
46434139383633 octetsEntrée via ARGV.
Il existe un interpréteur en ligne, mais malheureusement, il ne prend pas en charge les arguments de ligne de commande. Pour les tests, vous pouvez l'imiter depuis STDIN avec cette version:
Explication de la version basée sur ARGV:
Le contenu de la pile est automatiquement imprimé à la fin du programme.
la source
55 2
(0
au lieu de100
) et56 5
(98
au lieu de94
). En effet,100_0.55*-i
et25_0.56*-i
être victime d'une imprécision en virgule flottante. Autant que je sache, les paires31 24, 31 25, 33 21, 33 22, 33 23, 35 10, 35 12, 35 15, 35 16, 35 27, 56 1, 57 4
donnent également des résultats incorrects.CJam,
44 40 38 3735 octetsOu lorsque vous utilisez des arguments de ligne de commande et une
{}#
astuce, 33 octets :Ne pas mettre celui-ci comme mon
{}#
approche principale est inspiré de la réponse de Martin.Exemple d'exécution:
Contribution:
Production:
Un autre:
Contribution:
Production:
Comment ça fonctionne
Essayez-le en ligne ici
la source
]W=
astuce, mais jusqu'à présent, chaque fois que j'essaie de l'utiliser, je me retrouve avec le même nombre de caractères.APL (39)
Explication:
T R←⎕
: lisez deux chiffres sur le clavier et enregistrez-les dansT
(taxe) etR
(retour).Z←⍳M←100
: enregistrer le numéro100
dansM
et tous les numéros de1
à100
dansZ
.{
...}⍣7¨
: pour chaque élément dansZ
, exécutez la fonction suivante 7 fois:R+⌊1-T÷M
: calculer combien de gâteaux doivent être payés,⍵(⊢×>)
: multipliez ce montant par 1 si le troll se retrouve avec plus de gâteau qu'il n'en a commencé, ou par 0 sinon.⊃Z/⍨
: pour chaque élément dansZ
, répliquez-le par le nombre que cette fonction a donné. (Ainsi, tous les nombres pour lesquels la fonction renvoyée0
disparaît.) Sélectionnez ensuite le premier élément de cette liste. Si la liste s'est retrouvée vide, cela donne0
.la source
C, 83 octets
Si cela fonctionne, il fonctionne pour tous les startcakes possibles, pas seulement de 1 à 100.
EDIT: Cela fonctionne. Golfé:
Avec la limite «maximum 100 gâteaux»:
91 octets.
la source
CJam, 36 octets
la source
C ++ - 202 caractères
Comme d'habitude, mon C ++ a fait le pire:
la source
APL, 36
Explication
Notez qu'il existe un "seuil de gâteau". Pour le taux de taxe
x
et le remboursementy
, vous aurez besoin de bien plus que dey÷x
gâteaux pour passer le pont suivant.x y←⎕
prendre une entrée et affecter àx
(taxe) ety
(retour)⍳x÷←100
diviserx
par 100, puis générer un tableau de 1 à 100{y+⍵-⌈⍵×x}⍣6
appelez la fonction "pass bridge" 6 fois:⌈⍵×x
le nombre de gâteaux que vous avez, le taux de taxe, arrondissez (le montant que vous payez)⍵-
soustrayez du nombre de gâteaux que vous avezy+
Ajoutez le remboursementEnsuite, vous obtenez un tableau de 100 éléments indiquant le nombre de gâteaux qui vous restent après avoir traversé 6 ponts si vous commencez avec 1 à 100 gâteaux. Pour voir si vous pouvez traverser le dernier pont, vérifiez si vous êtes au-dessus du seuil
y÷x
. Alternativement:x×
multipliez le tableau enx
y<
vérifiant s'il est supérieur ày
Enfin,
1⍳⍨
trouvez l'indice de première occurrence de1
(vrai), retourne101
s'il n'est pas trouvé101|
mod 101la source
C 128
Assez similaire à l'autre solution C mais je pense que c'est inévitable. L'astuce principale consiste à sortir de la boucle interne avec des valeurs différentes selon qu'elle se termine ou non. Cela me permet d'utiliser?: Quand je ne pourrais pas si j'utilisais break;
Non golfé
la source