W ramach projektu urbanistycznego otrzymałeś zadanie stworzenia programu lub funkcji, która wyświetli panoramę miasta, biorąc pod uwagę pewien wkład architektów. Projekt jest dopiero w fazie początkowej, więc wystarczy bardzo przybliżony szkic. Najłatwiej jest oczywiście narysować linię horyzontu w sztuce ASCII.
Wszystkie budynki będą nad rzeką, więc wszystkie są wyrównane. Architekci podadzą wysokość każdego budynku jako dane wejściowe, a Twój kod powinien wyświetlać linię horyzontu.
Dane wejściowe od architektów będą albo liczbami całkowitymi, albo pół liczbami całkowitymi. Jeśli liczba jest liczbą całkowitą, budynek będzie miał płaski dach, a połowa będzie skutkować dachem dwuspadowym. Zero będzie po prostu płaskie. Ściany budynku są oddalone od siebie o 3 znaki, a zero będzie miało szerokość jednego znaku. Sąsiednie budynki dzielą ściany.
Aby uzyskać szczegółowe informacje i wyjaśnienia dotyczące wyników, spójrz na poniższe przykłady:
N = 3
___
| |
| |
|___|
N = 3.5
_
/ \
| |
| |
|___|
N = 6
___
| |
| |
| |
| |
| |
|___|
n = 0
_
Przykładowe dane wejściowe: 3 3.5 0 2
_
___ / \
| | | ___
| | | | |
|___|___|_|___|
Przykładowe dane wejściowe: 0 0 2.5 3 0 4 1
___
_ ___ | |
/ \| | | |
| | | | |___
__|___|___|_|___|___|
Louisville ,0 2 1 3.5 0 4 2 4 2 4 6 1 6 0 5 1
___ ___
| | | | ___
_ ___ ___ ___| | | | | |
/ \ | | | | | | | | | | |
___ | | | |___| |___| | | | | | |
| |___| | | | | | | | |___| | | |___
_|___|___|___|_|___|___|___|___|___|___|___|___|_|___|___|
Stosowane znaki ASCII to: nowa linia, spacja i /\_|
(punkty kodowe 10, 32, 47, 92, 95, 124).
Zasady:
- Opcjonalne jest utworzenie programu, który przyjmuje tylko liczby całkowite jako dane wejściowe, poprzez pomnożenie wszystkich liczb przez dwa. Więc zamiast brać
3 3.5 2
, twój program może zająć6 7 4
. Jeśli zostanie wybrany drugi format wejściowy, wprowadzenie wartości 6 powinno dać budynek trzypiętrowy, 7 powinien być budynkiem trzypiętrowym ze spadzistymi dachami itp. - Dane wyjściowe powinny być dokładnie takie, jak opisano powyżej, ale końcowe spacje i znaki nowej linii są prawidłowe.
- Dokładny format danych wejściowych jest opcjonalny. Cokolwiek jest najlepsze w twoim języku.
- Wynik musi być wyświetlony na ekranie, aby architekci mogli go obejrzeć.
- Możesz założyć, że podana zostanie co najmniej jedna liczba całkowita i że podana będzie tylko poprawna wartość wejściowa.
To jest codegolf, więc wygrywa najkrótszy kod w bajtach.
Odpowiedzi:
Python 2,
199193188185 bajtówJest to pełny program, który przyjmuje liczby całkowite jako dane wejściowe. Przykładowe dane wejściowe .
źródło
MATLAB,
219 209203 bajtówTo niestety nie działa w Octave . Nie do końca wiadomo dlaczego, wydaje się, że ma to coś wspólnego z łamanym bitem disp / flipud.
Ponadto nie ma obecnie definicji tego, jak wygląda budynek o wysokości 0,5, ani żadnej wzmianki o nich, więc w tym kodzie zakładam, że są one niedozwolone.
Poniżej znajduje się kod w nieco bardziej czytelny sposób:
Najpierw bierzemy dane wejściowe jako tablicę i dokonujemy inicjalizacji zmiennej.
Ponieważ budynki o zerowej wysokości są uciążliwe - w zasadzie kończą się na szerokości, która zależy od tego, co znajdują się obok (chociaż to, co jest drukowane, nie zmienia się), upraszczamy rzeczy, rysując wystarczająco dużo gruntu dla wszystkich budynków. Zakładamy, że każdy budynek będzie miał 4 znaki szerokości (ponieważ sąsiednie budynki łączą się ze sobą) - te o zerowej wysokości nie są, ale nadmiar zostanie przycięty później.
Teraz wyciągamy kolejno każdy budynek.
Najpierw otrzymujemy całkowitą część wysokości, ponieważ to określi, ile „|” potrzebujemy.
Teraz narysuj ścianę dla tego budynku - jeśli są dwa sąsiednie budynki, ściana dla tego nowego będzie znajdować się w tej samej kolumnie co ściana z ostatniego.
Sprawdź, czy jest to budynek o połowie wysokości. Jeśli tak, to dach będzie inny. Dla połówek wysokości dach będzie,
/ \
podczas gdy będzie to pełna wysokość___
(Matlab domyślnie powieli to z jednego znaku podkreślenia, więc zapisz tam kilka bajtów). Jest dodatkowy kawałek dachu o jeden rząd wyżej dla budynków o połowie wysokości, więc to również jest dodawane.Narysuj w dachu
Teraz przejdź na początek następnego budynku i narysuj wspólną ścianę (jeśli ściana jest w tym momencie zbyt krótka, zostanie powiększona, gdy zostanie narysowany następny budynek). Zauważ, że budynki o zerowej wysokości mają szerokość 1, normalne budynki mają szerokość 4, więc upraszczamy to, co w innym przypadku byłoby, gdyby nie, traktując (a> 0) jako liczbę dziesiętną, a nie logiczną.
Dalej jest trochę hakerów do pracy z budynkami o zerowej wysokości. Zasadniczo to mówi, że jeśli ten budynek miał zero wysokości, a poprzedni nie był, oznacza to, że miejsce następnego budynku wymaga zwiększenia o 1, ponieważ budynek o zerowej wysokości umieszczony pomiędzy dwoma innymi budynkami jest faktycznie dwa razy szerszy - to stanowi dodatkową ścianę, która zwykle jest dzielona z sąsiednim budynkiem. Śledzimy również wysokość budynku w celu wykonania tej kontroli następnym razem.
Po zakończeniu odwróć matrycę budynku, aby była poprawna, i wyświetl ją. Pamiętaj, że również tutaj usuwamy nadmiar ziemi.
Kiedy uruchamiamy ten skrypt, jesteśmy proszeni o podanie danych, na przykład:
Następnie generuje budynek i wyświetla wynik. Dla powyższych danych wejściowych generowane są:
źródło
Kotlin,
447442 bajtówWersja bez golfa:
źródło
Python 2,
357306299294287281276 bajtówWykorzystuje to kodowanie „podwójne”, które jest przekazywane do funkcji jako lista. Edycja: Ogolono bajty, ponawiając część dużego warunku jako selektor tablicy i przechodząc do podwójnego kodowania. Ogolono więcej bajtów, jeszcze bardziej przestawiając warunek i przekształcając więcej logiki w arytmetykę.
EDYCJA: xsot's jest lepszy
Wyjaśnienie:
d
jest o 1 większa niż długość tablicy, ponieważ dodamy zera na każdym końcu listy od drugiego elementu do zera, które dodaliśmy na końcu.h
jest wysokością rysunku. (W tym obliczeniu musimy podzielić przez 2, ponieważ używamy podwójnej reprezentacji, której używamy specjalnie, aby uniknąć konieczności rzucania pływaków na ints w całym miejscu. Dodajemy również 1 przed podzieleniem tak dziwnych wysokości - spiczaste budynki - uzyskać trochę więcej luzu niż zwykły rodzaj.)o
to ciąg wyjściowy.Standardowa sztuczka polegająca na zwijaniu podwójnej pętli for w pojedynczą pętlę for. Kiedy to zrobimy:
osiągnęliśmy teraz to samo, co:
ale w sposób, który pozwala nam zaoszczędzić dziesięć bajtów (w tym spacje w kolejnych wierszach).
Przyklej ścianę w dowolnym momencie, wysokość obecnego budynku lub poprzedniego budynku jest wyższa niż bieżąca linia, o ile jest tu co najmniej jedna granica budynku. Jest to odpowiednik następujących warunków:
gdzie b to aktualna wysokość skanu, a to aktualna wysokość budynku, a c to poprzednia wysokość budynku. Ta ostatnia część warunku zapobiega umieszczaniu ścian między przestrzeniami naziemnymi.
Jest to część, która rysuje prawidłowy dach, wybierając części dachu przez porównanie wysokości budynku z bieżącą wysokością skanu. Jeśli dach nie wchodzi tutaj, drukuje odpowiednią liczbę miejsc (3, gdy jest to prawdziwy budynek, np. A> 0, w przeciwnym razie 1). Zauważ, że kiedy jesteśmy na poziomie gruntu, nigdy nie próbuje narysować dachu, co oznacza, że budynki wielkości 0,5 nie dostają spiczastych dachów. No cóż.
Gdy jesteśmy na poziomie gruntu, zamiast spacji chcemy podkreślenia. Po prostu wymieniamy je wszystkie tutaj naraz.
Tuż przed rozpoczęciem przetwarzania następnego wiersza wydrukuj bieżący i wyczyść wiersz wyjściowy. Odcinamy ostatni znak, ponieważ jest to „_” odpowiadające dodanej przestrzeni naziemnej, dodając zero na początku funkcji. (Dodaliśmy to zero, więc nie musielibyśmy dodawać specjalnego przypadku, aby wstawić prawą ścianę, jeśli istnieje, co dodałoby znacznie więcej kodu niż dodaliśmy dodając 0 i odcinając „_”.)
źródło
Python 3
725 bajtów608 bajtów
Kod do gry w golfa:
Oto nielepszy kod. Jest kilka komentarzy, ale podstawową ideą jest tworzenie budynków z podwójnymi ścianami, więc dolna linia wygląda następująco:
Następnie, aby uzyskać indeksy tych podwójnych ścian i usunąć te kolumny, otrzymujemy:
Kod:
Czas na golfa!
źródło
ru(n):return math.ceil(n)
liczy się jako gra w golfa, ale nadal ... Proszę nie bierz tego w negatywny sposób, nie jestem dobry golfista i na pewno nie dobry programista. Sugeruję, żebyś spróbował to poprawić ... To naprawdę fajna zabawa, gdy zdasz sobie sprawę, że możesz ją skrócić. Kilka dni temu przeszedłem z wielu do 120 na 55. Jest to możliwe, nawet jeśli jesteś w tym nowy.PHP,
307297293 bajtówPobiera argumenty * 2 z wiersza poleceń. zapisz do pliku, uruchom z
php <filename> <parameters>
.awaria
źródło
C ++, bez golfa
(a może nie do zdobycia)
Zakładając, że jest mniej niż 100 elementów, a każdy element jest mniejszy niż 100.
s
to liczba budynków (wymagana na wejściu).źródło