Nanoboty do automatycznego budowania domów zostały sfabrykowane i ich zadaniem jest ich kodowanie.
Oto dom stworzony przez dane wejściowe 7 4 2
/-----/|
/ / |
|-----| |
| | |
| | /
|_____|/
Dane wejściowe to ciąg znaków zawierający wymiary domu.
7
jest szerokość.
|_____|
---7---
4
jest wysokość.
|
|
|
|
2
to głębokość
/
/
Biorąc pod uwagę ten wkład, czy możesz stworzyć dom?
Twój kod musi być jak najmniejszy, aby zmieścił się w robotach.
Notatki
Najmniejsze wymiary, które otrzymasz jako dane wejściowe, to 3 2 2
. Twój program może zrobić wszystko z wymiarami mniejszymi niż 3 2 2
.
Przypadki testowe
3 2 10
/-/|
/ / |
/ / /
/ / /
/ / /
/ / /
/ / /
/ / /
/ / /
/ / /
|-| /
|_|/
3 2 10
?Odpowiedzi:
Python 2, 128 bajtów
Drukuje rząd po rzędzie. Indeksy wierszy
i
odliczają odd
do-h+1
.źródło
' '*min(d-i,h-1,w+1,h-1+i)
z(' '*d)[max(0,i):h-1+i]
Rubin, 145 bajtów
Zwraca listę ciągów. Każdy element na liście odpowiada linii. Jeśli trzeba zwrócić ciąg wielowierszowy, dodaj 3 bajty, aby dodać
*$/
bezpośrednio przed ostatnim nawiasiem.źródło
JavaScript (ES6), 169 bajtów
Gdzie
\n
reprezentuje dosłowny znak nowej linii. Wyjaśnienie:Edycja: Zapisano 2 bajty dzięki @jrich.
źródło
,r='repeat'
z przodu i wymienić pierwsze[r]
z[r='repeat']
,r=(n,c=` `)=>c.repeat(n)
a kiedy zmieniłem tack, przeoczyłem możliwość zmiany układu.Python
224301297 bajtów(Teraz działa dla wszystkich pudeł, w tym 1x1x1)
Wyjaśnienie:
Przyjmuje trzy stałe: l (długość), h (wysokość), w (szerokość).
Jeśli spojrzymy na kilka przykładowych pól, możemy znaleźć wzory w odstępach.
W przypadku pola 3 x 4 x 3 użyjemy liczb do przedstawienia odstępów między sekcjami.
Górny rząd ma 4 spacje lub w + 1. Następne trzy linie mają w - (1 * x). X jest linią.
Są to wzorce, które trwają we wszystkich liniach we wszystkich polach. Dlatego możemy łatwo zaprogramować tę linię po linii, mnożąc liczbę spacji pasujących do wzoru.
Oto próbka dla pudełka 5 x 5 x2.
źródło
w,h,l=input()
lub ustawić tę funkcję.Python 3.5,
328326313305295248 bajtów( Podziękowania dla Kevina Lau za poradę na temat zmniejszania wielkości trójkowych oświadczeń! )
Pobiera dane wejściowe jako 3 liczby całkowite w kolejności
width, height, depth
. Będę grał w golfa z czasem, gdziekolwiek będę mógł.Wypróbuj online! (Ideone)
Wyjaśnienie:
Dla celów tego wyjaśnienia załóżmy, że funkcja została wykonana z argumentami,
(3,2,3)
gdzie 3 to szerokość (w
), 2 to wysokość (h
), a 3 to głębokość (d
). To powiedziawszy, zacznę od pokazania głównej części całej funkcji:Tutaj tworzone są dwie listy składające się na cały „dom”, a następnie łączone ze sobą dosłownie nowe linie (
\n
). Nazwijmy je odpowiednio listąa
i listąb
i przeanalizujmy każdą z nich:Oto gdzie
a
tworzona jest lista :Ta lista zawiera pierwsze
d
wiersze domu. Tutaji
jest każda liczba z zakresu, w0=>(d-(d-h))+d-h
którym wartośćd-h=0
jest ujemna lub zero. Aby rozpocząć,d-i
spacje są dodawane do listy, po której następuje a,/
a następnie wszystko, co jest zwracane przez skompresowaną instrukcję warunkową. W tej instrukcji warunkowejw-2
zwracana jest liczba spacji, jeślii>1
. W przeciwnym razie-
zwracana jest ta sama liczba . Następnie następują po nich kolejne/
, a następnie spacje, w których liczba spacji zależy teraz od tego, czyi<=d-(d-h)-1
. Jeśli tak,i
to dodaje się spacje. W przeciwnym razieh-1
dodaje się spacje. Wreszcie, wszystko to jest uzupełnione przez a/
lub a|
, gdzie|
dodaje się, jeślii<=d-(d-h)-1
w przeciwnym razie a/
jest dodany. W tym przypadku3x2x3
pryzmatu byłby zwracany przez listęa
:Oto gdzie
b
tworzona jest lista :Ta lista zawiera resztę linii pryzmatu. Na tej liście
i
jest każda liczba całkowita z zakresu, w(h-(h-d))+h-d=>0
którym wartośćh-d=0
jest ujemna lub zero. Aby rozpocząć tę listę, najpierw|
dodaje się a, ponieważ linie te zawsze zaczynają się od|
. Następnie, albo przestrzeń,-
albo_
dodaje się w zależności od tego, czy niei=h
lubi<2
. Jeślii<2
,_
to dodaje się a. W przeciwnym razie-
dodaje się ai=h
, lub spację, jeślii>h
lubi<h
lubi>2
. Po podjęciu tej decyzjiw-2
dodaje się numer wybranej postaci. Następnie|
dodaje się kolejną , a następnie dodaje jednąi-1
lubd
kilka spacji. Jeślii>h-(h-d)
, to ad
liczba spacji została dodana. W przeciwnym raziei-1
dodawana jest liczba spacji. Wreszcie, wszystko to jest uzupełnione albo a|
albo a/
, w których a|
jest dodawane jeślii>h-(h-d)
lub a/
jest dodawane jeślii<=h-(h-d)
. W przypadku3x2x3
pryzmatu listab
zwraca:Po utworzeniu 2 list są one ostatecznie łączone za pomocą dosłownie nowych wierszy (
\n
) przy użyciu'\n'.join()
. To jest twój ukończony pryzmat i w tym przypadku wyglądałby tak:źródło
'-_'[f<2]
. WreszcieR=range;S,V,L=' |/'
działa przy przypisywaniu zmiennych początkowych, ponieważ łańcuchy chętnie rozpakują się dla Ciebie w takiej sytuacji.a=1 if b<9 else c=5
nie można wyrazić jako,[a=1,c=5][b<9]
ponieważ skończysz modyfikować zarównoa
ic
. Oto strona ze wskazówkami golfowymi PPCG Python: codegolf.stackexchange.com/questions/54/…'_'if f<2else' -'[f==h]
. Pamiętaj, że wartości logiczne są oceniane jako liczby całkowite, abyś mógł „połączyć” ten trójskładnik z drugim, który naprawiłeś[' -'[f==h],'_'][f<2]
. Nie wykorzystałeś jeszcze mojej wskazówkiS,V,L=' |/'
.