Überblick:
Aus Wikipedia : Ein ägyptischer Bruch ist die Summe verschiedener Einheitenbrüche. Das heißt, jeder Bruch im Ausdruck hat einen Zähler gleich 1 und einen Nenner, der eine positive ganze Zahl ist, und alle Nenner unterscheiden sich voneinander. Der Wert eines Ausdrucks dieses Typs ist eine positive rationale Zahl a / b. Jede positive rationale Zahl kann durch einen ägyptischen Bruch dargestellt werden.
Herausforderung:
Schreiben Sie die kürzeste Funktion, die die Werte aller Nenner für die kleinste Menge von Einheitsbrüchen zurückgibt, die sich zu einem bestimmten Bruch addieren.
Regeln / Einschränkungen:
- Die Eingabe erfolgt über zwei positive Ganzzahlwerte.
- Dies kann aktiviert
STDIN
,argv
durch Kommas getrennt, durch Leerzeichen getrennt oder eine andere Methode sein, die Sie bevorzugen.
- Dies kann aktiviert
- Der erste Eingabewert soll der Zähler und der zweite Eingabewert der Nenner sein.
- Der erste Eingabewert muss kleiner als der zweite sein.
- Die Ausgabe kann Werte enthalten, die die Speicherbeschränkungen Ihres Systems / Ihrer Sprache überschreiten (RAM, MAX_INT oder sonstige vorhandene Code- / Systembeschränkungen). In diesem Fall kürzen Sie einfach das Ergebnis auf den höchstmöglichen Wert und beachten Sie dies irgendwie (dh
...
). - Die Ausgabe sollte einen Nennerwert von mindestens 2.147.483.647 (2 31 -1, 32-Bit mit Vorzeichen
int
) verarbeiten können.- Ein höherer Wert (
long
usw.) ist durchaus akzeptabel.
- Ein höherer Wert (
- Die Ausgabe soll eine Liste aller Werte von Nennern der kleinsten Menge von gefundenen Einheitsbrüchen (oder der Brüche selbst, dh
1/2
) sein. - Die Ausgabe wird nach dem Wert des Nenners aufsteigend geordnet (absteigend nach dem Wert des Bruchs).
- Die Ausgabe kann nach Belieben abgegrenzt werden, es muss jedoch ein Zeichen dazwischen stehen, um einen Wert vom nächsten zu unterscheiden.
- Das ist Codegolf, also gewinnt die kürzeste Lösung.
Beispiele:
Eingang 1:
43, 48
Ausgang 1:
2, 3, 16
Eingang 2:
8/11
Ausgang 2:
1/2 1/6 1/22 1/66
Eingang 3:
5 121
Ausgang 3:
33 121 363
code-golf
math
rational-numbers
Gaffi
quelle
quelle
8, 11
und2, 6, 22, 66
richtig sein?1/2 1/6 1/22 1/66
vorzuziehen .1/2 1/5 1/37 1/4070
8/11
5/121 = 1/33+1/121+1/363
, die Testfälle zu ergänzen. Alle gierigen Programme (einschließlich meiner) geben 5 Brüche dafür. Beispiel aus Wikipedia .Antworten:
Common Lisp, 137 Zeichen
(z 43/48) -> (2 3 16)
(z 8/11) -> (2 5 37 4070)
(z 5/121) -> (25 757 763309 873960180913 1527612795642093418846225)
Sie müssen sich keine Gedanken über große Zahlen oder die Verwendung von Notationsbrüchen machen!
quelle
Python 2,
169167 ZeichenÜbernimmt durch Kommas getrennte Argumente für stdin und druckt eine Python-Liste auf stdout.
quelle
PHP 82 Bytes
Dies könnte kürzer gemacht werden, aber der aktuelle Zähler und Nenner müssen als ganze Zahlen gehalten werden, um Gleitkomma-Rundungsfehler zu vermeiden (anstatt den aktuellen Bruch zu behalten).
Beispielnutzung:
quelle
5 121
oder ausführen31 311
, wird es die falsche Antwort geben (nach einer sehr langen Zeit).C
163177 Zeichen6/6 : Endlich behandelt das Programm das Abschneiden in allen Fällen korrekt. Es hat viel mehr Zeichen gekostet, als ich mir erhofft hatte, aber es hat sich gelohnt. Das Programm sollte sich jetzt zu 100% an die Problemanforderungen halten.
Das Programm übernimmt bei Standardeingabe Zähler und Nenner. Die Nenner werden auf Standardausgabe gedruckt, einer pro Zeile. Eine abgeschnittene Ausgabe wird durch Drucken eines Null-Nenners am Ende der Liste angezeigt:
Die Nenner im zweiten Beispiel ergeben 95485142815/107645519046, was sich von 6745/7604 um ungefähr 1e-14 unterscheidet.
quelle
31 311
zum Beispiel) nicht ganz korrekt ist .31 311
überläuft, aber das Programm kann es nicht markieren.Python, 61 Zeichen
Eingabe von STDIN, kommagetrennt.
Ausgabe nach STDOUT, Zeilenumbruch getrennt.
Gibt nicht immer die kürzeste Darstellung zurück (zB für 5/121).
Zeichen, die ohne unnötige Zeilenumbrüche gezählt werden (dh alle Zeilen innerhalb der
while
Verwendung verbinden;
).Die Fraktion ist
a/b
.i
wirdb/a
aufgerundet, damit ich weiß1/i <= a/b
.Nach dem Drucken
1/i
ersetze icha/b
mita/b - 1/i
, was ist(a*i-b)/(i*b)
.quelle
C 94 Bytes
Probieren Sie es online
Bearbeiten: Eine kürzere Version des Codes wurde in den Kommentaren gepostet, also habe ich ihn ersetzt. Vielen Dank!
quelle
for(i=2;n>0&&i>0;i++)
können seinfor(i=1;n>0&++i>0;)
; die Klammern der for-Schleife können entfernt werden (weil sie nur dieif
Innenseite hat);d=d*i;
kann seind*=i;
; und ich bin nicht ganz sicher, aber ich denke ,#include <stdio.h>
kann ohne Leerzeichen sein:#include<stdio.h>
. Oh, und es könnte interessant sein, Tipps zum Golfen in C und Tipps zum Golfen in <allen Sprachen>Stax , 18 Bytes
Führen Sie es aus und debuggen Sie es
Bei jedem Schritt wird versucht, den nachfolgenden Zähler zu minimieren . Es scheint zu funktionieren, aber ich kann es nicht beweisen.
quelle
AXIOM, 753 Bytes
Die Idee wäre, den "Greedy-Algorithmus" mit verschiedenen Anfangspunkten anzuwenden und die Liste mit der minimalen Länge zu speichern. Aber nicht immer würde es die minimale Lösung mit weniger Unterschieden finden: "Array A wird kleiner als Array B sein, wenn und nur wenn A wenige Elemente von B hat, oder wenn die Anzahl der Elemente von A gleich der Anzahl der Elemente von B ist , als A ist es kleiner als B, wenn das kleinste Element von A größer als die Zahl ist, als das kleinste Element von B ". Ungolfed und Test
Referenz und Nummern von: http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fractions/egyptian.html
Um etwas hinzuzufügen, ist dies unten derjenige, der für die Ermittlung des Bruches der minimalen Länge optimiert ist, der den maximalen Nenner weniger hat (und nicht für die Länge optimiert ist).
die Ergebnisse:
Es scheint, dass viele gute Nenner als Faktor-Teiler des Eingangsbruchteils Nenner haben.
quelle
C,
8578 BytesVerbessert um @ceilingcat , 78 Bytes:
Probieren Sie es online!
Meine ursprüngliche Antwort, 85 Bytes:
Probieren Sie es online!
Ein Teil des Kredits sollte an Jonathan Frech gehen , der diese 94-Byte-Lösung geschrieben hat, die ich verbessert habe.
quelle
APL (NARS), 2502 Byte
Übersetzung von AXIOM-Code für dieses Problem zu APL, wobei zum ersten Mal (für mich) der Bruchtyp (das ist Bignum ...) verwendet wird.
103r233 bedeutet die Fraktion 103/233. Prüfung:
quelle