Napisz funkcję, która pobiera listę liczb całkowitych dodatnich i zwraca listę liczb całkowitych zbliżonych do procentu całkowitego dla odpowiedniej liczby całkowitej w tej samej pozycji.
Wszystkie liczby całkowite na liście zwrotów muszą się sumować dokładnie do 100. Możesz założyć, że suma liczb całkowitych przekazanych jest większa niż 0. To, jak chcesz zaokrąglać lub obcinać ułamki dziesiętne, zależy od Ciebie, o ile dowolna wynikowa liczba całkowita zwracana jest w procentach jest wyłączony o nie więcej niż 1 w dowolnym kierunku.
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]
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach!
code-golf
array-manipulation
DaveAlger
źródło
źródło
p([2,2,2,2,2,3])
. Ma wiele możliwych odpowiedzi prawnych, ale nie wszystkie2
można przypisać do tej samej wartości. Eliminuje to wiele zbyt prostych algorytmów, które działają na wszystkich poprzednich testach, ponieważ zaokrąglanie nie jest takie złe.p([1000,1000]) -> [49,51]
?Odpowiedzi:
Dyalog APL,
211916 bajtówPowyżej jest odpowiednikiem pociągu
Wypróbuj online.
Jak to działa
źródło
TI-BASIC,
262316 bajtówDo kalkulatorów serii TI-83 + / 84 +.
Dzięki @Dennis za piękny algorytm! Skumulowaną sumę listy bierzemy po przeliczeniu na procenty, a następnie na podłogę, zaznaczamy 0 z przodu i przyjmujemy różnice.
ᴇ2
jest o jeden bajt krótszy niż100
.Przy tej samej liczbie bajtów jest:
Ciekawostka:
%
to dwubajtowy token, który mnoży liczbę przez 0,01 - ale nie ma sposobu, aby wpisać ją do kalkulatora! Musisz albo edytować źródło na zewnątrz, albo użyć programu asemblera.Stary kod:
Pierwszy wiersz oblicza wszystkie zmienne procentowe, następnie drugi wiersz dodaje 1 do pierwszych
N
elementów, gdzieN
jest pozostały procent.cumSum(
oznacza „sumę skumulowaną”.Przykład z
{1,1,2,4}
:Nie będziemy tego robić
N>dim([list]
, ponieważ żaden procent nie zmniejsza się o więcej niż 1 w podłogach.źródło
int(
,sum(
,Ans
, itp) zajmują tylko jeden bajt.%
symbol? Myślałbym, że można go znaleźć w katalogu symboli ... Powinienem też wyciągnąć mój TI-84 + Silver. Nie używałem tego od dłuższego czasu. Block Dude jest niesamowity.CJam,
252322 bajtówDzięki @ Sp3000 za 25 → 24.
Wypróbuj online.
Jak to działa
źródło
Mathematica, 41 bajtów
źródło
N
elementów, gdzieN
jest pozostały procent.J (8,04 beta) , 59 bajtów (30 skradzionych bajtów)
30-bajtowy dosłowny port J odpowiedzi Dennisa na APL :
59 bajtów odpowiedzi, najlepiej jak mogłem zrobić:
(Na podstawie reszty, która musi przejść do najwyższych wartości, nie więcej niż +1 każda, podzielona na wiele wartości w przypadku reszty> 1 lub remisu dla najwyższej wartości).
na przykład
Wyjaśnienie
f=.3 : 0
- „f” jest zmienną, która jest typem czasownika (3), zdefiniowanym poniżej (: 0):p=.
zmienna „p”, zbudowana z:y
to lista liczb1 0 2
+/y
to „+” wstawiane pomiędzy każdą wartość ”/”, suma listy3
y % (+/y)
to oryginalne wartości y podzielone przez sumę:0.333333 0 0.666667
100 * (y%+/y)
jest 100x tych wartości:33.33.. 0 0.66...
aby uzyskać wartości procentowe.<. (100*y%+/y)
to operator podłogi zastosowany do wartości procentowych:33 0 66
r=.
zmienna „r”, zbudowana z:+/p
jest sumą liczb zmiennoprzecinkowych:99
100 - (+/p)
wynosi 100 - suma lub pozostałe punkty procentowe potrzebne do sumowania wartości procentowych do 100.r $ 1
jest listą 1, o ile liczba elementów, które musimy zwiększyć:1 [1 1 ..]
#p
jest długością listy procentowej(#p - r)
to liczba elementów, które nie zostaną zwiększone(#p-r) $ 0
jest listą zer, o ile się to liczy:0 0 [0 ..]
((r$1) , (#p-r)$0)
jest lista 1s, po której następuje lista 0:1 0 0
\: p
to lista indeksów, z których należy pobrać,p
aby uporządkować je w kolejności malejącej./: (\:p)
to lista indeksów, z których należy wziąć\:p
porządek w porządku rosnącym((r$1),(#p-r)$0)/:\:p
bierze elementy z 1 1 0 0 .. .. Lista maska i sortowania więc istnieje 1s w pozycjach największych procentowe, po jednym dla każdej liczby musimy przyrostu i 0s do innych numerów:0 0 1
.p + ((r$1),(#p-r)$0)/:\:p
to wartości procentowe + maska, aby utworzyć listę wyników, która sumuje się do 100%, która jest wartością zwracaną przez funkcję.na przykład
i
)
koniec definicji.Nie mam dużego doświadczenia z J; Nie zdziwiłbym się, gdyby była wbudowana „lista zwrotów na procenty całkowitej” operacji i czystszy sposób na „zwiększenie n największych wartości”. (To 11 bajtów mniej niż moja pierwsza próba).
źródło
list[0:100-n] + list[:-100-n]
podejście - i nie pomyślałem o innym sposobie podejścia.JavaScript (ES6), 81 bajtów
Ten warunek „musi być równy 100” (zamiast zaokrąglać i sumować) prawie podwoił mój kod (z 44 do 81). Sztuczka polegała na dodaniu puli dla wartości dziesiętnych, która, gdy osiągnie 1, bierze 1 od siebie i dodaje ją do bieżącej liczby. Problemem były wtedy zmiennoprzecinkowe, co oznacza, że coś w rodzaju [1,1,1] pozostawia resztę 0,9999999999999858. Więc zmieniłem czek na większy niż .999 i postanowiłem nazwać to wystarczająco precyzyjnie.
źródło
Haskell,
4227 bajtówPraktycznie prosta metoda w Haskell, z kilkoma miejscami do gry w golfa.
Konsola (w nawiasie podano spójność z przykładem):
Edycja: ćwiczyłem moje stawianie, dokonałem oczywistych zamian.
Oryginalny:
źródło
Galareta , 7 bajtów
-2 dzięki Dennisowi, przypominając mi o użyciu innej nowej funkcji (
Ä
) i używania:
zamiast tego, co początkowo miałem.Wypróbuj online!
Galaretka , 11 bajtów
Wypróbuj online!
Sporządzono wraz z Cairnem coinheringaahing i użytkownikiem202729 na czacie .
Jak to działa
źródło
Haskell,
635655 bajtówźródło
Perl, 42 bajty
Na podstawie algorytmu Dennisa
Obejmuje +1 dla
-p
Uruchom z listą numerów na STDIN, np
percent.pl
:źródło
Oktawa, 40 bajtów
źródło
Python 2, 89 bajtów
źródło
Brain-Flak , 150 bajtów
Wypróbuj online!
Począwszy od końca i pracując wstecz, ten kod zapewnia na każdym etapie, że suma dotychczasowych liczb wyjściowych jest równa całkowitej napotkanej wartości procentowej, zaokrąglonej w dół.
źródło
JavaScript (ES6) 60
63 95Dostosowane i uproszczone na podstawie mojej (złej) odpowiedzi na inne wyzwanie
Dziękujemy za @ l4m2 za odkrycie, że to też było złe
Naprawiono zapisywanie 1 bajtu (i 2 bajtów mniej, nie licząc nazwy
F=
)Przetestuj poniższy fragment kodu w dowolnej przeglądarce zgodnej z EcmaScript 6
źródło
[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.
Rdza, 85 bajtów
Używa to wektorów zamiast tablic, ponieważ o ile mi wiadomo, nie ma możliwości zaakceptowania tablic o wielu różnych długościach.
źródło
JavaScript, 48 bajtów
źródło
Jq 1,5 , 46 bajtów
Rozszerzony
Wypróbuj online!
źródło
PHP, 82 bajty
pobiera dane z argumentów wiersza poleceń, drukuje wartości procentowe rozdzielone znakiem podkreślenia.
Uruchom
-nr
lub wypróbuj online .źródło
15_15_15_15_15_25
gdy podano dane wejściowe[2,2,2,2,3]
, co jest nie tak, ponieważ3/13 ~= 23.1%