Wprowadzenie
Jest to oparte na faktycznym problemie, z którym ostatnio miałem do czynienia podczas tworzenia gry komputerowej i pomyślałem, że będzie to dobra runda golfa .
Istnieje siedem głównych klas widmowych gwiazdy, które emitują różne ilości ciepła. Na geologię planet wokół gwiazdy duży wpływ ma ilość ciepła odbieranego z gwiazdy, która jest czynnikiem klasy widmowej i odległości od gwiazdy. Stąd rtęć jest praktycznie stopiona, a Neptun zamrożony.
Galaktyka w mojej grze jest generowana proceduralnie, a losowe wybieranie typów planet dla danych gwiazd okazało się prawdziwym piekłem „jeśli oświadczenie”!
Wyzwanie
Twoja metoda powinna wybrać jedną planetę z listy rodzajów planet odpowiednich dla klasy gwiazdy, na podstawie minimalnego progu ciepła, maksymalnego progu ciepła i liczby losowej. Dla uproszczenia to wyzwanie będzie wykorzystywało tylko gwiazdę klasy G, tak jak nasze słońce.
Wejścia
Liczba całkowita heat
z zakresu od 4 do 11 reprezentująca ilość ciepła otrzymanego przez planetę z gwiazdy.
Zmienne
Ta tabela pokazuje możliwe planety na podstawie heat
. Twoja metoda powinna najpierw zawęzić dostępne opcje w oparciu o ciepło min i ciepło maks., heat
Powinna spaść między nimi. Np. Przy przepływie ciepła 10 jedynymi opcjami byłyby Pustynia, Żelazo i Lawa.
Planet type Heat min Heat max Random Chance
Gas Giant 4 9 15
Ice 4 6 10
Ice Giant 4 6 10
Gaia class 5 7 10
Dense Atmosphere 7 9 10
Desert 7 10 25
Iron 7 10 14
Lava 10 11 6
Następnie prawdopodobieństwo wyboru planety (w pozostałych wyborach) to losowe szanse podzielone przez sumę losowych szans wszystkich wyborów.
W powyższym przykładzie prawdopodobieństwo wyboru żelaza wynosi 14/(25+14+6)
.
Wydajność
Zwraca typ planety jako ciąg.
Zrób co możesz, aby uniknąć logicznych grotów strzałek. Najkrótszy kod wygrywa, punkty za kreatywność. Miłej gry w golfa!
Odpowiedzi:
Galaretka , 78 bajtów
Łącze monadyczne akceptujące liczbę całkowitą (w [4,11] ), która zwraca listę znaków.
Wypróbuj online!
W jaki sposób?
Tworzy zakresy temperatur planet jako listę list i zlicza występowanie ciepła wejściowego na tych listach, aby uzyskać listę zer i jedynek reprezentujących możliwe typy planet, a następnie mnoży się przez liczby prawdopodobieństwa ośmiu typów planet do uzyskać dystrybucję. Rozkład służy do powtarzania nazw typów planet, a na koniec dokonuje się jednolitego losowego wyboru.
źródło
R ,
225223183 bajtówPodziękowania dla Giuseppe za sprytne przefakturowanie w celu zmniejszenia go do 188 bajtów; pozostałe pięć zostało ogolonych przy użyciu mniej zbędnych reprezentacji liczb.
Wypróbuj online!
źródło
with
,data.frame
isubset
będzie krótszy.JavaScript 212
Edytuj 6 bajtów, oszczędzając dzięki Jonathanowi Allanowi
mniej golfa
Test
źródło
[3913, 2630, 2630, 2647, 2681, 6522, 3706, 1707]
)(z/16&15)
jez/16&15
. Niezależnie od tego, można zaoszczędzić 6 bajtów przy użyciu kompresji podstawa 8 z przesunięciami trzy i sześć ... użytku[971,648,648,657,675,1636,932,445]
zz/8&7+3
,z%8+6
az>>6
:)(z/8&7)+4
ponieważ&
ma niższy priorytet - byłoby7/8&(7+4)
Kokos ,
214195 bajtówWypróbuj online!
Port Pythona miałby
203200 bajtów długości:Wypróbuj online!
źródło
Węgiel drzewny ,
115111 bajtówWypróbuj online! Link jest do pełnej wersji kodu. Edycja: Zapisano 4 bajty dzięki tylko @ ASCII. Wyjaśnienie:
Odejmij 3 od wartości wejściowej, aby można ją było porównać z pojedynczymi cyframi.
Podziel ciąg znaków
0715 0410 0410 1510 3710 3825 3814 696
na spacje (spacje wydają się lepiej kompresować niż przecinki, ale nie wypróbowałem żadnych innych znaków) i zapętlaj każdą część.Porównaj dane wejściowe z pierwszą i drugą cyfrą, a jeśli są między nimi, popchnij indeks pętli określoną liczbę razy do predefiniowanej pustej listy, wypełniając ją.
Podziel listę planet na nowe linie (znowu z jakiegoś powodu lepiej niż przecinki) i wybierz element odpowiadający indeksowi wybranemu losowo z listy.
źródło
R ,
196193190175171 bajtówWypróbuj online!
Początkowo zainspirowany tym rozwiązaniem przez @rturnbull, jednak ponieważ oba zgłoszenia znacznie się zmieniły, obecnie jest to w zasadzie mieszanka pomysłów oryginalnego autora, @Giuseppe, który był bardzo pomocny w komentarzach i moim. Oto podsumowanie kluczowych punktów, które pomogły w zmniejszeniu liczby bajtów:
Kodowanie danych planety jako CSVZbieranie nazw wreadLines
celu uniknięcia dużej liczby znaków cudzysłowu wokół ciągów.Poprawianie parametrów cieplnych, abyśmy mogli używać znaków
<
i>
zamiast<=
i>=
.Zmiana formatu danych ciepła zHeat min, Heat max
na,Heat min, Heat Delta
aby pozbyć się cyfr dwucyfrowych.Zastąpiony przez przesunięcie wszystkich liczb o -3
Dzieląc wszystkie prawdopodobieństwa planety przez 5, co również skutkuje kilkoma cyframi.
Pomnożenie wektora prawdopodobieństw planet przez wektor boolean (wskazujący, czy nasze dane wejściowe spełniają wymagania cieplne), aby zniweczyć prawdopodobieństwa nieodpowiednich planet.
Prawdopodobnie można uzyskać jeszcze kilka bajtów, stosując kompresję danych.Myślę, że już nie.
źródło
t=
zamiasttext=
zapisuje również 3 bajty.read.csv
pojedynczej kolumny sugerujereadLines
całkowite pozbycie się cytatów, chociaż trzeba jawnie ustawićn
Python,
282 bajtów, 261 bajtów:Całkiem proste - całkiem pewne, że można by bardziej zagrać w golfa - wciąż szukamy lepszego sposobu na przedstawienie zasięgu i prawdopodobieństwa planety. Jeśli i jest w zasięgu typu planety, dołącza ją do listy zgodnie z prawdopodobieństwem, a następnie losowo ją drukuje.
EDYCJA: Podziękowania dla Jonathana Frecha - przerobiłem pętlę for, aby zrzucić kilka bajtów. Lepszy sposób dodawania elementów do listy
źródło
i in range(x[1], x[2])
wyklucza górnej krawędzi ciepła, w przeciwieństwie do specyfikacji?p,d="Gas Giant,Ice,Ice Giant,Gaia class,Dense Atmosphere,Desert,Iron,Lava".split(","),[ord(i)-10 for i in"#"] d=[[p[x//3]]+d[x:x+3]for x in range(0,len(d),3)]
Oktawa z pakietem statystyk,
178176174158 bajtówKod definiuje anonimową funkcję, która wprowadza liczbę i wyprowadza ciąg znaków.
Wypróbuj online!
Wyjaśnienie
Kod
definiuje anonimową funkcję z wejściem
h
.Ciąg
jest dzielony za pomocą przecinków
Wynikiem jest tablica komórek ciągów, gdzie każdy ciąg jest klasą planety.
Kod
definiuje pokazany ciąg i odejmuje
70
od punktów kodowych jego znaków. Daje to tablicę minimalnych wartości ciepła minus 1 , to znaczy[3 3 3 4 6 6 6 9]
,.Podobnie,
tworzy tablicę maksymalnych wartości ciepła plus 1 , to znaczy
[10 7 7 8 10 11 11 12]
,.Porównania
podaj tablicę zawierającą
true
lubfalse
wskazującą, które klasy planet są możliwe.Z drugiej strony,
definiuje tablicę wartości przypadek,
[15 10 10 10 10 25 14 6]
.Operacja
jest zwielokrotnieniem elementarnym dwóch ostatnich tablic (
true
ifalse
zachowują się odpowiednio0
i1
). Daje to tablicę, w której każda klasa planety ma swoją losową szansę lub0
jeśli ta klasa nie jest możliwa na podstawie danych wejściowych. Ta tablica będzie używana jako wagi w losowym próbkowaniuWywołanie funkcji
wybiera jedną z komórek z tablicy komórek ciągów (pierwszy argument wejściowy), używając obliczonej tablicy wag (czwarty argument wejściowy). W szczególności funkcja
randsample
automatycznie normalizuje wagi do prawdopodobieństw, a następnie dokonuje losowego wyboru z tymi prawdopodobieństwami. Wynikiem jest tablica komórek zawierająca ciąg. Kodsłuży do wyodrębnienia tego ciągu, który stanowi wyjście funkcji.
źródło
Python 3 , 263 bajty
Wypróbuj online!
źródło
Perl 5 (
-p
), 230 bajtówWypróbuj online!
źródło
[Ice,4,5,11]
zamiast[Ice,4,6,10]
, itp.), Będziesz mógł użyć<
zamiast<=
i>
zamiast>=
, oszczędzając w ten sposób 2 bajty. (tak, to nie dużo ...)Nim ,
294 bajtów314298Dla pętli teraz w jednej linii, bez powrotu, mniej bajtów do typu niejawnego
4 spacje usunięte (dzięki Kevin )
Wypróbuj online!
źródło
Nim
, ale myślę, że możesz grać w golfa na czterech polach: w jednymfor n in[(
; i trzy oif h>=n[1]and h<=n[2]
.05AB1E ,
7876 bajtówWypróbuj online!
Wyjaśnienie
”Œï²°™Ä²° Gaia classêη•™Äµ‰Ÿ± Lava”
popycha sznur
Gas Giant Ice Giant Gaia class Dense Atmosphere Ice Desert Iron Lava
źródło
Python 3,
199194 bajtówPodział
h
na osobne maski bitowe i losowe wartości szans (patrz wyjaśnienie) pozwala zaoszczędzić kilka bajtów, eliminując przypisanieh
i upraszczającrange()
rozumienie listy.Poprzednie rozwiązanie
Definiuje anonimową funkcję, która przyjmuje liczbę całkowitą i zwraca typ planety.
Dla każdego typu planety obliczono wartość 13-bitową. 8 górnych bitów definiuje maskę bitową prawidłowych wartości ciepła dla tego typu planety. Dolne 5 bitów to losowa szansa dla tego typu planety. Na przykład „klasa Gaia” jest poprawnym typem dla wartości ciepła od 4 do 7, więc ma maskę
0b00001111
. Ma losową szansę 10 lub0b01010
. Łącząc je, otrzymujemy 13-bitową wartość0b0000111101010
dla typu „klasa Gaia”. 13-bitowe wartości dla każdego typu planety są łączone w celu uzyskania wartościh
(najniższe 13 bitów dotyczy typu planety „Lód”). (Nowsza odpowiedź nie łączy tych wartości).Zrozumienie listy iteruje wartości 13-bitowe, aby utworzyć listę wag, gdzie waga jest przypadkową szansą, jeśli typ planety jest prawidłowym wyborem dla danej wartości ciepła, a zero w przeciwnym razie. Dla każdego typu planety
(h>>i&31)
wyodrębnia losową szansę dla tego typu planety.(h>>i+n+1&1)
ocenia na 1, jeśli typ planety jest prawidłowym wyborem dla wartości ciepła,n
a w przeciwnym razie ocenia na 0.Funkcja biblioteczna
random.choices(choices, weights)
wybiera element z listy opcji na podstawie listy wag.źródło
i+n+1
może byći-~n
. TIORubin ,
214 193189 bajtówWypróbuj online!
źródło
Haskell ,
377364358318312270265262256251 bajtów(Dodałem łamanie wierszy, aby wydruk był ładniejszy). Zadaniem mówi „zwrot”, a nie „drukuj”, więc
f
jest to funkcja, która zwraca losowo wybraną nazwę planety doIO
monady,f :: Int -> IO String
.main
Jestmain = do {f 10 >>= print}
( Haskell wskazówek golfa mówi, że to się nie liczy). Wydruki(edycje: usunięto
&
„s przypadek bazowy; przeniósłmain
się; zmieniło się czterokrotnie iunzip
, i włączony do strażników wzór i>>=
następujące propozycje z Laikoni dzięki !; wdrożone podejście z roztworem Jelly zamiast, powtarzając nazwy; wyraźny typ nie jest już potrzebna ; kolejna rada Laikoni pozwala zaoszczędzić 3 bajty; uczyniła jąIO
funkcją; zaimplementowana rada z pokoju rozmów).Wypróbuj online!
źródło
Java 8,
398384 bajtówZ pewnością można go jeszcze trochę pograć w golfa, ale prawdopodobieństwo w połączeniu z ciągami nie jest bardzo łatwe w Javie.
Wyjaśnienie:
Wypróbuj online.
źródło
Min ,
280277 bajtówZaczyna się od ciepła na stosie, pozostawia sznur na stosie. Taki sam ogólny proces jak w przypadku odpowiedzi w języku Python 2.
Wyjaśnienie
Zauważ, że min jest konkatenatywny
źródło
PowerShell, 56 + 135 (plik CSV) + 1 (nazwa pliku) = 192 bajty
Wypróbuj online! (jest to nieco zmodyfikowana wersja, która tworzy tymczasowy plik CSV opisany poniżej)
Importuje plik CSV za pomocą
ipcsv
(skrót odImport-CSV
) o nazwiea
w katalogu lokalnym, który zawiera:To automatycznie tworzy iterowalną tablicę skrótów takich rzeczy jak:
Następnie używamy
Where-Object
(?
), aby wyciągnąć te wpisy, w których naszą wejściową liczbą całkowitą$z
jest-in
zakres$_.m
do$_.x
(tzn., Że jest w zakresie ciepła). Następnie pompujemy je doForeach-Object
pętli (%
), która tworzy tablicę ciągów nazw na podstawie losowej szansy tych nazw. Na przykład utworzy to tablicę15
"Gas Giant"
ciągów, jeśli to ciepło się zgadza. Następnie wkładamy te, wGet-Random
które wyciągną odpowiedni sznurek o odpowiedniej wadze.źródło
PHP , 1236 bajtów
Wypróbuj online!
źródło