Einführung
Berechnen Sie bei einer Reihe von Prozentsätzen für die Auswahlmöglichkeiten in einer Umfrage die Mindestanzahl der Wähler, die in der Umfrage enthalten sein müssen, um diese Statistiken zu erstellen.
Beispiel: Welches ist Ihr Lieblingshaustier?
- Hund:
44.4%
- Katze:
44.4%
- Maus:
11.1%
Output: 9
(minimal mögliche Anzahl von Wählern)
Technische Daten
Hier sind die Anforderungen für Ihr Programm / Ihre Funktion:
- Sie erhalten ein Array mit Prozentwerten als Eingabe (für stdin, als Funktionsargument usw.).
- Jeder Prozentwert ist eine auf eine Dezimalstelle gerundete Zahl (z
44.4 44.4 11.1
. B. ). - Berechnen Sie die kleinstmögliche Anzahl von Wählern in der Umfrage, deren Ergebnisse genau diese Prozentsätze ergeben würden, wenn sie auf eine Dezimalstelle gerundet würden (auf Standard- oder Funktionsrückgabewert).
- Bonus : -15 Zeichen, wenn Sie auf "nicht triviale" Weise lösen können (dh Sie müssen nicht jede mögliche Anzahl von Wählern durchlaufen, bis Sie die erste finden, die funktioniert)
Beispiel
>./pollreverse 44.4 44.4 11.1
9
>./pollreverse 26.7 53.3 20.0
15
>./pollreverse 48.4 13.7 21.6 6.5 9.8
153
>./pollreverse 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 99.6
2000
>./pollreverse 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 98.7
667
>./pollreverse 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 98.7
2000
>./pollreverse 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 97.8
401
Wertung
Das ist Code-Golf, also gewinnt der kürzestmögliche Charakter. Etwaige Boni werden von der Gesamtzahl der Zeichen weiter abgezogen.
code-golf
math
reverse-engineering
mellamokb
quelle
quelle
26.7 53.3 20.0
(4 8 3 von 15),48.4 13.7 21.6 6.5 9.8
(74 21 33 10 15 von 153) usw.0.5%
Gesamtsumme und bei jeder Aufrundung addieren Sie0.5%
zur Gesamtsumme. Die letzten vier Testfälle wurden gezielt konstruiert, um dieses Phänomen optimal auszunutzen. In dem ersten Testfall, der zu führt2000
, repräsentiert jeder der ersten 9 Einträge eine1
Abstimmung (und sind alle aufgerundet0.5%
), während der letzte eine1991
Abstimmung repräsentiert (und abgerundet ist ~0.5%
). Wenn Sie diese Prozentsätze manuell berechnen und auf 1 Dezimalstelle runden, werden Sie sehen, dass alle korrekt sind.Antworten:
APL (Dyalog Classic) ,
4843 Bytes-5 Bytes von Adám
Vollständiges Programm unter Eingabe von stdin.
Probieren Sie es online! Link ist zur dfn version.
Ungolfed
Probieren Sie es online!
normalize
dividiert (÷
) alle Elemente seines rechten Arguments (⊢
) durch seine Summe (+/
).round(y)
Rundet y auf 3 Dezimalstellen, indem Sie jedes Element von y formatieren (⍕
) und dann auswerten (⍎
).find_max(y)
gibt ein Array mit 1 zurück, wobei max (y) gefunden wird und 0 an anderer Stelle.increase(x,y)
Nimmt x (die Zielprozentsätze) und y (das Array der aktuellen Stimmensummen) und berechnet, wo 1 in y hinzugefügt werden muss, um die Prozentsätze näher an x heranzuführen.vote_totals(x,y)
Nimmt x (die Zielprozentsätze) und y (die Gesamtzahl der Startstimmen) und führt f wiederholt aus, wobei Stimmen addiert werden, bis die Prozentsätze auf x gerundet sind.f ⍣ g
bedeutet,f
wiederholt auszuführen, bisg(y,f(y))
wahr ist. In diesem Fall ignorieren wirf(y)
.h(x)
Setzt y auf 0 (entspricht einem Array von 0s aufgrund der Vektorisierung), führt g aus und summiert die Gesamtzahl der abgegebenen Stimmen.quelle
Python, 154
Es funktioniert jetzt für das letzte Beispiel.
Beispiel läuft:
quelle
99.1
1/2000 = 0.05%
(0.1%
gerundet) und1991/2000 = 99.55%
(99.6%
gerundet). Wenn es also zehn Optionen in einer Umfrage gibt und neun davon einmal gewählt werden, während die letzten 1991 Stimmen erhalten, dann würden diese Prozentsätze angegeben.J, 57 Zeichen
Verwendete die triviale Methode. Es nimmt Eingaben von der Tastatur entgegen.
t
Erstellt eine Nachschlagetabelle und die zweite Zeile sucht nach der Eingabe in der Tabelle. Bei Interesse kann ich den Code ausführlich erläutern.Ich hatte versucht, den Prozentsatz zu verwenden, um einen Bruch zu erstellen, und dann die niedrigste Form des Bruches zu erhalten, um die Zahl zu ermitteln, aber ich konnte keine Möglichkeit finden, mit der Rundung der Ergebnisse zu funktionieren.
quelle
Python, 154
quelle
[0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,99.6]
?1/2000 = 0.05%
(0.1%
gerundet) und1991/2000 = 99.55%
(99.6%
gerundet). Es ist also tatsächlich 100%, aber die Rundung macht es wirklich verwirrend.VBA - 541
Dies hat einige krasse Fehler, aber es war mein Versuch, eine nicht-triviale / Loop-bis-ich-die-richtige-Nummer-Lösung zu finden. Ich habe es nicht voll ausprobiert, obwohl ich glaube, dass es in dieser Hinsicht nicht viel hinzuzufügen gibt. Ich habe jedoch zu viel Zeit damit verbracht, und es tut mir jetzt am Kopf weh. Ganz zu schweigen davon, dass die Regeln wahrscheinlich sehr gebrochen sind und mehr oder weniger nur für diese Beispiele gelten.
Dies funktioniert bei vielen einfachen Tests, die ich durchgeführt habe, sehr gut (dh sogar bei Summen, 2 oder 3 Eingaben), schlägt jedoch bei einigen der Tests, die von der Challenge präsentiert werden, fehl. Ich habe jedoch festgestellt, dass sich die Genauigkeit verbessert, wenn Sie die Dezimalgenauigkeit der Eingabe erhöhen (außerhalb des Bereichs der Abfrage).
Ein Großteil der Arbeit besteht darin, die gcd für die bereitgestellten Zahlen zu finden, und ich habe das irgendwie geschafft
Function g()
, obwohl es mit Sicherheit unvollständig ist und wahrscheinlich zumindest einige der Fehler in meinen Ausgaben verursacht.Die Eingabe ist eine durch Leerzeichen getrennte Zeichenfolge von Werten.
Testfälle (Eingabe ==> erwartet / zurückgegeben):
quelle
Debug.Print
zuDebug.?
C # (.NET Core) , 286 Byte
Probieren Sie es online!
Dank Peter Taylor und Inbegriff der Ignoranz konnten viele Bytes gespart werden
quelle
}
am Ende.Zip
Methode nicht erkannt wird.1>0
ist kürzer alstrue
, ist es bevorzugt.Python 3 ,
140139137 BytesProbieren Sie es online!
Gibt die richtige Antwort für die ersten beiden Testfälle und stößt bei den anderen an Pythons Rekursionsgrenzen. Dies ist nicht sehr überraschend, da jede Prüfung auf einer neuen Rekursionsebene durchgeführt wird. Es ist aber kurz ...
(Eine Erklärung der verwendeten Variablen finden Sie im TIO-Link)
sollte für 136 Bytes funktionieren, aber aufgrund der Float-Genauigkeit nicht.
quelle