Bieg do dołu
Utwórz program, który generuje tablicę o losowej długości z liczbami losowymi, a następnie zastosuj szereg reguł, które zmieniają tablicę. Po zastosowaniu reguł wydrukuj sumę tablicy, chyba że określono inaczej
Konfiguracja macierzy
Tablica musi mieć losową długość od 5 do 10 włącznie, z losowymi liczbami całkowitymi od 1 do 20 włącznie. Każda długość tablicy powinna mieć jednakowe prawdopodobieństwo wystąpienia, a każda liczba całkowita powinna mieć równe prawdopodobieństwo pobrania na element.
7 zasad
Reguły powinny działać tak, jakby były stosowane kolejno (np. Reguła 1 działa przed regułą 2) i są stosowane tylko raz. W celu potwierdzenia zastosowania reguły tablica musi zostać wydrukowana w konsoli po każdej aplikacji reguły i raz przed zastosowaniem jakichkolwiek reguł.
- Jeśli tablica zawiera 7, odejmij 1 od każdego elementu
- Jeśli reguła 1 zostanie zastosowana, a tablica zawiera teraz 0, dodaj 1 do każdego elementu
- Jeśli tablica zawiera 13, wyklucz 13 i wszystkie kolejne elementy z tablicy
- Jeśli tablica zawiera 2, wyklucz wszystkie nieparzyste liczby
- Jeśli tablica zawiera 20, a trzeci element jest parzysty, zwróć 20 jako sumę, a następnie zakończ. Jeśli występuje 20, a trzeci element jest nieparzysty, zwróć 20 razy długość tablicy jako sumę, a następnie zakończ.
- Jeśli suma jest większa niż 50, usuwaj ostatni element wielokrotnie, aż będzie mniejszy lub równy 50
- Jeśli tablica zawiera 16, wypisz sumę zarówno w systemie dziesiętnym, jak i szesnastkowym.
Przykład
Oto tablica początkowa,
[20, 2, 5, 7, 14, 8]
Regułę 1 można zastosować:
[19, 1, 4, 6, 13, 7]
Następnie stosuje się zasadę 3:
[19, 1, 4, 6]
Żadne inne reguły nie są potrzebne, więc program zwraca 30 jako sumę.
Notatki
- Nie jestem doświadczonym golfistą, chociaż mogę powiedzieć, że mój osobisty rekord znajduje się w Pythonie 3 z 369 bajtami .
- Reguły nie muszą być faktycznie stosowane w kolejności, ale muszą działać tak, jakby miały.
źródło
[3 3 3 3 4 3]
i[4 4 3 4 4]
każda z prawdopodobieństwem 50% jest zgodna z tym, co napisano w „ustawieniach tablicy”. Więc mogę po prostu wysyłać za19
każdym razem? (Oczywiście, tak naprawdę uważam, że należy wyjaśnić definicję „losowego”).If the array contains a 20, and the third element is even/odd
, co jeśli tablica zawiera mniej niż 3 elementy na tym etapie?Odpowiedzi:
Python 3,
294301287356 bajtówNie wiem, w jaki sposób zapobiegniesz obchodzeniu reguł przez ludzi, ale w tym przypadku wykorzystano określoną procedurę.
+7 bajtów; dzięki @YamB za zaoszczędzenie kilku bajtów; dodano wiele więcej, aby naprawić poprzedni błąd.
-14 bajtów dzięki @RootTwo i mnie, a także poprawiłem błąd.
+83 bajtów; robi się to strasznie długo, ponieważ OP ciągle zmienia zasady. - pewna liczba bajtów dzięki @ZacharyT
źródło
k=[r(1,20)for _ in'-'*r(5,11)]
. Możesz zapisać kolejny bajt, używająck=[i+~-(1in k)*(7in k)for i in k]
reguł 1 i 2.1
i możesz zmienićprint
drugą i trzecią na ostatnią linię nap
. I ... nie zaktualizowałeś swojego bytecount.05AB1E , 91 bajtów
Wypróbuj online! lub z wejściem
źródło
JavaScript (ES6),
344342340342335331333313311305298297290289283279 bajtówHuzzah! Wreszcie
związany zdudnienia Arnauld !Po tej wymianie * w komentarzach wyzwania i po długich rozważaniach postanowiłem użyć
new Date
jako źródła dla generatora liczb losowych zamiastMath.random()
. Oznacza to, że wszystkie liczby całkowite w tablicy będą miały tę samą wartość.Spróbuj
Array(x).fill()
je[...Array(x)]
.+1
z~
.0
zwrócenie pustej tablicy.while
pętlę.,
ostatnie 2 instrukcje a|
i usuwając załączające()
.console.log
jealert
.a.includes()
.includes()
i wykorzystującindexOf()
cały czas.s
zmiennej do miejsca, w którym nie potrzebował przecinka.Math.random()
jenew Date
.Wersja do odczytu i testowania
console.log
zamiastalert
dla twojego zdrowia psychicznego! (Najlepiej oglądać w konsoli przeglądarki)Pokaż fragment kodu
* Zrzut ekranu, w przypadku jego usunięcia:
źródło
C (gcc) ,
621619593585570562557552529517500482461444442441438 bajtówPotrzebna jest tutaj cała gra w golfa ... Naprawiono błąd, w którym drukowałby szesnastkowy raz na każde 16 na liście ...
Specjalne podziękowania dla ZacharyT z pomocą golfa
Wypróbuj online!
źródło
JavaScript (ES6),
296295290289 bajtówPełny program, który rejestruje tablicę początkową, wyniki pośrednie i ostateczną sumę do konsoli.
Jak to działa
Zostało to skompresowane przy użyciu tego pakera JS .
Awaria:
226225 bajtów6964 bajtówPoniżej znajduje się oryginalny kod źródłowy z dodatkowymi białymi znakami i wierszami dla zwiększenia czytelności. Zamiast stosowania standardowych sztuczek golfowych, został napisany w taki sposób, aby uzyskać jak najwięcej powtarzających się ciągów, aby zadowolić pakującego. Na przykład składnia
if(k=~a.indexOf(N))
jest powielana wszędzie, chociażk
jest używana tylko w trzeciej regule.Metody rozpakowywania
Oryginalny kod rozpakowywania to:
Wszystkie następujące warianty ES6 mają dokładnie ten sam rozmiar:
Jedyny sposób, w jaki do tej pory udało mi się ogolić kilka bajtów, to użycie
for ... of
:źródło
n&1^1
(nie pakuje się wcale, ale jest tylko jeden bajt krótszy niż!(n&1)
). Pomyślałem o tym w pewnym momencie i zapomniałem to załączyć.Najpierw spróbuj golfa code!
Już pobity przez innych javascripters! Cholera! Ulepszę!!! =)
JavaScript ->
550402 bajtówZdecydowanie można poprawić. Skompresowane teraz:
Pierwotny:
źródło
Java 7,
622619618 bajtów-1 bajt dzięki @Poke
Wyjaśnienie:
Przykładowe wyniki:
Komentarze za przykładowymi wynikami nie są drukowane, ale dodałem je jako wyjaśnienie.
Wypróbuj tutaj.
źródło
List a = new ArrayList()
? Może zaoszczędzić trochę bajtów. Jednak może być konieczne dodanie rzutowania typu podczas wykonywania rzeczywistej arytmetyki. Jeśli nie,Long
jest krótszy niżInteger
List
muszę użyć(int)
obsady pięć razy, a także zmienić pętlę dla każdego zint
naObject
i dodać szóstą obsadę. Co doLong
: dzięki, to oszczędza 1 bajt :) (wciąż muszę zmienić for-each zint
nalong
ir.nextInt(20)+1
nar.nextInt(20)+1L
).Ruby 2.4, 260 bajtów
Wymagany jest Ruby 2.4
Enumerable#sum
.Wypróbuj online! (Ani repl.it ani tio.run nie obsługują jeszcze Ruby 2.4, więc ta wersja online zamienia
sum
się nainject(:+)
, która ma takie samo zachowanie.)źródło
R (3.3.1), 325 bajtów
Całkiem naiwne wdrożenie; Myślę, że prawdopodobnie mogę to trochę skrócić.
źródło
PowerShell ,
525413 bajtówWypróbuj online!
Chciałem spróbować tego, choć doszedłem do wniosku, że już tutaj nie pobiję odpowiedzi: PI próbowałem jeszcze zagrać w golfa, jestem pewien, że jest to możliwe przy mniejszej liczbie bajtów. Znalazłem lepszą metodę dla heksów, ale prawdopodobnie mogłaby się jeszcze poprawić.
Musiałem rzucić
$a
na ciąg tyle razy, że lepiej było stworzyć dla niego filtr ...Było kilka łatwych golfów, za którymi tęskniłem, takich jak nawiasy i spacje. Czy nadal może być jakiś?
Nieco łatwiejszy do odczytania kod:
źródło
MATLAB, 275 bajtów
Pierwotnie planowałem być może odpowiedź na jedno-liniowe oktawę, ale wymaganie danych wyjściowych od wszystkich zastosowanych reguł pokrzyżowało moje plany. Zamiast tego dość prosta odpowiedź MATLAB z kilkoma interesującymi optymalizacjami, np. Użycie
cumsum
zamiast oczywistejwhile
dla reguły 6. Mimo to wiele s bajtów marnuje się naif
s, aby zapobiec wyjściu, jeśli reguła nie zostanie zastosowana.Wypróbuj online!
źródło
Scala 587 bajtów jedna wkładka
Scala, 763 bajtów, jak jest
źródło
a: Array[T]
potrzeba miejsca? Nie masz miejscaargs:Array[String]
, co spowodowało moje zapytanie.MATLAB,
228 241bajtówSpowoduje to zastosowanie wszystkich reguł w kolejności, drukując wartość tablicy po każdym kroku.
Program zawiesi się na zasadzie 5, jeśli wynikowa liczba elementów jest mniejsza niż trzy. Obecnie nie ma nic do powiedzenia, co powinno się stać, jeśli nie ma trzeciego elementu, więc zakładam, że awaria jest dopuszczalna.Program wydrukuje teraz 20, jeśli jest mniej niż 3 elementy, a jeden lub więcej to 20.Co ciekawe krok 2 można zastosować niezależnie od tego, czy był to krok 1. Wynika to z faktu, że tablica wejściowa nigdy nie będzie miała wartości 0, co oznacza, że jeśli w tablicy znajdują się jakieś zera, musi to wynikać z kroku 1.
Wszystkie reguły są stosowane kolejno, aż do 5, nawet jeśli nie zostaną wprowadzone żadne zmiany. W rezultacie tablica zostanie wydrukowana na początku, a następnie po każdym kroku do 5. Po kroku 5 albo otrzymasz sumę, jeśli zostanie zastosowana, albo nie otrzymasz danych wyjściowych do kroku 6. Dodatkowy wiersz zawierający
a
można dodać po instrukcja else, aby upewnić się, że wartość tablicy jest drukowana po kroku 5 kosztem 2 bajtów.Chciałbym również wspomnieć, że nie spojrzałem na inne odpowiedzi, dopóki nie napisałem tego. Widzę teraz, że istnieje inna odpowiedź MATLAB z pewnymi podobieństwami - wszystkie są przypadkowe.
źródło
Python 3,
297 293 289,278bajtówJak zauważył Arnauld, nie możesz dostać 0, chyba że zastosowana zostanie reguła 1, co zaoszczędziło wcięcia. Dziękujemy wszystkim innym, którzy również komentowali sugestie.
Wypróbuj online
źródło
and
i~
.from random import* a=b=sample(range(1,20),randint(5,10))
zapisuje kilka bajtów, ponieważ można usunąć wiersz 2.Perl 6 , 246 bajtów
Nie golfowany:
źródło
Common Lisp, 490 bajtów
Tutaj tablica jest reprezentowana jako wspólna lista Lisp.
Jak zwykle duże zastosowanie
and
ior
jako struktury kontrolne.źródło