Wyzwanie
Twój program lub funkcja zaakceptuje pojedynczy ciąg wejściowy ze STDIN lub parametr funkcji. Możesz założyć, że dane wejściowe będą zawierać tylko znaki alfabetyczne (a-zA-Z), spacje i kropki. W danych wejściowych nie jest rozróżniana wielkość liter, więc powinieneś traktować „a” dokładnie tak samo, jak traktowałbyś „A”.
Dla każdego znaku w ciągu wyświetlisz reprezentację budynku zgodnie z następującą specyfikacją.
Każdy budynek musi mieć dach oznaczony znakiem podkreślenia w górnej linii, a następnie ukośnikiem, spacją i ukośnikiem w drugiej linii.
_
/ \
Będziesz wtedy miał kilka pięter, pasujących do litery (a = 1, b = 2, c = 3 itd.), Które są reprezentowane przez ścianę (|) po każdej stronie i spację w środku. Dolna podłoga (i tylko dolna podłoga) powinna mieć fundament, który jest podkreśleniem między ścianami. Lubię to...
|_|
Na przykład „b” wyglądałoby tak
_
/ \
| |
|_|
Teraz wiemy, że bardzo wysokie, wąskie budynki nie mogą stać i muszą się poszerzyć u podstawy, więc żaden budynek nie może stanąć wyżej niż trzy piętra bez dodatkowego wsparcia. Więc co trzy poziomy (nie mniej) powinieneś dodać „warstwę rozszerzającą”. Warstwa poszerzająca składa się z ukośnika i odwrotnego ukośnika bezpośrednio nad ścianami sekcji poniżej, a sekcja poniżej powinna być o dwie przestrzenie szersza niż sekcja powyżej. Dodatkowa warstwa nie wlicza się do wysokości budynku.
Budynki nie powinny się pokrywać, ale nie powinny mieć między nimi niepotrzebnych przestrzeni, a ziemia jest zawsze płaska, więc wszystkie budynki powinny mieć bazę na tym samym poziomie.
Na przykład „abcdefga” będzie wyglądać tak.
_
/ \
_ | |
_ / \ | |
_ / \ | | | |
/ \ | | | | / \
_ | | | | | | | |
_ / \ | | | | / \ | |
_ / \| | | | / \| | | | _
/ \| || |/ \| || |/ \/ \
|_||_||_||___||___||___||_____||_|
Spacje na wejściu łańcucha powinny być reprezentowane przez podwójną spację.
Kropki na wejściu łańcucha powinny być reprezentowane przez taki gruz.
/\/\
Dalsze przykłady
Dane wejściowe = Hello world.
Wyjście =
_
/ \
| |
| |
| |
/ \
| |
| | _
| | / \
/ \ | |
| | | |
_ | | _ | |
/ \ | | / \ / \
| | / \ | | | |
| | | | | | | |
_ _ | | | | | | | | _
/ \ / \ / \ | | / \ / \ / \
| | | | | | / \ | | | | | |
| | | | | | | | | | | | | |
| | | | | | | | | | | | | |
_ / \ / \ / \ | | / \ / \ / \
/ \ | | | | | | / \ | | | | | |
| | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | |
| | _ / \ / \ / \ | | / \ / \ / \
/ \ / \ | | | | | | / \ | | | | | | _
| | | | | | | | | | | | | | | | | | / \
| | | | | | | | | | | | | | | | | | | |
| | | | / \/ \/ \ | | / \/ \/ \ | |
/ \/ \| || || | / \| || || | | |
| || || || || | | || || || |/ \
|_____||___||_______||_______||_________| |_______________||_________||___________||_______||___|/\/\
Dane wejściowe = lorem ipsum
_
/ \
_ | |
/ \ | |
_ | | | |
/ \ | | / \
| | _ | | | |
| | / \ / \ | |
_ | | | | | | | |
/ \ / \ | | | | / \
| | | | _ | | | | | | _
| | | | / \ / \ / \ | | / \
_ | | | | | | | | | | | | | |
/ \ / \ / \ | | | | | | / \ | |
| | | | | | | | | | | | | | | |
| | | | | | / \ / \ / \ | | / \
| | | | | | | | _ | | | | | | | |
/ \ / \ / \ | | / \ | | | | / \ | |
| | | | | | | | | | | | | | | | | |
| | | | | | / \ | | / \ / \ | | / \
| | | | | | | | | | | | | | | | | |
/ \ / \ / \ _ | | / \ | | | | / \ | |
| | | | | | / \ | | | | | | | | | | | |
| | | | | | | | / \ | | / \ / \ | | / \
| | | | | | | | | | | | | | | | | | | |
/ \/ \/ \ | | | | / \ | | | | / \ | |
| || || |/ \ | | | | | | | | | | | |
| || || || |/ \ | |/ \/ \| |/ \
|_______||_________||___________||___||_________| |_____||___________||_____________||_____________||_________|
Dane wejściowe = a.a.a.x.x.x.a.a.a
_ _ _
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
_ _ _ | | | | | | _ _ _
/ \ / \ / \ | | | | | | / \ / \ / \
|_|/\/\|_|/\/\|_|/\/\|_______________|/\/\|_______________|/\/\|_______________|/\/\|_|/\/\|_|/\/\|_|
Zasady
- Oczywiście jest to kod golfowy, wygrywa najniższy wynik w bajtach
- Obowiązują standardowe zasady dotyczące luk
- Dozwolona jest dowolna liczba dodatkowych pustych wierszy przed wyjściem lub po nim
- Możesz wybrać, aby wydrukować cały wynik w jednym ciągu lub zaoferować wynik jako tablicę, w której każdy element reprezentuje jeden wiersz wyniku, lub wysłać do STDOUT
Uwaga
To jest mój pierwszy post na PPCG, więc nie przejmuj się. To było przez piaskownicę. Wszelkie negatywne punkty lub możliwe ulepszenia prosimy pisać jako komentarz, a ja zrobię, co mogę
[a,z]
i[A,Z]
do[1,26]
wydaje się wymóg bezcelowe. O wiele lepiej byłoby po prostu użyć liczb całkowitych z listy jako danych wejściowych (jako danych0
wejściowych dla gruzu). Również publikowanie wyzwania po tym, jak zostało w piaskownicy tylko przez 21 godzin , bez oczekiwania na głosy lub opinie od więcej niż jednego użytkownika, nie jest liczone jako „przejście przez piaskownicę”. Zaleca się pozostawianie wyzwań w piaskownicy na co najmniej 48-72 godziny, aby dać ludziom dużo czasu na ich przejrzenie.[a,z]
,[1.26]
Parts Mego wymienione. Opcjonalne jest często najlepsze (chyba że jest to kluczowa część wyzwania (nie ma go tutaj).Odpowiedzi:
JavaScript (ES6),
330326...315309 bajtówTworzy rekurencyjnie grafikę ASCII, zaczynając od najniższego piętra i stosując kilka wyrażeń regularnych między każdym etapem:
Jak to działa
1) Dolna podłoga
Zaczynamy od przetłumaczenia ciągu wejściowego na dolne piętro, takiego jak:
gdzie:
y
jest krótszym aliasem odwrotnego ukośnika (który wymaga zmiany znaczenia)0
,1
lub2
) tuż przed sekwencją_
jest lewa ściana budynku. Reprezentuje liczbę ścian, które należy umieścić nad nim przed następną „warstwą rozszerzającą”._
oznacza prawą ścianę budynku i jest zawsze ustawiona na0
.2) Wyrażenia regularne stosowane między każdym etapem
Proces rekurencyjny polega na zastosowaniu 9 zamienników na poprzedniej podłodze przy użyciu następujących wyrażeń regularnych:
/\/y/g
=>" "
(usuń gruz)/_/g
=>"x"
(zastąp fundament lub górę budynku solidnym blokiem)/\/xy/g
=>" _ "
(zamień ostatnią rozszerzającą się warstwę na górę budynku)/1/g
=>"3"
(Tymczasowo zastąpić1
z3
- patrz ostatni etap)/2/g
=>"1"
(Zamiast2
z1
)/\/xx(x+)y/g
=>" 2$10 "
(zastąp warstwę rozszerzającą nową, węższą ścianą)/0(x+)0/g
=>"/$1y"
(zastąp wierzch ściany rozszerzającą się warstwą)/3/g
=>"0"
(Zamiast3
z0
)Na przykład, oto kolejne przekształcenia
2___0
(dolne piętro generowane przez a'f'
):Uwaga : Wierzchołek budynku jest następnie zastępowany przez
x
. Nie pokazano tego na powyższym schemacie.3) Wyrażenia regularne zastosowane do wyniku końcowego
Rekursja kończy się, gdy nie ma już nic do zastąpienia, co oznacza, że jesteśmy poza szczytem najwyższego budynku.
Teraz musimy wszystko wyczyścić za pomocą jeszcze kilku wyrażeń regularnych:
/\d/g
=>"|"
(zamień cyfry na rury)/x/g
=>" "
(zamień bryły na spacje)/y/g
=>"\"
(zamień nay
ukośniki odwrotne)Na przykład:
Próbny
Współtwórcy:
4 bajty zapisane dzięki Hedi
8 bajtów zaoszczędzonych dzięki Not that Charles
źródło
.charCodeAt()
.new
wnew RegExp(e,'g')
y
który nie wymaga ucieczki przed ukośnikiem. 2. Jeśli używasz_
na parterze, można jeszcze odróżnić szczycie z regex:/_ /
.PHP,
386376367364362358356 bajtówpierwsze podejście; może nadal być golfa.
PHP,
366362361360357 bajtówpodobne podejście z podfunkcją:
podział na drugie podejście
+16 bajtów jeśli wiodące znaki nowej linii nie są dozwolone:
Wymień
echo"$o[$y]\n;
sięif($s=rtrim($o[$y]))echo"$s\n";
.-3 bajty dowolnej z
;<=>?[\]^_{|}~
a gruzu Wymienić 1)($n=31&ord($c))
o$n
, 2)$n=28,$w='.'!=$c
w($n=31&ord($c))<27
3)4
z($n=28)/7
.Innym -8 do
>
,^
albo~
jako tłuczeń: Cofanie 3)źródło
if(!$n){$o[$y++].=str_pad(_,$w," ",2);}
-2 bajty dla nawiasówfor($y=36;$y--;)echo"$o[$y]\n";
; ale mam nowe podejście, które oszczędza kolejne 2 bajty.use
działa tylko w przypadku funkcji anonimowych. zaoszczędziłoby 2 bajty; ale musiałbym zapisać tę funkcję w zmiennej$a=
zamiast nadać jej nazwę (+3 bajty) i dodać a$
do każdego z czterech wywołań.Pyth,
9379 bajtówWypróbuj online. Zestaw testowy.
Wyjaśnienie
Domyślnie to ukryłem, ponieważ jest o wiele za długi.
Pokaż fragment kodu
źródło
Perl,
147146 bajtówObejmuje +1 dla
-p
Uruchom z wejściem na STDIN, np
citysky.pl
:Działa tak, jak pokazano, ale należy zastąpić
\xhh
znaki ucieczki ich dosłowną wartością, aby uzyskać deklarowany wynik. Możesz to zrobić za pomocą tego wiersza poleceń:Tak naprawdę nie badałem żadnych innych podejść, więc może to być bardzo do pokonania ...
źródło
Haskell, 289 bajtów
źródło
Ruby, 245
Zezwalasz na tyle dodatkowych linii, ile chcesz, więc biorę z tym wolność. Poza tym proces wygląda następująco:
a
.a[0]
/\/\
doa[0]
c.upcase.ord + (c.upcase.ord-1)/3
)a
:a[t]+=w*(a[0].size-a[t].size)
h
, wyśrodkuj a_
| |
lub/ \
odpowiedniej szerokości (1+2*((h-t)/4
), w zależności od tego, czyh-t%4==0
"|___|"
odpowiednią szerokość doa[0]
a.reverse
Założę się, że mogę zmniejszyć to, jeśli opracuję matematykę, której należy unikać
reverse
źródło
PHP, 297 bajtów
Bardziej czytelna wersja:
źródło