Biorąc pod uwagę liczbę całkowitą, wyślij namiot do góry nogami.
Dane wejściowe określają zarówno rozmiar namiotu (wartość bezwzględna), jak i to, czy wejście znajduje się po lewej stronie (liczby ujemne) czy po prawej stronie (liczby dodatnie).
If input = -1:
____
\/_/
If input = -2:
________
\ / /
\/___/
If input = -3:
____________
\ / /
\ / /
\/_____/
If input = 1:
____
\_\/
If input = 2:
________
\ \ /
\___\/
If input = 3:
____________
\ \ /
\ \ /
\_____\/
et cetera
Pamiętaj, że góra namiotu (tj. Ostatnia linia) ma 2 * abs(input) - 1
podkreślenia.
Nie może być żadnych spacje, tak, że pierwsza linia rozpoczyna się bezpośrednio z podkreślenia.
Załóż, że dane wejściowe nigdy nie będą 0
.
Twój kod powinien być jak najkrótszy.
Wyzwanie to opiera się na mini-czacie Helki Homby na czacie , który może być używany w prawdziwych wyzwaniach zgodnie z warunkami licencji publicznej hobby Hobbina .
3
?Odpowiedzi:
MATL ,
55535251 bajtówWypróbuj online!
Wyjaśnienie
Niech
N
oznacza wejście. Kod przebiega w trzech krokach.Po pierwsze , pierwsza linia
4*N
znaków podkreślenia jest budowana jako ciąg znaków i jest wyświetlana (co usuwa ją ze stosu).Po drugie , „rama” namiotu jest zbudowana przy użyciu dwóch rodzajów cięć. Aby to zrobić, tworzona jest tablica numeryczna 2D, która zawiera
1
i2
odpowiada dwóm typom ukośników oraz0
przestrzeni.Odbywa się to poprzez połączenie czterech macierzy:
abs (N)
;2
w antydiagonalnej;Łączenie tych czterech macierzy w pionie daje,
N=3
przykładowo, następującą4*N × N
macierz:(który po transpozycji zaczyna wyglądać jak namiot).
Zajmujemy się teraz znakiem wejścia. Jeśli jest dodatni, po prostu transponujemy powyższą macierz i indeks do łańcucha
'\/ '
. Indeksowanie jest oparte na 1 i modułowe, więc1
staje się'\'
,2
staje się'/'
i0
staje' '
, tworząc tablicę znaków 2DZ drugiej strony, jeśli dane wejściowe są ujemne, odwracamy pionowo i arytmetycznie negujemy
4*N × N
matrycę, tworzącWskaźnik
-1
odnosi się do'/'
i-2
do'\'
. Oznacza to, że dwa typy ukośników zostały zamienione, zgodnie z wymaganiami. Ponowne transponowanie i indeksowanie do łańcucha'\/ '
daje w ten sposób odwrócony namiot:Po trzecie , podkreślenia należy wypełnić w części ostatniego wiersza tablicy znaków 2D. Pozioma pozycja tej linii zależy od znaku wejścia, a jej długość to
abs(N)
.Po zastąpieniu odpowiednich spacji znakami podkreślenia wynik jest domyślnie wyświetlany poniżej początkowej linii znaków podkreślenia, które były już wyświetlane w pierwszym kroku.
źródło
JavaScript (ES6), 139 bajtów
Namiot rekurencyjnie buduje:
Nie golfił i skomentował
Przykłady
źródło
Python 2,
143 141 139 138137 137 bajtów-2 bajty dzięki @ Sp3000 (nie trzeba nawiasować exec w Pythonie 2)
-1 bajty dzięki @ Sp3000 (użyj
cmp
)Przetestuj to w ideone
Najpierw sprawdzamy, czy
n
jest negatywne, i robimy, jeślid
+1
jest, a-1
jeśli nie.Następnie wybieramy dwa ukośniki
a
ib
używającd
takich, żea='\', b='/'
kiedyn
jest dodatnia, aa='/', b='\'
kiedyn
ujemna.Następnie ustalamy,
s=abs(n)
co można osiągnąćs=n*d
.Następnie obliczamy liczbę
_
na górze (dół obrazu), która jest również liczbą zboku namiotu jako
x=2*s-1
.Następnie obliczamy liczbę
_
u podstawy namiotu (u góry obrazu) i przechowujemy ją tak,y=4*s
ponieważ będzie używana w pętli do utworzenia pozostałej części namiotu.Teraz drukujemy podstawę namiotu za pomocą
print'_'*y
.Następnie drukujemy resztę namiotu, wykonując
s
instrukcje print zi
zainicjalizowaną zmienną pętlową, do0
której zwiększa się1
dla każdej instrukcji print.W pozostałej części namiotu znajdują się
y-3-x-i-i
miejsca w drzwiach ix
miejsca w ciele, aż do osiągnięcia szczytu, gdys-i>1
oceni na False, wybierając_
z'_ '
.W przypadku pozytywnego namiotu z lewymi drzwiami cały namiot, z wyjątkiem wiodących miejsc, jest skierowany tyłem do przodu, więc jest odwrócony, podczas gdy namiot dodatni „z prawymi drzwiami” nie jest z nami
[::d]
.źródło
cmp(0,0)
powraca0
Python 2, 121 bajtów
Po prostu dużo formatowania napisów.
źródło
C #,
215214 bajtówPrzed użyciem można zapisać kilka bajtów
using s=string;
.czyli 15 (przy użyciu) + 184 (metoda) = 199 bajtów.
źródło
var
wewnątrz pętli for nastring
, możesz usunąć drugivar
(w tym miejsce do zapisania bajtu). Tak sięvar f
stajestring f
i;var p=
staje,p=
.TSQL, 195 bajtów
Gra w golfa:
Nie golfowany:
Skrzypce
źródło
V , 66 bajtów
Wypróbuj online!
Jest to dość naiwne podejście, więc postaram się dzisiaj zagrać w golfa. To rozwiązanie zawiera znaki niedrukowalne, więc oto zrzut heksowy:
źródło
05AB1E , 52 bajty
Wyjaśnienie
Wypróbuj online!
źródło
PowerShell v2 +,
217205190187184 bajtówPobiera dane wejściowe
$b
jako liczbę całkowitą. Zauważ, że jeśli$b
jest ujemne, musisz jawnie otoczyć go parens, aby odpowiednio rzucić (patrz przykłady), w przeciwnym razie PowerShell będzie myślał, że to ciąg.Niezależnie od tego, w którą stronę skierowany jest namiot, pierwsza linia jest taka sama, kilka podkreślników; właściwie
4*abs(input)
wielu z nich. Numer ten jest również zapisywany w$a
celu późniejszego wykorzystania. Dodatkowo, teraz, gdy mamy wartość bezwzględną$b
przechowywaną w$a
, zmieniamy$b
się w logiczną wartość jego znaku i wybieramy nasze ukośniki przechowywane w$y
i$z
.Następnym wierszem jest konstruowanie i formułowanie danych wyjściowych, i to jest doozy, więc podzielmy to.
Zasadniczo indeksujemy do tablicy dwóch elementów
(big long calculations saved into $x)
lub$x
na podstawie$b
.Obliczenia dotyczą budowy namiotu. Od pętli
1..$a|%{...}
. W każdej iteracji budujemy linię ciała namiotu. Zaczynamy od liczby spacji równych linii #, w której się znajdujemy-1
, dzięki czemu jest odpowiednio wyrównana do lewej. Jest to przechowywane na$w
później i połączone z odpowiednim ukośnikiem ($ z, na podstawie$b
), następnie liczba spacji w ramce drzwi, następnie drugi ukośnik$y
, a następnie podkreślenia lub spacje, w zależności od tego, czy znajdujemy się w dolnej linii, czy nie, następnie kolejny ukośnik$y
i wreszcie odpowiednia liczba końcowych spacji ($w
) do skonstruowania prostokątnego ciągu. Ta wynikowa tablica ciągów jest przechowywana w$x
.Jeśli wybrana jest lewa połowa tablicy (czyli
$b
jestFalse
od wejścia była pozytywna), a następnie musimy pętli$x
i odwrócić każdy element liniowy - to jest, gdy w grę wchodzą te spacje; pozwala nam po prostu odwrócić linie, a nie ponownie obliczyć odległości.Jeśli
$b
takTrue
, to$x
zamiast tego wybrana jest prawa połowa tablicy .W obu przypadkach potok zawiera teraz tablicę ciągów. Wyjście niejawne przez
Write-Output
następuje po zakończeniu programu, z domyślną nową linią między elementami.Przykłady
źródło
Haskell,
187184183 bajtówWydaje mi się, że nie jest to świetny wynik dla Haskell, więc wszelkie pomysły na ulepszenia są mile widziane.
Nie golfił
źródło
main
tak, aby akceptowałstdin
jako dane wejściowe?:
znaku. tj. zmień"\\" ++ entrance...
na'\\':entrance
.|1>0=(2*(n-i-1))%' '
na|q<-2*(n-i-1)=q%' '
.C,
240207193 bajtówTym razem zoptymalizowałem funkcję g (...) do użycia pojedynczej pętli for.
Tym razem makro X lepiej działa jako funkcja g (...), a ponieważ y i z są parametrami w nowym zakresie, mogę je po prostu zmniejszyć w zakresie g.
Przetestuj za pomocą tej głównej funkcji; To powinno znacznie zmniejszyć golf.
źródło
C #
241231 bajtówZaoszczędź 10 bajtów dzięki @Kevin Cruijssen
Stara wersja:
Pierwotnie miał
new string(...)
jako,Func<char,int,string>
ale zapisany jeden bajt za pomocą konstruktora. Chciałbymint
->char
było niejawneJestem pewien, że moją matematykę też można jakoś naprawić, ale nie widzę jej
źródło
int
przedz=
dodając go do pętli for-:int j=0,z
. A ponieważ używaszstring
dość dużo, możesz dokonać aliasu za pomocąusing s=System.String;
Więc suma staje się:using s=System.String;s f(int N){var f=N<0;N=N>0?N:-N;var o=new s('_',N*4);for(int j=0,z;j<N;){z=-2*j+2*N-2;var O=j>N-2?'_':' ';o+='\n'+new s(' ',j)+'\\'+new s(' ',z)+(f?'/':O)+new s(O,j++*2)+(f?O:'\\')+new s(' ',z)+'/';}return o;}
( 231 bajtów )Swift 2,2 421 bajtów
Cóż ... To była próba.
Gra w golfa:
UnGolfed:
źródło
PHP, 143 bajty
Biegnij z
php -r '<code>' <parameter>
awaria
źródło
Partia, 289 bajtów
Pobiera dane wejściowe na STDIN. Zaczyna się od utworzenia ciągu znaków
2*(abs(n)-1)
podkreślenia. Następnie powtarza się to plus 4 dodatkowe podkreślenia podstawy namiotu. Reszta namiotu składa się z wcięcia (które zwiększa się o 1 w każdej linii), a\
, środka namiotu i a/
. Środek namiotu zaczyna się jako2*(abs(n)-1)
spacje plus plus\
lub/
plus spacja (której nie mogę reprezentować w Markdown) plus inne2*(abs(n)-1)
spacje. Używam ponownie łańcucha podkreślenia i dla wygody zmieniam je na spacje, ale potem z powrotem zmieniam spacje na podkreślenia dla ostatniego wiersza. Każda linia usuwa dwa spacje z jednej strony środka namiotu, chociaż przesunięcie dwóch spacji na początek sznurka jest nieco bardziej golfowe, jeśli to konieczne.źródło
Płótno , 25 bajtów
Wypróbuj tutaj!
źródło