Advent Challenge 4: Obecna linia montażowa!

12

<< Poprzedni Następny >>

Mikołaj był w stanie zregenerować wszystkie prezenty, które elfy ukradły przez noc! Teraz musi wysłać je na linię montażową w celu pakowania. Zwykle ma aparat do nadzorowania linii montażowej, aby upewnić się, że elfy wykonują dobrą robotę, i ponieważ zdjęcia z linii montażowej wyglądają ładnie na plakatach reklamowych [potrzebne źródło]

Niestety jego kamera się zepsuła, więc chciałby, abyś wyciągnął symulację tego, jak wyglądałaby linia montażowa!

W celu utrzymania maksymalnej wydajności linii montażowej i zmniejszenia ryzyka błędu lub awarii wszystkie obecne pudełka mają tę samą szerokość, dzięki czemu idealnie pasują do taśmy przenośnika.

Wyzwanie

Biorąc pod uwagę listę prezentów reprezentowanych przez ich wymiary, wyjmij przenośnik taśmowy ze wszystkimi prezentami.

Prezent jest rysowany w taki sposób:

  +----+
 /    /|
+----+ |
|    | +
|    |/
+----+

Ten prezent ma szerokość 1, wysokość 2 i długość 4. Zauważ, że znaki plus nie liczą się do długości boku, więc prezent o długości 4 w rzeczywistości obejmuje 6 pozycji.

Wszystkie prezenty są rysowane obok siebie, z jedną spacją między najbliższymi dwoma postaciami; to znaczy, lewe dolne rogi prezentów są rozmieszczone w taki sposób, że jeśli obecne pudełko ma długość li szerokość w, lewy dolny róg następnego pudełka będzie dokładnie na l + w + 4prawo od lewego dolnego rogu poprzedniego pudełka.

Po narysowaniu wszystkich obecnych pudełek, taśma przenośnika jest rysowana przez zastąpienie odstępu między pudełkami na każdej z ostatnich width + 2linii podkreślnikami.

Ostateczne wyjście obecne pola (l, w, h)z [(4, 1, 2), (8, 1, 3), (1, 1, 1)]byłoby:

           +--------+
  +----+  /        /|
 /    /| +--------+ |   +-+
+----+ | |        | |  / /|
|    | +_|        | +_+-+ +
|    |/__|        |/__| |/
+----+___+--------+___+-+

Specyfikacja formatowania

Możesz wybrać albo wzięcie listy 3-krotek, w której jeden z elementów jest spójny na całej liście (czyli szerokość), albo możesz wziąć obecną szerokość, a następnie listę 2-krotek reprezentujących długość i wysokość każdego prezentu. Możesz przyjmować dane wejściowe w dowolnej kolejności i w dowolnym rozsądnym formacie, ale prezenty muszą być wyświetlane w tej samej kolejności, w jakiej zostały podane jako dane wejściowe.

Możesz wybrać dowolny rozsądny format wyjściowy dla sztuki ASCII (w tym powrót z funkcji).

Przypadki testowe

Te przypadki testowe podano w [(l, w, h), ...]formacie.

[(4, 1, 2), (8, 1, 3), (1, 1, 1)]:

           +--------+
  +----+  /        /|
 /    /| +--------+ |   +-+
+----+ | |        | |  / /|
|    | +_|        | +_+-+ +
|    |/__|        |/__| |/
+----+___+--------+___+-+

[(5, 3, 4), (8, 3, 1), (1, 3, 7)]:

                               +-+
                              / /|
                             / / |
    +-----+                 / /  |
   /     /|                +-+   |
  /     / |                | |   |
 /     /  |     +--------+ | |   |
+-----+   |    /        /| | |   |
|     |   +___/        / +_| |   +
|     |  /___/        / /__| |  /
|     | /___+--------+ /___| | /
|     |/____|        |/____| |/
+-----+_____+--------+_____+-+

[(0, 0, 0)] (this is the most interesting test case ever :P)

 ++
+++
++

[(8, 3, 0), (0, 3, 8)] (more zero cases)

                   ++
                  //|
                 // |
                //  |
               ++   |
               ||   |
               ||   |
               ||   |
    +--------+ ||   |
   /        /+_||   +
  /        //__||  /
 /        //___|| /
+--------+/____||/
+--------+_____++

Zasady

  • Obowiązują standardowe luki
  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach
  • Żadna odpowiedź nie zostanie zaakceptowana

Uwaga: Inspirację do tej serii wyzwań czerpałem z Advent Of Code . Nie mam powiązań z tą stroną

Możesz zobaczyć listę wszystkich wyzwań w serii, patrząc na sekcję „Połączone” pierwszego wyzwania tutaj .

HyperNeutrino
źródło
@AdmBorkBork wszystkie obecne pudełka mają tę samą szerokość
Erik the Outgolfer
1
Jeśli węgiel drzewny tego nie zniszczy , nie wiem co.
całkowicie ludzki,
@Totallyhuman faktycznie, brainf ** k wygra to wyzwanie: P
HyperNeutrino
Czy możesz napisać post na meta, aby zindeksować wszystkie te pytania?
RamenChef,
@RamenChef Hm dobry pomysł. Mogę to zrobić: P
HyperNeutrino

Odpowiedzi:

4

Węgiel , 96 81 bajtów

NθWS«→FυG↗→↙⁺²θ_≔I⪪ι υ≔⊟υπ≔§υ⁰ρ→↗G↑⊕π↗⊕θ→⊕ρ↓⊕π↙⊕θ ↑πP↗⊕θP←⊕ρ↓+↓πF²«↷⁴+ρ↷²+π↷¹+θ↶³

Wypróbuj online! Link jest do pełnej wersji kodu. Dane wejściowe to szerokość w pierwszym wierszu, a następnie pozostałe wymiary w kolejnych wierszach, kończące się pustą linią. Wyjaśnienie:

Nθ

Wprowadź szerokość.

WS«

Pętlę nad pozostałymi liniami, aż do osiągnięcia pustej linii.

→FυG↗→↙⁺²θ_

Narysuj pasek między prezentami. uZmienna jest predefiniowany do pustej listy, które w związku z tym nic nie robi na pierwszym przejeździe, a potem kończy się z jednego elementu, co powoduje ten kod, aby uruchomić jeden raz. (Korzystanie z ifbyłoby mniej golfa.)

≔I⪪ι υ

Podziel wymiary w przestrzeni, rzuć je na liczby całkowite i zapisz je u.

≔⊟υπ

Usuń ostatni wymiar i zapisz go p.

≔§υ⁰ρ

Skopiuj pierwszy wymiar do r, ale pozostaw go, uaby pasek został narysowany w następnej pętli.

→↗G↑⊕π↗⊕θ→⊕ρ↓⊕π↙⊕θ 

Wymaż wnętrze prezentu, na wypadek, gdyby pas go nachodził.

↑πP↗⊕θP←⊕ρ↓+↓π

Narysuj wewnętrzne linie teraźniejszości.

F²«↷⁴+ρ↷²+π↷¹+θ↶³

Narysuj w połowie zewnętrznej części teraźniejszości, a następnie powtórz dla drugiej połowy.

Neil
źródło
1

Pip , 160 154 bajtów

153 bajty kodu, +1 dla -lflagi.

{YMX:_+B+3MUaRV$.({UwhlWg+^11{a<=h+w?J[sXa-haN[0hh+w]?'-XlWR'+sXlWR("/|"a<h)RV(("+|/"aCMw).sXw)@<MN[ah+w-awh]'_Xw-a+1|s]sXl+w+3}M,y}MUa)R`_ +`'_X#_<|:'_}

Jest to funkcja, która pobiera listę zawierającą [width height length]. Wypróbuj online!

W jaki sposób?

Wyjaśnienie na najwyższym poziomie:

  • Zdefiniuj funkcję, która zwraca listę linii reprezentujących jedno pole
  • Przypisz funkcję do każdej podanej listy wymiarów
  • Połącz uzyskane listy wierszy według pozycji
  • Wykonaj małą obróbkę końcową z zamiennikami wyrażeń regularnych, aby znaki podkreślenia działały poprawnie

Zostaw komentarz, a dodam bardziej szczegółowe wyjaśnienie.

DLosc
źródło
0

Python 2 , 508 bajtów

def f(B):
 d=B[0][1]+2;H=max(B)[0]+d+1;W=sum(sum(b[1:])+3for b in B)+len(B);r=[[' ']*i+W*['_']for i in range(d)]+[W*[' ']for _ in' '*H];o=0
 for h,w,l in B:
	for i in range(w+2,1,-1):r[i-1][o+i-2:o+l+i]=[' ']*(l+2)+['/'];r[h+i][o+i-1]=r[h+i][o+l+i]='/'
	r[0][o:o+l+2]=r[h+1][o:o+l+2]=r[w+h+2][o+w+1:o+w+l+3]=['+']+['-']*l+['+']
	for i in range(1,h+1):m=min(i,w)-1;r[i][o:o+l+2+m]=['|']+[' ']*l+['|']+[' ']*m;r[i+w+1][o+l+w+2]='|'
	r[w+1][o+l+w+2]='+';o+=l+w+4
 for l in r[H-1::-1]:print''.join(l).rstrip('_')

Wypróbuj online!

Pobiera listę list [height, width, length]

TFeld
źródło