Aperçu:
De Wikipédia : Une fraction égyptienne est la somme de fractions unitaires distinctes. Autrement dit, chaque fraction de l'expression a un numérateur égal à 1 et un dénominateur qui est un entier positif, et tous les dénominateurs diffèrent les uns des autres. La valeur d'une expression de ce type est un nombre rationnel positif a / b. Chaque nombre rationnel positif peut être représenté par une fraction égyptienne.
Défi:
Écrivez la fonction la plus courte qui renverra les valeurs de tous les dénominateurs pour le plus petit ensemble de fractions unitaires qui s'ajoutent à une fraction donnée.
Règles / Contraintes:
- L'entrée sera deux valeurs entières positives.
- Cela peut être sur
STDIN
,argv
, séparés par des virgules, espace délimité, ou toute autre méthode que vous préférez.
- Cela peut être sur
- La première valeur d'entrée doit être le numérateur et la deuxième valeur d'entrée le dénominateur.
- La première valeur d'entrée doit être inférieure à la seconde.
- La sortie peut inclure une ou des valeurs qui dépassent les limites de mémoire de votre système / langue (RAM, MAX_INT ou toute autre contrainte de code / système existant). Si cela se produit, tronquez simplement le résultat à la valeur la plus élevée possible et notez-le d'une manière ou d'une autre (c.
...
-à-d.). - La sortie doit pouvoir gérer une valeur de dénominateur d'au moins 2 147 483 647 (2 31 -1, signé 32 bits
int
).- Une valeur plus élevée (
long
, etc.) est parfaitement acceptable.
- Une valeur plus élevée (
- Le résultat doit être une liste de toutes les valeurs des dénominateurs du plus petit ensemble de fractions unitaires trouvées (ou des fractions elles-mêmes, c.
1/2
-à-d.). - La sortie doit être ordonnée ascendante en fonction de la valeur du dénominateur (décroissante de la valeur de la fraction).
- La sortie peut être délimitée comme vous le souhaitez, mais il doit y avoir un caractère entre afin de différencier une valeur de la suivante.
- C'est le golf de code, donc la solution la plus courte l'emporte.
Exemples:
Entrée 1:
43, 48
Sortie 1:
2, 3, 16
Entrée 2:
8/11
Sortie 2:
1/2 1/6 1/22 1/66
Entrée 3:
5 121
Sortie 3:
33 121 363
8, 11
et2, 6, 22, 66
non?1/2 1/6 1/22 1/66
serait préférable1/2 1/5 1/37 1/4070
pour l'entrée8/11
.5/121 = 1/33+1/121+1/363
aux cas de test. Tous les programmes gourmands (y compris le mien) donnent 5 fractions pour cela. Exemple tiré de Wikipedia .Réponses:
Lisp commun, 137 caractères
(z 43/48) -> (2 3 16)
(z 8/11) -> (2 5 37 4070)
(z 5/121) -> (25 757 763309 873960180913 1527612795642093418846225)
Pas besoin de s'inquiéter des nombres énormes ou de la gestion de la notation fractionnaire!
la source
Python 2,
169167 caractèresPrend des arguments séparés par des virgules sur stdin et imprime une liste python sur stdout.
la source
PHP 82 octets
Cela pourrait être raccourci, mais le numérateur et le dénominateur actuels doivent être conservés sous forme de nombres entiers pour éviter les erreurs d'arrondi à virgule flottante (au lieu de conserver la fraction actuelle).
Exemple d'utilisation:
la source
5 121
ou31 311
, cela donnera la mauvaise réponse (après très longtemps).C,
163177 caractères6/6 : Enfin, le programme gère désormais correctement la troncature dans tous les cas. Cela a pris beaucoup plus de caractères que je ne l'espérais, mais ça valait le coup. Le programme devrait maintenant adhérer à 100% aux exigences du problème.
Le programme prend le numérateur et le dénominateur sur l'entrée standard. Les dénominateurs sont imprimés sur la sortie standard, un par ligne. La sortie tronquée est indiquée en imprimant un dénominateur zéro à la fin de la liste:
Les dénominateurs du deuxième exemple totalisent 95485142815/107645519046, ce qui diffère de 6745/7604 d'environ 1e-14.
la source
31 311
par exemple).31 311
déborde, mais le programme ne parvient pas à le signaler.Python, 61 caractères
Entrée de STDIN, séparée par des virgules.
Sortie vers STDOUT, nouvelle ligne séparée.
Ne renvoie pas toujours la représentation la plus courte (par exemple pour 5/121).
Les caractères sont comptés sans les nouvelles lignes inutiles (c'est-à-dire rejoindre toutes les lignes dans l'
while
utilisation;
).La fraction est
a/b
.i
estb/a
arrondi, donc je sais1/i <= a/b
.Après l'impression
1/i
, je remplacea/b
para/b - 1/i
, qui est(a*i-b)/(i*b)
.la source
C, 94 octets
Essayez-le en ligne
edit: Une version plus courte du code a été publiée dans les commentaires, je l'ai donc remplacée. Merci!
la source
for(i=2;n>0&&i>0;i++)
jouer au golf: peuvent l'êtrefor(i=1;n>0&++i>0;)
; les crochets de la boucle for peuvent être supprimés (car elle n'a que l'if
intérieur);d=d*i;
peut êtred*=i;
; et je ne suis pas tout à fait sûr, mais je pense#include <stdio.h>
peut être sans espaces:#include<stdio.h>
. Oh, et il pourrait être intéressant de lire Conseils pour jouer au golf en C et Conseils pour jouer au golf dans <toutes les langues>Stax , 18 octets
Exécuter et déboguer
À chaque étape, il essaie de minimiser le numérateur suivant . Cela semble fonctionner, mais je ne peux pas le prouver.
la source
AXIOM, 753 octets
L'idée serait d'appliquer "l'algorithme gourmand" avec différents points initiaux, et d'enregistrer la liste qui a une longueur minimale. Mais pas toujours il trouverait la solution min avec moins de précision: "le tableau A sera inférieur au tableau B si et seulement si A a peu d'éléments de B, ou si le nombre d'éléments de A est le même que le nombre d'éléments de B , que A est inférieur à B si le plus petit élément de A est plus grand en nombre, que le plus petit élément de B ". Non golfé et tester
référence et numéros de: http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fractions/egyptian.html
pour ajouter quelque chose, ce qui suit serait celui optimisé pour trouver la fraction de longueur min qui a le dénominateur max moins (et non optimisé pour la longueur)
Les resultats:
Il semble que de nombreux bons dénominateurs aient comme diviseurs de facteur le dénominateur de la fraction d'entrée.
la source
C,
8578 octetsAmélioré par @ceilingcat , 78 octets:
Essayez-le en ligne!
Ma réponse d'origine, 85 octets:
Essayez-le en ligne!
Une partie du mérite devrait revenir à Jonathan Frech , qui a écrit cette solution de 94 octets que j'ai améliorée.
la source
APL (NARS), 2502 octets
Traduction du code AXIOM pour ce problème, en APL, en utilisant pour la première fois (pour moi) le type de fraction (c'est-à-dire bignum ...).
103r233 signifie la fraction 103/233. Tester:
la source