Wprowadzenie
Biorąc pod uwagę zestaw procentowy wyborów w ankiecie, oblicz minimalną liczbę wyborców, którzy muszą być w ankiecie, aby wygenerować te statystyki.
Przykład: jakie jest twoje ulubione zwierzę domowe?
- Pies:
44.4%
- Kot:
44.4%
- Mysz:
11.1%
Wynik: 9
(minimalna możliwa liczba wyborców)
Okular
Oto wymagania dotyczące Twojego programu / funkcji:
- Otrzymujesz tablicę wartości procentowych jako dane wejściowe (na stdin, jako argument funkcji itp.)
- Każda wartość procentowa jest liczbą zaokrągloną do jednego miejsca po przecinku (np
44.4 44.4 11.1
.). - Oblicz minimalną możliwą liczbę wyborców w ankiecie, których wyniki dałyby dokładnie te wartości procentowe po zaokrągleniu do jednego miejsca po przecinku (na wyjściu standardowym lub wartości zwracanej przez funkcję).
- Premia : -15 znaków, jeśli możesz rozwiązać w sposób „nietrywialny” (tzn. Nie wymaga iteracji przez każdą możliwą liczbę wyborców, dopóki nie znajdziesz pierwszego, który działa)
Przykład
>./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
Punktacja
To jest golf golfowy, więc wygrywa najkrótsza możliwa postać. Wszelkie bonusy są odejmowane od całkowitej liczby postaci.
code-golf
math
reverse-engineering
mellamokb
źródło
źródło
26.7 53.3 20.0
(4 8 3 z 15),48.4 13.7 21.6 6.5 9.8
(74 21 33 10 15 z 153) itd.0.5%
z sumy i za każdym razem, gdy następuje zaokrąglanie w górę, sumujesz0.5%
do sumy. Ostatnie cztery przypadki testowe zostały celowo skonstruowane w celu optymalnego wykorzystania tego zjawiska. W pierwszym przypadku testowym, który daje wynik2000
, każdy z pierwszych 9 wpisów reprezentuje1
głos (i wszystkie są zaokrąglane w górę0.5%
), podczas gdy ostatni reprezentuje1991
głosy (i jest zaokrąglany w dół ~0.5%
). Jeśli obliczasz te wartości procentowe ręcznie i zaokrąglasz do 1 miejsca po przecinku, zobaczysz, że wszystkie są poprawne.Odpowiedzi:
APL (Dyalog Classic) ,
4843 bajtów-5 bajtów autorstwa Adáma
Pełny program pobiera dane wejściowe ze standardowego wejścia.
Wypróbuj online! Link jest do wersji dfn.
Nie golfił
Wypróbuj online!
normalize
dzieli (÷
) wszystkie elementy swojego prawego argumentu (⊢
) przez sumę (+/
).round(y)
zaokrągla y do 3 miejsc po przecinku, formatując (⍕
), a następnie oceniając (⍎
) każdy element y.find_max(y)
zwraca tablicę z 1, gdzie znaleziono max (y) i 0 w innym miejscu.increase(x,y)
bierze x (procent bramek) iy (tablica bieżących sum głosów) i oblicza, gdzie dodać 1 w y, aby przybliżyć wartości procentowe do x.vote_totals(x,y)
przyjmuje x (procent bramek) i y (sumy głosów początkowych) i wykonuje f wielokrotnie, dodając głosy aż do zaokrągleń procentowych do x.f ⍣ g
oznaczaf
powtarzanie do momentu, ażg(y,f(y))
będzie prawdziwe. W tym przypadku ignorujemyf(y)
.h(x)
ustawia y na 0 (odpowiednik tablicy zer z powodu wektoryzacji), wykonuje g i sumuje końcowe głosy.źródło
Python, 154
Działa teraz dla ostatniego przykładu.
Przykładowe przebiegi:
źródło
99.1
o ostatnią wartość1/2000 = 0.05%
(0.1%
zaokrąglony) i1991/2000 = 99.55%
(99.6%
zaokrąglony). Jeśli więc w ankiecie jest dziesięć opcji, a dziewięć z nich zostanie poddanych głosowaniu raz, a ostatnia uzyska 1991 głosów, to dałoby to te wartości procentowe.J, 57 znaków
Zastosowano trywialną metodę. Wymaga danych z klawiatury.
t
tworzy tabelę przeglądową, a druga linia szuka danych wejściowych w tabeli. Jeśli ktoś jest zainteresowany, mogę dostarczyć rozszerzone wyjaśnienie kodu.Zastanawiałem się nad wykorzystaniem procentu do utworzenia ułamka, a następnie otrzymałem najniższą formę ułamka, aby obliczyć liczbę, ale nie mogłem wymyślić sposobu, aby działał z zaokrąglaniem wyników.
źródło
Python, 154
źródło
[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%
zaokrąglony) i1991/2000 = 99.55%
(99.6%
zaokrąglony). Tak więc w rzeczywistości wynosi 100%, ale zaokrąglenie sprawia, że jest to naprawdę mylące.VBA - 541
Wystąpiły pewne rażące błędy, ale to była moja próba znalezienia rozwiązania, które nie jest trywialne / zapętla się, aż dostanę odpowiednią liczbę. Nie w pełni grałem w golfa, choć nie sądzę, aby można było wiele dodać w tym względzie. Jednak spędziłem za dużo czasu i boli mnie to teraz. Nie wspominając o tym, że reguły są prawdopodobnie bardzo złamane i dotyczą mniej więcej tylko tych przykładów.
Działa to bardzo dobrze w przypadku wielu prostych testów, które przeprowadziłem (tj. Nawet sumy, 2 lub 3 dane wejściowe), ale nie udaje się to w przypadku niektórych testów przedstawionych przez wyzwanie. Odkryłem jednak, że jeśli zwiększysz dokładność dziesiętną danych wejściowych (poza zakresem wyzwania), dokładność poprawi się.
Znaczna część pracy polega na znalezieniu gcd dla podanego zestawu liczb, a ja w pewnym sensie to przeszedłem
Function g()
, chociaż z pewnością jest niekompletne i prawdopodobnie źródłem przynajmniej niektórych błędów w moich wynikach.Dane wejściowe to ciąg wartości rozdzielany spacjami.
Przypadki testowe (dane wejściowe ==> oczekiwane / zwrócone):
źródło
Debug.Print
naDebug.?
C # (.NET Core) , 286 bajtów
Wypróbuj online!
Zaoszczędzono wiele bajtów dzięki Peterowi Taylorowi i Embodiment of Ignorance
źródło
}
na końcu brakuje .Zip
metody Linq .1>0
jest krótszy niżtrue
, jest preferowany.Python 3 ,
140139137 bajtówWypróbuj online!
Podaje prawidłową odpowiedź dla dwóch pierwszych przypadków testowych i dla innych odpowiada limitom rekurencji w Pythonie. Nie jest to bardzo zaskakujące, ponieważ każda kontrola jest przeprowadzana na nowym poziomie rekurencji. Jest jednak krótki ...
(Wyjaśnienie używanych zmiennych można znaleźć w linku TIO)
powinien działać dla 136 bajtów, ale nie działa z powodu precyzji zmiennoprzecinkowej.
źródło