Co jeśli mamy korytarz złożony z dwóch równoległych lusterek?
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
Teraz świecimy laserem ...
| \ |
| \ |
| \ |
| \ |
| \ |
| \ |
| \ |
| \|
| /|
| / |
O popatrz. Tam odbiło się pod koniec.
Co jeśli narysujemy dwa lasery, ALE idąc w przeciwnym kierunku?
| \ / |
| \ / |
| \/ |
| /\ |
| / \ |
| / \ |
| / \ |
|/ \|
|\ /|
| \ / |
Hmm, tam chyba się nie spotkali. To wygodne. Co się stanie, jeśli oba lasery zajmą tę samą przestrzeń?
| \ / |
| \ / |
| \ / |
| X |
| / \ |
| / \ |
| / \ |
| / \|
|/ /|
|\ / |
Myślę, że to było dość oczywiste, co?
Ręczne rysowanie tych diagramów jest dość pracochłonne (zaufaj mi w tym). Być może jakiś kod mógłby to dla nas zrobić?
- Napisz kod, aby wyprowadzić dwa równoległe zwierciadła z dwoma odbijającymi się, przecinającymi się laserami.
- Dane wejściowe (wszystkie liczby całkowite):
- Szerokość korytarza
- Długość korytarza
- Pozycja początkowa prostopadłego lasera (indeksowana od zera, musi być mniejsza niż szerokość)
- Pozycja początkowa lasera lewostronnego (indeksowany od zera, musi być mniejsza niż szerokość)
- Proces
- Jeśli laser leci prawidłowo, zostanie narysowany o jedno pole w prawo na następnej linii.
- Jeśli laser pozostanie w ruchu, zostanie narysowany o jedno miejsce w lewo w poniższej linii.
- Jeśli laser nie może wykonać kroku w bok, zmieni kierunek, ale nie pozycję.
- Jeśli oba lasery mają ten sam indeks, wydrukuj wielką literę X przy tym indeksie.
- Wynik
- Ciąg z wieloma liniami
- Każda linia zaczyna się i kończy znakiem kreski (|)
- Prawy laser jest oznaczony odwrotnym ukośnikiem (\)
- Lewy laser jest oznaczony ukośnikiem (/)
- Przecięcie dwóch laserów jest oznaczone wielką literą X.
- Dowolny język
- Chciałbym zobaczyć linki do TIO
- Spróbuj naprawić go w jak najmniejszej liczbie bajtów
Przypadki testowe
szerokość: 6 długość: 10 w prawo: 1 w lewo: 4
| \ / |
| \/ |
| /\ |
| / \ |
|/ \|
|\ /|
| \ / |
| \/ |
| /\ |
| / \ |
szerokość: 6 długość: 10 w prawo: 0 w lewo: 1
|\/ |
|/\ |
|\ \ |
| \ \ |
| \ \ |
| \ \|
| \/|
| /\|
| / /|
| / / |
szerokość: 4 długość: 10 w prawo: 2 w lewo: 0
|/ \ |
|\ \|
| \ /|
| X |
| / \|
|/ /|
|\ / |
| X |
|/ \ |
|\ \|
szerokość: 20 długość: 5 w prawo: 5 w lewo: 15
| \ / |
| \ / |
| \ / |
| \ / |
| \ / |
szerokość: 5 długość: 6 w prawo: 2 w lewo: 2
| X |
| / \ |
|/ \|
|\ /|
| \ / |
| X |
szerokość: 1 długość: 2 w prawo: 0 w lewo: 0
|X|
|X|
Odpowiedzi:
Stax , 40 bajtów
Uruchom i debuguj
Wypróbuj online!
Jestem całkiem pewien, że można to pograć w golfa.
Dane wejściowe są podawane w formie
width [right-going left-going] length
(na komentarz @EngineerToast).Odpowiednik ASCII:
źródło
width [right-going left-going] length
JavaScript (ES6), 149 bajtów
Pobiera dane wejściowe w składni curry
(w)(h)([a,b])
.Wypróbuj online!
Skomentował
źródło
Python 2 , 119 bajtów
Wypróbuj online!
źródło
\\/
w golfa\/
? Mimo że odwrotny ukośnik jest interpretowany dwukrotnie, nadal nie uniknie ukośnika.Python 2 , 168 bajtów
Wypróbuj online!
źródło
d
!Python 2 ,
187181179177174172171 bajtówWypróbuj online!
Rekurencyjne:
Python 2 , 172 bajty
Wypróbuj online!
Rekurencyjny, alternatywny druk:
Python 2 , 172 bajty
Wypróbuj online!
źródło
C (clang) ,
240236208 bajtówWypróbuj online!
f () przyjmuje parametry w następujący sposób:
x
= szerokość,y
= długość,r
= początkowo pozycja początkowa linii początkowejl
= początkowo pozycja początkowa linii lewej-4 bajty. kredyty Kevin Cruijssen. Dzięki
źródło
while
a,for
aby usunąć{}
jeden i jeden z średników. I jeszcze 1 bajt, zmieniającc&&d
nac&d
. Wypróbuj online 236 bajtów .Płótno ,
6640 bajtówWypróbuj tutaj!
źródło
Węgiel drzewny ,
5650 bajtówWypróbuj online! Link jest do pełnej wersji kodu. Edycja: Zapisano 6 bajtów, zmniejszając zależność od obrotu. Wyjaśnienie:
Wydrukuj boki.
Pętla nad dwoma laserami.
Przejdź na początek lasera.
Pętla na wysokości.
Narysuj
\
lub/
w odpowiednim kierunku, chyba że kwadrat nie jest pusty, w takim przypadku narysujX
.Czy uderzyliśmy w bok?
Jeśli tak, zrób krok w bok i odwróć kierunek jazdy.
źródło
Java (JDK 10) , 186 bajtów
Wypróbuj online!
źródło
PHP,
177 169166 bajtówwymaga PHP 7.1 do indeksowania łańcuchów ujemnych, PHP 5.5 lub nowszego do indeksowania literałów łańcuchowych.
dla PHP <7,1 , usunąć
^L
, zastąpić"X\/"
z"/X\\"
,:0
z+1:1
,[$e]
z[$e+1]
, wyjąć."|"
i włożyć|
przed linią. (Bajtów), +3do PHP <5,5 , wymienić
"/X\\"
z$p
i wstawić$p="/X\\";
na początku. (+2 bajty)pobiera dane wejściowe z argumentów wiersza poleceń. Uruchom je
-nr
lub wypróbuj online .źródło
Python 3 , 162 bajty
Wypróbuj online!
źródło
Rubin , 117 bajtów
Wypróbuj online!
Anonimowa lambda przyjmuje dane wejściowe jako szerokość
w
, wysokośćh
i tablicę punktów początkowycha
.źródło
PowerShell ,
243233222205 bajtówWypróbuj online!
Oooof. te bloki logiczne są duże, brudne i w większości powielone. Następnym krokiem byłoby przepisanie ich, aby nie potrzebowały instrukcji else.
źródło
Python 2,
165164 bajtówOszczędność bajtu dzięki Jonathanowi Frechowi.
Wypróbuj online!
źródło
\\/
jest równoważne z\/
.K (ngn / k) , 58 bajtów
Wypróbuj online!
anonimowa funkcja, która akceptuje trzy argumenty:
x
szerokość,y
długość,z
parę pozycji początkowych dla laserówźródło
C (gcc) , 169 bajtów
Wypróbuj online!
źródło
Kotlin ,
322311302 bajtówZmieniono sposób umieszczania kierunku lasera w ciągu 11 bajtów. Przeniesiono przypisanie poza kiedy na 9 bajtów.
Wypróbuj online!
źródło