Schreiben Sie eine Funktion, die eine Liste positiver Ganzzahlen aufnimmt und eine Liste von Ganzzahlen zurückgibt, die in etwa dem Prozentsatz der Summe für die entsprechende Ganzzahl an derselben Position entspricht.
Alle Ganzzahlen in der Rückgabeliste müssen genau 100 ergeben. Sie können davon ausgehen, dass die Summe der übergebenen Ganzzahlen größer als 0 ist. Wie Sie Dezimalzahlen runden oder abschneiden möchten, bleibt Ihnen überlassen, solange eine einzelne resultierende Ganzzahl als Prozentsatz zurückgegeben wird ist um nicht mehr als 1 in beide Richtungen ausgeschaltet.
p([1,0,2]) -> [33,0,67] or [34,0,66]
p([1000,1000]) -> [50,50]
p([1,1,2,4]) -> [12,12,25,51] or [13,12,25,50] or [12,13,25,50] or [12,12,26,50]
p([0,0,0,5,0]) -> [0,0,0,100,0]
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes!
code-golf
array-manipulation
DaveAlger
quelle
quelle
p([2,2,2,2,2,3])
. Es gibt viele mögliche rechtliche Antworten, aber nicht alle2
können auf den gleichen Wert abgebildet werden. Dadurch entfallen viele zu einfache Algorithmen, die für alle vorherigen Testfälle verwendet werden, da die Rundung nicht allzu schlecht ist.p([1000,1000]) -> [49,51]
?Antworten:
Dyalog APL,
211916 BytesDas obige ist ein Zugäquivalent von
Probieren Sie es online aus.
Wie es funktioniert
quelle
TI-BASIC,
262316 BytesFür Taschenrechner der Serie TI-83 + / 84 +.
Vielen Dank an @Dennis für einen schönen Algorithmus! Wir nehmen die kumulative Summe der Liste, nachdem wir in Prozent konvertiert haben, dann Floor, setzen eine 0 auf die Front und nehmen Differenzen auf.
ᴇ2
ist ein Byte kürzer als100
.Gleichzeitig ist die Byteanzahl:
Unterhaltsame Tatsache:
%
ist ein Zwei-Byte-Token , das eine Zahl mit 0,01 multipliziert - aber es gibt keine Möglichkeit, sie in den Taschenrechner einzugeben! Sie müssen entweder die Quelle außerhalb bearbeiten oder ein Assembly-Programm verwenden.Alter Code:
In der ersten Zeile werden alle Prozentsätze für den Fußboden berechnet. In der zweiten Zeile wird 1 zu den ersten
N
Elementen hinzugefügt, wobeiN
der verbleibende Prozentsatz angegeben wird.cumSum(
steht für "kumulative Summe".Beispiel mit
{1,1,2,4}
:Wir werden nicht haben
N>dim([list]
, weil kein Prozentsatz in Bodenbelägen um mehr als 1 verringert wird.quelle
int(
,sum(
,Ans
, etc.) belegen nur ein Byte.%
Symbol nicht eingeben können ? Ich hätte gedacht, dass es im Symbolkatalog zu finden ist ... Außerdem sollte ich meinen TI-84 + Silver herausholen. Ich habe es eine Weile nicht mehr benutzt. Block Dude ist großartig.CJam,
252322 BytesVielen Dank an @ Sp3000 für 25 → 24.
Probieren Sie es online aus.
Wie es funktioniert
quelle
Mathematica, 41 Bytes
quelle
N
Elementen, wobeiN
der verbleibende Prozentsatz ist.J (8.04 Beta) , 59 Bytes (30 gestohlene Bytes)
30-Byte-Literal-J-Port von Dennis 'APL-Antwort :
59 Bytes antworten, am besten ich könnte mich selbst tun:
(Bezogen auf den Rest, der zu den höchsten Werten gehen muss, jeweils nicht mehr als +1, aufgeteilt auf mehrere Werte bei einem Rest> 1 oder einem Gleichstand für den höchsten Wert).
z.B
Erläuterung
f=.3 : 0
- 'f' ist eine Variable, bei der es sich um einen Verbtyp (3) handelt, der unten definiert ist (: 0):p=.
Variable 'p', aufgebaut aus:y
ist eine Liste von Zahlen1 0 2
+/y
wird '+' zwischen jeden Wert '/' gesetzt, die Summe der Liste3
y % (+/y)
ist der ursprüngliche y-Wert geteilt durch die Summe:0.333333 0 0.666667
100 * (y%+/y)
ist das 100-fache dieser Werte:33.33.. 0 0.66...
um die Prozentsätze zu erhalten.<. (100*y%+/y)
Wird der Fußbodenoperator auf die Prozentsätze angewendet:33 0 66
r=.
Variable 'r', aufgebaut aus:+/p
ist die Summe der Floored-Prozentsätze:99
100 - (+/p)
ist 100 - die Summe oder die verbleibenden Prozentpunkte, die benötigt werden, um die Prozentzahlen auf 100 zu summieren.r $ 1
ist eine Liste von 1s, solange die Anzahl der Elemente erhöht werden muss:1 [1 1 ..]
#p
ist die Länge der Prozentliste(#p - r)
ist die Anzahl der Elemente, die nicht erhöht werden(#p-r) $ 0
ist eine Liste von Nullen, solange diese zählen:0 0 [0 ..]
((r$1) , (#p-r)$0)
ist die Liste der Einsen, gefolgt von der Liste der Nullen:1 0 0
\: p
ist eine Liste von Indizes, aus denenp
Sie absteigend sortieren können./: (\:p)
ist eine Liste von Indizes, aus\:p
denen Sie aufsteigend sortieren können((r$1),(#p-r)$0)/:\:p
die Elemente aus den 1 1 .. 0 0 .. Maske Liste nehme und Sortier so gibt es 1s in den Positionen der größten Prozentsatz, eines für jede Zahl , die wir zu Schritt benötigen, und 0er für andere Zahlen:0 0 1
.p + ((r$1),(#p-r)$0)/:\:p
ist der Prozentsatz + die Maske, um die Ergebnisliste zu erstellen, die sich zu 100% summiert. Dies ist der Rückgabewert der Funktion.z.B
und
)
Ende der Definition.Ich bin nicht sehr erfahren mit J; Es würde mich nicht überraschen, wenn eine "Liste in Prozent der Gesamtmenge umwandeln" -Operation eingebaut wäre und eine sauberere Methode, um " n größte Werte zu erhöhen". (Das sind 11 Bytes weniger als mein erster Versuch).
quelle
list[0:100-n] + list[:-100-n]
Herangehensweise ändern - und ich habe mir keine andere Herangehensweise überlegt.JavaScript (ES6), 81 Byte
Die Bedingung "Muss gleich 100" (anstatt zu runden und zu addieren) hat meinen Code fast verdoppelt (von 44 auf 81). Der Trick bestand darin, einen Pot für Dezimalwerte hinzuzufügen, der, sobald er 1 erreicht, 1 von sich nimmt und zur aktuellen Zahl hinzufügt. Das Problem waren dann Gleitkommazahlen, was bedeutet, dass so etwas wie [1,1,1] einen Rest von .9999999999999858 hinterlässt. Also habe ich den Scheck auf über 0,999 geändert und mich dazu entschlossen, das genau genug zu nennen.
quelle
Haskell,
4227 BytesZiemlich die triviale Methode in Haskell, mit ein paar Räumen zum Golfen entfernt.
Konsole (Klammern enthalten, um mit Beispiel übereinzustimmen):
Edit: übte mein Putten, machte einige offensichtliche Ersetzungen.
Original:
quelle
Gelee , 7 Bytes
-2 Dank an Dennis, der mich daran erinnert hat, eine andere neue Funktion (
Ä
) zu verwenden und:
anstelle dessen, was ich ursprünglich hatte, zu verwenden.Probieren Sie es online!
Jelly , 11 Bytes
Probieren Sie es online!
Erledigt neben caird coinheringaahing und user202729 im Chat .
Wie es funktioniert
quelle
Haskell,
635655 Bytesquelle
Perl, 42 Bytes
Basierend auf Dennis 'Algorithmus
Beinhaltet +1 für
-p
Führen Sie mit der Liste der Nummern auf STDIN, z
percent.pl
:quelle
Oktave, 40 Bytes
quelle
Python 2, 89 Bytes
quelle
Brain-Flak , 150 Bytes
Probieren Sie es online!
Ausgehend vom Ende und rückwärts stellt dieser Code bei jedem Schritt sicher, dass die Summe der bisher ausgegebenen Zahlen dem gesamten Prozentsatz entspricht, der angetroffen wird, abgerundet.
quelle
JavaScript (ES6) 60
63 95Angepasst und vereinfacht von meiner (falschen) Antwort auf eine andere Herausforderung
Thk an @ l4m2, um festzustellen, dass dies auch falsch war
Behoben: Speichern von 1 Byte (und 2 Byte weniger, ohne den Namen zu zählen
F=
)Testen Sie das folgende Snippet in einem beliebigen EcmaScript 6-kompatiblen Browser
quelle
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,980]
any single resulting integer returned as a percentage is off by no more than 1 in either direction.
Rust, 85 Bytes
Dies verwendet Vektoren anstelle von Arrays, da es meines Wissens keine Möglichkeit gibt, Arrays mit mehreren unterschiedlichen Längen zu akzeptieren.
quelle
JavaScript, 48 Bytes
quelle
Jq 1,5 , 46 Bytes
Erweitert
Probieren Sie es online!
quelle
PHP, 82 Bytes
Nimmt Eingaben von Befehlszeilenargumenten entgegen und druckt durch Unterstrich begrenzte Prozentsätze.
Laufen Sie mit
-nr
oder versuchen Sie es online .quelle
15_15_15_15_15_25
bei der Eingabe aus[2,2,2,2,3]
, was nicht richtig ist, weil3/13 ~= 23.1%