Kto nie lubi filmów akcji z szybkimi hałaśliwymi samochodami, zwłaszcza z wieloma awariami? Kto nie lubi zdjęć akcji w sztuce ascii?
Scena jest:
Dwa samochody ruszają po przeciwnych stronach prostej drogi (między nimi 60 miejsc). Zaczynają jechać ku sobie ze stałą prędkością. Samochód po lewej jedzie z prędkością 1 miejsca na sekundę, a ten z prawej jedzie z prędkością 2 miejsc na sekundę.
Oczywiście samochody nie mogą się przejechać, więc n ≥ 20
sceną będą dwa rozbite samochody z czepkami w miejscu, w którym doszło do wypadku.
Jako miłośnik kina chcę od czasu do czasu zatrzymać scenę, aby cieszyć się jej pięknem.
Biorąc pod uwagę liczbę całkowitą n
(argument funkcji lub STDIN), reprezentującą liczbę sekund od początku sceny, pokaż scenę w tym momencie.
Oto scena początkowa z 60 odstępami między przednimi kołami:
__ __
_/ \_ _/ \_
o o o o
to jest scena po 11 sekundach:
__ __
_/ \_ _/ \_
o o o o
i tak to wygląda po awarii (pamiętaj, że po awarii maski są podniesione):
__ __
_/ \/\/ \_
o oo o
Interesuje mnie tylko awaria dwóch samochodów, więc spacje, znaki nowej linii, ++ nie mają znaczenia.
To jest kod golfowy, więc wygrywa najkrótszy kod w bajtach. Odpowiedzi dodane później mogą nadal wygrywać, jeśli są krótsze niż aktualnie zaakceptowana odpowiedź.
/ \
a nie spadające_ _
?Odpowiedzi:
CJam,
6866 bajtówWypróbuj online
Każdy, kto zobaczy początek kodu, będzie tego pewien
liKe
!Wyjaśnienie:
źródło
Labirynt ,
394386 bajtówZ dumą przedstawiam ...
... mój nowy dwuwymiarowy esolang Labirynt! Powyższy kod nie jest niewiarygodnie dobrze golfowy (jest 161 pól i 25 NOP, więc lepszy układ może to znacznie skrócić), ale przynajmniej udało mi się pokazać, że język nadaje się do zadań niebanalnych. :)
Jak to działa
Najpierw krótki przegląd języka:
"
jest NOP, który nie jest ścianą i może być pomocny przy wypełnianiu określonych ścieżek w kodzie. W przeciwieństwie do wielu innych języków 2D krawędzie nie zawijają się.@
kończy program.>v<^
które cyklicznie przesuwają wiersz lub kolumnę kodu źródłowego o jedną komórkę. To, którego wiersza lub kolumny dotyczy, zależy od góry stosu. Jeśli własny wiersz lub kolumna adresu IP zostanie przesunięta, będzie się przesuwać wraz z przesunięciem. Umożliwia to przeskakiwanie z jednej krawędzi kodu źródłowego na drugą.Teraz, w przypadku tego konkretnego wyzwania, oto ogólna idea algorytmu:
/ \_o oo o
) Na stos pomocniczy.__
czy/\
dalej.__ __ _/ \
Dwie spacje wiodące) na stos pomocniczy.20
, nazwijmy to N .Na koniec spójrzmy na niektóre części kodu. Adres IP zaczyna się w lewym górnym rogu, za pomocą polecenia przesunięcia siatki. Góra głównego stosu jest
0
(która jest używana jako indeks względny), więc pierwszy rząd jest przesunięty w lewo, co również przesuwa IP na prawy koniec siatki. Teraz pierwszy rząd jest po prostu wykonywany od prawej do lewej, co wypycha pierwszy zestaw stałych znaków na stos pomocniczy:To przesunięcie wiersza jest przydatne podczas gry w golfa, gdy chcesz zacząć od dużej ilości kodu liniowego.
Następnie czytamy dane wejściowe i wciskamy odpowiednie maski:
Bit po lewej z trzema NOP wysyła negatywne wyniki wzdłuż górnej gałęzi i nieujemne wyniki wzdłuż dolnej gałęzi. Po prawej są ponownie połączone.
Teraz następuje kolejna duża sekcja liniowa (która prawdopodobnie mogłaby być często golfa z inną sztuczką polegającą na przesuwaniu rzędów):
Spycha to resztę samochodów na stos pomocniczy.
Następnie obliczamy
min(20, input)
, która jest podobna do pierwszej gałęzi:Wreszcie mamy pętlę, która działa trzy razy, aby wydrukować linie. Każda iteracja pętli zawiera dwie małe (3x3) pętle do drukowania spacji, a także dwie sekcje do drukowania 6 znaków ze stosu pomocniczego:
Jedną fajną sztuczką, na którą chciałbym zwrócić uwagę, jest
.{.{.
jej prawy brzeg. Jest to ślepy zaułek, więc poza.
końcem kod jest wykonywany dwukrotnie, raz do przodu i raz do tyłu. Daje to dobry sposób na skrócenie kodu palindromicznego (haczyk polega na tym, że musisz upewnić się, że IP przybiera prawidłowy obrót przy ponownym wyjściu z ślepej uliczki).źródło
Python 2.7,
167164159 bajtówTo pobiera dane wejściowe ze standardowego wejścia.
Demo tutaj
Testowanie tego -
źródło
(n,20)[n>20]
jest po prostumin(n,20)
.(' \_',' \/')[s<1]
go' \\\\_/'[s<1::2]
.l
konieczne? Czy możesz to zrobićfor e in [' _',"_/ ","o "]:
i usunąćl
całkowicie?l
teraz nie jest konieczne. Musiałem użyć go we wcześniejszej wersji. Dzięki :)R, 191 bajtów
O tyle, ile mogę teraz. Zajmuje sekundy od STDIN i kotów do STDOUT.
Wyjaśnienie
Testy
źródło
formals()
. :)CJam, 120 bajtów
Próbny
Nie golfowany:
Próbny
źródło
J
ma wartość 19,K
ma wartość 20, zapisując każdy znak dla tych stałych. Jeśli potrzebujesz tablicy z jednym elementem, możesz użyća
operatora do zawinięcia elementu zamiast pary nawiasów.PHP,
160155 bajtówKod jest wyświetlany tutaj w 3 wierszach, aby pasował do układu pola kodu. Te nowe wiersze nie są potrzebne.
Nieskluczony kod:
Pobiera liczbę sekund z wiersza poleceń (pierwszy argument):
Opcja PHP CLI
-d error_reporting=0
jest potrzebna do ukrycia niektórych powiadomień wyświetlanych przez PHP o niezdefiniowanych stałych (str_repeat
,_
), które konwertuje na ciągi znaków (2 bajty zapisane dla każdego powiadomienia).Jeden dodatkowy bajt można zapisać w PHP 7, ściskając inicjalizację
$f
do pierwszego użycia ($m=($f=str_repeat)(...)
); nie kompiluje się w PHP 5.Przypadek testowy i niektóre techniki stosowane w celu zmniejszenia kodu można znaleźć na github .
Aktualizacja:
@ ismail-miguel ścisnął inicjalizację
$left
i$c
wprowadził do argumentówecho
zapisywania 4 bajtów (patrz komentarz poniżej).Poprzez zamianę kolejności zmiennych
$m
is
ich inicjalizację pozbyłem się pary nawiasów i zaoszczędziłem jeszcze 1 bajt.źródło
$f=str_repeat;$m=$f(' ',$r=60-3*($s=min(max($argv[1],0),20)));echo$l=$f(' ',$s)," __ $m __\n{$l}_/ \\",$r?_.$m._:'/\\',"/ \\_\n{$l}o o{$m}o o\n";
$f=str_repeat;echo$l=$f(' ',$s=min(max($argv[1],0),20))," __ ",$m=$f(' ',$r=60-3*$s)," __\n{$l}_/ \\",$r?_.$m._:'/\\',"/ \\_\n{$l}o o{$m}o o\n";
o o
zmienną, ale uzyskałem tę samą lub gorszą długość.\n
prawdziwymi nowymi liniami. Zapomniałem o tym. I liczy się to jako 1 bajt każdyJavaScript (ES6), 121 bajtów
Używając ciągu szablonu, 2 znaki nowego wiersza w ciągu są znaczące i zliczane.
Aby zapisać bajty, wypisz za pomocą
alert
, nawet jeśli użyto proporcjonalnej czcionkialert
nie jest odpowiednia dla grafiki ASCII, a wynik jest brzydki dla n> = 20 (awaria).Przetestuj uruchomienie fragmentu kodu w FireFox
źródło
Python 2, 148 bajtów
Wykorzystuje kody ucieczki ANSI, aby ustawić kursor we właściwym miejscu, aby narysować samochody. Następnie sprawdza, czy dane wejściowe wynosiły 20, a jeśli tak, to wraca i rysuje maski samochodu.
Pobiera liczbę całkowitą ze standardowego wyjścia na wyjście standardowe.
Nie golfowany:
źródło
Pyth, 67 bajtów
Wypróbuj tutaj .
źródło
C,
180191168 bajtówbez golfa:
program testowy:
wydajność:
Byłem w stanie grać w golfa dość mocno. Myślę, że zacząłem z prawie 300 bajtami.
Ale nie wiem, czy to nadal spełnia wszystkie wymagania. Jak widać po 21 sekundach, pierwszy samochód popycha drugi samochód w prawo. Musiałbym dodać kilka bajtów, jeśli nie jest to dozwolone.Edycja: naprawiono. To powinno być bardziej realistyczne niż Sharknado ;-)
Edycja: Mogłem znacznie skrócić moje rozwiązanie, patrząc ponownie na stronę podręcznika użytkownika
printf
. Jeśli użyjesz „*”, możesz podać długość pola bezpośrednio do printf, bez potrzeby wcześniejszego tworzenia łańcucha formatującegosprintf
.źródło
> <> ,
538276 bajtówZrzuciłem rozmiar DUŻO, jestem zdumiony, że udało mi się zmniejszyć rozmiar o połowę. Stary jest poniżej. Ten nie jest tak wydajny pod względem wydajności ze względu na szerokość siatki, głównie od pierwszej linii.
Możesz to przetestować tutaj . Podaj czas, który upłynął, w „Początkowym stosie”, a nie „Wejściu”!
Oto stara wersja.
źródło
Java, 258 znaków
Bez golfa
Wyniki
źródło
Python 2, 102 bajty
Całkiem proste. Dla każdego rzędu samochodu drukujemy
n
spacje, ten rząd,60-3*n
spacje i rząd ponownie. Aby zatrzymać samochody, zamiast omin(n,20)
jeden, ograniczać pierwszy ciąg przestrzeni za pomocą jednego znaku[:20]
ciąg , a drugi jest w porządku, ponieważ liczba ujemna razy ciąg jest pustym ciągiem.Aby przesunąć błotniki, po prostu wykonujemy
replace
. Ponieważ__
pojawia się również na dachu, potrzebujemy trochę kontekstu, aby zidentyfikować błotniki, więc sprawdzamy, czy są/
następujące.źródło
Java,
270267 bajtówJestem całkiem pewien, że istnieje lepszy / krótszy sposób, ale mój mózg nie jest odpowiednio zaangażowany.
Dla n = 19:
Dla n = 20:
Bez golfa
źródło
PHP 7, 140 bajtów
Stosowanie:
Zapisz jako ANSI w
file.php
(powinny być w niej znaki o zerowej szerokości$o
) i uruchom:z
x
jako liczba sekund.I wersja, która działa bez zmiany raportowania błędów ( 148 bajtów ):
źródło
JavaScript, 193 bajty
To nie jest zwycięzca, ale coś
http://jsfiddle.net/yb703y0p/2/
źródło