Wyzwanie
Pracownicy fabryczni są zwykle bardzo pracowici. Jednak ich prace są obecnie powszechnie zastępowane maszynami.
Musisz napisać program, który przyjmuje liczbę jako dane wejściowe. 10 razy wydrukuje fabrykę 10 pracowników. Za każdym razem każdy pracownik ma1/input
szansę zostać „zwolniony” i zastąpiony przez maszynę.
Wejście
Liczba całkowita, pochodząca ze STDIN lub wywołania funkcji.
Wynik
10 przypadków w fabryce, z których każdy zatrudnia zwykle więcej pracowników.
Format wyjściowy - jak wydrukować fabrykę
Fabryka wygląda następująco:
|0000000000|
lub |0000011001|
Rura reprezentuje ściany, 0 oznacza pracownika, a 1 oznacza maszynę, więc zawsze będzie pierwszy wydruk fabryki |0000000000|
.
Przykład
Wejście: 10
Wynik:
|0000000000| //always start off with this
|0000000010| //a 1/10 chance means that this worker lost his job
|0000010010|
|0010010010|
|1010010010|
|1010110010|
|1010110011|
|1010111011|
|1010111111|
|1110111111|
Wejście: 5
Wynik:
|0000000000| //always start here
|0000001001| //a 1/5 chance means that 2 workers got fired
|1000101001|
|1000101111|
|1101101111|
|1111111111| //after achieving all machinery, the machines continue to be printed
|1111111111|
|1111111111|
|1111111111|
|1111111111|
UWAGA
Liczba zwolnionych pracowników to RANDOM - w moich przykładach 1/5 chance
zawsze będą zwolnieni 2 pracownicy, ale twój program musi to zrobić losowo - czasami 1, a czasem 3 - mają tylko 1/5 szansy na zwolnienie.
Odpowiedzi:
Japt
-R
,2221201918 bajtówSpróbuj
Wyjaśnienie
źródło
R ,
9289 bajtówWypróbuj online!
Nie golfowany:
źródło
replicate
ifor
pętli bez powodzenia, ale dzięki waszym wskazówkomDo-while loops
, w końcu uświadomiłem sobie, jak{
potencjalnie nadużywanie tego. Rozszerzyłem to nadużycie na przykładfor()
dla rozwiązania o wielkości 92 bajtów. Być może już zdałeś sobie sprawę z konsekwencji{
nadużyć, kiedy pisałeś ten post, ale zdałem sobie z tego sprawę. tio.run/##K/r/…"for"
prawie zawsze nie jest lepszafor
, a czasami gorsza !pmax
można użyć. Oto moja wcześniejsza uwaga na temat{
operatora. tio.runJavaScript (ES6), 84 bajtów
Wypróbuj online!
Wersja rekurencyjna, 88 bajtów
Wypróbuj online!
W jaki sposób?
Zaczynamy od k = s = „5000000000” .
Przy każdej iteracji:
Mamy przymusić każdy znak í z s do numeru, obliczyć i modulo 5 - tak, że prowadzący 5 jest traktowane jak 0 - losowo wykonać bitowym OR z 1 z oczekiwanego prawdopodobieństwa 1 / n , z wyjątkiem pierwszej iteracji .
Licznik k jest przesunięty w prawo o 3 bity. Natychmiast zatrzymujemy rekurencję k = 0 , co daje 10 iteracji.
Należy zauważyć, że 5000000000 jest nieco większa niż 32-bitowa liczba całkowita, więc jest domyślnie konwertowana na 5000000000 i 0xFFFFFFFF = 705032704 tuż przed wystąpieniem pierwszego przesunięcia bitowego. Stąd następujące kroki:
źródło
APL (Dyalog) , 37 bajtów
Wypróbuj online!
W jaki sposób?
10⍴0
- zacznij od 10 zer.⎕←' '~⍨⍕'|'⍵'|'
- za każdym razem drukuj sformatowaną tablicę,?10⍴⍺
- generuje losową tablicę z wartościami1
wejściowymi,⍺=
- porównanie elementów z danymi wejściowymi. powinien oznaczać1
/ wprowadzać elementy, podając za1
każdym razem wejście /,⍵+
- dodaj do tablicy,×
- signum. zero pozostaje zerem, wszystko większe niż jeden wraca do jednego.⍣10
- powtórz 10 razy.źródło
Siatkówka , 30 bajtów
Wypróbuj online!
Mam dużo zabawy z przypadkowością w Retina ^^
Wyjaśnienie
Pierwszy etap konfiguruje ciąg znaków, z którym będziemy pracować:
Zastępuje całe dane wejściowe
|
znakiem nowej linii, a następnie 10 wierszy zawierających tyle samo0
s, ile mówi dane wejściowe. Pierwszy znak w każdej linii będzie reprezentował pracownika fabryki.Następny etap oznacza:
Pierwszy wiersz ciągu roboczego zawiera tylko a
|
, który będzie pierwszym znakiem drukowanym przy każdej iteracji pętli (będącym pierwszym znakiem pierwszego wiersza), i będzie także drukowany na końcu każdej iteracji (będący pierwszym znak całego łańcucha). Zastąpienie nigdy nie będzie miało żadnego wpływu na tę linię, ponieważ nie zawiera żadnej cyfry.Każda inna linia zawiera
n
cyfry, więc istnieje 1n
szansa na przekształcenie pierwszego znaku linii (który jest jedynym znaczącym) na znak1
.źródło
PowerShell ,
828069 bajtówWypróbuj online!
Pobiera dane wejściowe
$x
. Tworzy tablicę wszystkich zer, zapisuje to w,$a
a następnie wielokrotnie zapętla. Dogodnie fabryka jest tak szeroka, jak to warte iteracji. Przy każdej iteracji generujemy bieżącą fabrykę"|$(-join$a)|"
, a następnie przechodzimy przez każdy element$a
.Wewnątrz wybieramy bieżący element
$_
, który został-b
opracowanyor
albo1
naRandom
podstawie szansy na podstawie danych wejściowych$x
. Na przykład, do wprowadzania10
,Get-Random -max 10
będzie w zakresie pomiędzy0
a9
i być0
w przybliżeniu 1/10-tej chwili. Zatem z!(...)
zawijaniaRandom
, dostaniemy1
w przybliżeniu1/input
ilość czasu, a pozostałe1-1/input
ilości czasu dostaniemy$_
. Tak, czasami oznacza to, że nadpisujemy1
inny1
, ale to w porządku.Wynikowa tablica jest następnie zapisywana z powrotem do
$a
następnej rundy. Wszystkie powstałe ciągi pozostają w potoku, a domniemaneWrite-Output
po zakończeniu programu daje nam nowe wiersze za darmo.-2 bajty dzięki Veskah.
-11 bajtów dzięki tylko ASCII.
źródło
$a
skoro już przez to zapętlamy? lol I to sprytna sztuczka z-bor
. Dzięki!Perl 6 , 58 bajtów
Wypróbuj online!
+(1 > $_ * rand)
generuje pojedynczy bit z wymaganą częstotliwością1
s.xx 10
replikuje to wyrażenie dziesięć razy, aby utworzyć pojedynczą instancję fabryki jako listę bitów, i[~]
łączy tę listę w pojedynczy ciąg.xx 9
dziewięć razy replikuje to wyrażenie generujące ciąg fabryczny, a następnie[\~|]
wykonuje trójkątną redukcję (którą niektóre inne języki nazywają „skanowaniem”) za pomocą łańcucha lub operatora~|
, tak aby pracownik zwolniony w poprzedniej iteracji pozostał zwolniony w późniejszych.źródło
for
. Pokonuje rozwiązanie liczbowe,{say "|{.join}|"for [\<<+|>>] (?$++X*!<<^$_).roll(10)xx 10}
nad którym pracowałem o dwa bajty. Dzięki[\Z+|]
nim będzie 56 bajtów, ale to nie działa z jakiegoś powodu.$_*rand
się.rand
. Sposób, w jaki interpretuję reguły, zwracanie listy ciągów „fabrycznych” również powinien być OK.Python 2 ,
104103 bajtyWypróbuj online!
źródło
Galaretka , 22 bajty
Pełny program akceptujący liczbę całkowitą jako wejście wiersza poleceń i wypisujący dane wyjściowe do STDOUT.
(Jako monadyczny link zwraca listę znaków i liczb całkowitych.)
Wypróbuj online!
W jaki sposób?
Skutecznie decyduje na każdym etapie, czy każdy pracownik (w tym dowolne maszyny) straci pracę (z szansą jeden na N), jednak maszyny zostaną zastąpione maszynami (przy użyciu logicznej-LUB).
źródło
MATL , 26 bajtów
Wypróbuj online!
(Długie) wyjaśnienie
Przykładowa zawartość stosu jest pokazana po drodze. Na każdym kroku zawartość stosu wyświetlana jest od dołu do góry.
źródło
JavaScript (Node.js) ,
1059390 bajtówWypróbuj online!
+2 bajty za umieszczenie tablicy wewnątrz funkcji, dzięki @Shaggy za wskazanie tego
Wypróbuj online!
źródło
w
będą musiały być zadeklarowane w twojej funkcji.C (gcc) ,
110106 bajtów-4 bajty od @ceilingcat
Wypróbuj online!
Iteruje przez listę znaków dla każdej rundy zamiany.
Nie golfowany:
źródło
SmileBASIC, 75 bajtów
źródło
Perl 5 , 44 bajtów
Wypróbuj online!
źródło
05AB1E , 22 bajty
Wypróbuj online!
Powinno być więcej miejsca na grę w golfa.
TÅ0
- Wciśnij listę 10 zer.TF...
- Zrób to 10 razy:DJ
- Zduplikuj bieżący element i dołącz do niego.'|.ø=
- Otocz go dwoma|
si drukuj do STDOUT.ITи
- Powtórz wprowadzanie 10 razy.€L€Ω
- I dla każdego wystąpienia, zdobądź losowy element [1 ... N] . (Może być wbudowany w to, czego jeszcze nie widziałem)Θ
- Wciśnij 05AB1E trueified ™. Dla każdego sprawdź, czy jest równy 1 .s...~
- Logiczny LUB wynik według bieżącego elementu.źródło
JavaScript, 83 bajty
Pokaż fragment kodu
źródło
Java 10,
153152131 bajtów-18 bajtów dzięki @ OlivierGrégoire i -3 bajtów więcej poprzez konwersję Java 8 na Java 10.
Wyjaśnienie:
Wypróbuj online.
źródło
var
naString
dla Java 9 i niższych oraz dla dodatkowych 3 bajtów. Zasadniczo połączyłem dwie pętle, które masz.Węgiel drzewny ,
302927 bajtówWypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Wciśnij ciąg 10
0
s do pustej listyu
.Powtórz następne polecenie 10 razy.
Dla każdego znaku ostatniego ciągu powtórz go
n-1
razy, dodaj a1
i wybierz losowy znak z ciągu. Daje to1/n
szansę na zmianę postaci na1
. Wynik jest wypychany dou
.Zamapuj na liście ciągów, otaczając każdy z nich
|
, a następnie domyślnie wydrukuj każdy w osobnym wierszu.źródło
Python 3 , 132 bajty
Wypróbuj online!
źródło
APL + WIN,
30 4035 bajtówBrakowało spacji o braku spacji; (- naprawiono & dzięki Urielowi za -3 bajty
Monity o wprowadzenie liczby na ekranie
Wyjaśnienie podobne do Uriela:
źródło
9 10⍴?90⍴5
→?9 10⍴5
. Musisz także wyeliminować spacjeVBA, 144 bajty
Wcięte dla łatwiejszego czytania:
Wykorzystuje 2 punkty: Tablice VBA będą domyślnie
w(9)
ustawione na Bazę 0 (tak samo jakw(0 to 9)
), a utworzenie Tablicy jako Długiej automatycznie zainicjuje ją na 0.(Irytujące jest to, że 20 bajtów to automatyczne formatowanie, które dodaje VBA, ale tak naprawdę nie jest wymagane - 19 spacji i jeden średnik)
źródło
Nie widzę jeszcze odpowiedzi dla Ruby, więc:
Rubin , 92 bajty
Wypróbuj online!
źródło
rand(n)<1
zamiastrand(n)==0
i zapisz kilka, używając{..}
zamiastdo..end
, np.x.times{puts'|'+z...}
Rubin, 67 bajtów
Myślę, że oszukałem tutaj kilka rzeczy. Przede wszystkim funkcja drukuje dane wyjściowe z cudzysłowami wokół każdej linii, np .:
Jeśli jest to nie do przyjęcia (biorąc pod uwagę, że jest to ascii-art , prawdopodobnie tak jest), oto rozwiązanie, które drukuje bez cudzysłowów dla 70 bajtów :
Wyjaśnienie:
źródło
PHP,
7170 bajtówscalanie pętli zapisanych 5 bajtów (ponownie):
Uruchom jako potok z
-nR
lub spróbuj online .edycja 1: poprawiono format i pierwsze wyjście (bez zmiany liczby bajtów dzięki dodatkowemu
golfowi ) edycja 2: grał w golfa jeszcze jeden bajt: po ostatnim wydrukowaniu nie trzeba już strzelać
źródło
C # (interaktywny kompilator Visual C #) , 131 bajtów
Hej, przynajmniej związałem się z Javą.
Wypróbuj online!
źródło