Napisz program, który przyjmuje liczbę całkowitą N za pomocą stdin lub wiersza poleceń.
Jeśli N wynosi 0, pojedyncza litera O
musi być wydrukowana na stdout.
Jeśli N jest dodatnie , ta pozioma podwójna helisa sztuki ASCII , narysowana na szerokość N segmentów, musi zostać wydrukowana.
Jeśli N wynosi 1, wynikiem jest:
/\
O O
\/
Jeśli N wynosi 2, wynikiem jest:
/\ /\
O / O
\/ \/
Jeśli N wynosi 3, wynikiem jest:
/\ /\ /\
O / / O
\/ \/ \/
Jeśli N wynosi 4, wynikiem jest:
/\ /\ /\ /\
O / / / O
\/ \/ \/ \/
Wzór jest kontynuowany dokładnie w ten sam sposób dla większych N. Zauważ, że ukośnik do przodu ( /
) musi być stosowany we wszystkich miejscach, w których przecinają się helisy, z wyjątkiem O
końców.
Jeśli N jest ujemne , ta pionowa podwójna helisa sztuki ASCII, narysowana -N segmenty wysokości, musi zostać wydrukowana.
Jeśli N wynosi -1, wynikiem jest:
O
/ \
\ /
O
Jeśli N wynosi -2, wynikiem jest:
O
/ \
\ /
\
/ \
\ /
O
Jeśli N wynosi -3, wynikiem jest:
O
/ \
\ /
\
/ \
\ /
\
/ \
\ /
O
Jeśli N wynosi -4, wynikiem jest:
O
/ \
\ /
\
/ \
\ /
\
/ \
\ /
\
/ \
\ /
O
Wzór jest kontynuowany dokładnie w ten sam sposób dla mniejszych N. Zauważ, że \
odwrotne ukośniki ( ) muszą być stosowane we wszystkich miejscach, w których helisy się krzyżują, z wyjątkiem O
końców.
Detale
- Zamiast programu możesz napisać funkcję, która przyjmuje N jako liczbę całkowitą i drukuje wynik normalnie lub zwraca jako ciąg znaków.
- Dane wyjściowe dla dowolnego N mogą opcjonalnie zawierać końcowy znak nowej linii.
- Dowolny wiersz wyniku dla dowolnego N może opcjonalnie zawierać 4 lub mniej końcowych spacji.
- Nigdy nie powinno być żadnej wiodącej przestrzeni, która nie jest częścią określonego wzorca.
- Najkrótszy kod w bajtach wygrywa.
źródło
<spc>O<spc>
lub\nO\n
. Czy niepotrzebne wiodące białe znaki są dozwolone?print "."
Powiększ, aby zobaczyć helisę. * nodnod *Odpowiedzi:
CJam,
56 55 53 5250 bajtówSpójrz na ten rozmiar! Głównymi winowajcami są
N = 0
przypadki szczególne i\
zamiast/
w pionowej helisie.Oto jak to działa:
Kod podzielony jest na trzy części:
X0>"\/"=" / \\\ / "+
daje jedną"/ / \\\ / "
lub"\ / \\\ / "
co jest kluczowe, ponieważ spirala jest po prostu złożona z naprzemiennie"/ \"
i"\ /"
połączona przez jedną" / "
lub" \ "
. Na przykład, jeśli weźmiesz pod uwagę dane wejściowe2
, to twój ostatni powtórzony ciąg będzie"/ / \\ / / / \\ / "
(bez ucieczki). To oczywiście ma dodatkowe/
na początku i dodatkowe miejsce na końcu.2
pożądany ciąg końcowy bez znaków nowej linii byłby" O / \\\ / / / \\\ / O"
, ale po powyższym punkcie mamy tylko"/ / \\\ / / / \\\ / "
. Usuwamy więc pierwszą postać, dodajemy spację i'O
na początku, a drugą'O
na końcu. Następnie podzieliliśmy go na części 3'O
(dla wielkości 0)Wypróbuj online tutaj
źródło
JavaScript (ES6), 126
132 133Przy użyciu ciągów szablonowych liczą się znaki nowej linii.
Bardziej czytelny
źródło
n=>(
robi? Nigdy wcześniej nie widziałem ani nie używałem tego operatora.Pyth, 52 bajty
Demonstracja.
Wyjaśnienie:
Pierwsza sekcja
M[Jj"/\\"*hGdjP*G+*2dH*2\O_J)
definiuje funkcjęg
, która pobiera dwa dane wejściowe. Pierwszym wejściemG
jest liczba powtórzeń do użycia. Jest to bezwzględna wartość wejściowa. Drugim wejściemH
jest znak, który należy umieścić na środku spirali.Funkcja zwraca listę 3 elementów, która składa się z 3 linii spirali dodatniej i 3 kolumn spirali ujemnej.
Pierwszy element jest zdefiniowany przez
Jj"/\\"*hGd
.*hGd
to ciągG+1
spacji.j"/\\"*hGd
łączy ten ciąg z"/\"
delimerem.J
Na początku oszczędza uzyskanej wartości do wykorzystania w przyszłości.Drugi element to
jP*G+*2dH*2\O
. Zaczynamy od+*2dH
. Są to dwie spacje, po których następuje znak wejściowy. Następnie powtarzamy ten ciąg znaków zaG
pomocą*G
. Następnie usuwamy jego końcową postać za pomocąP
. Na koniec otaczamy ten ciąg dwomaO
znakami, przy pomocyj ... *2\O
.Trzeci element jest generowany za pomocą
_J
. Jest to po prostu odwrotność pierwszej linii.Druga sekcja
?jb?gQ\/>Q0msdCg_Q\\Q\O
wybiera pomiędzy trzema różnymi możliwościami, dodatnią, ujemną i zerową. Pierwszy warunek „jeśli-to” włączonyQ
, wejście. Drugi warunek dotyczy>Q0
tego, czy sygnał wejściowy jest dodatni.Jeśli
Q
wynosi zero, drukowany jest\O
znakO
.Jeśli
Q
jest niezerowy, łączymy wynik drugiej trójki na znakach nowej linii i drukujemy za pomocąjb
. JeśliQ
jest pozytywna, lista połączone i wydrukowane togQ\/
,g(Q,"/")
.Jeśli
Q
jest ujemna, lista jest dołączana i drukowanamsdCg_Q\\
. Zaczynamy odg_Q\\
, czylig(-Q,"\")
. Następnie transponujemy wiersze i kolumny za pomocąC
.msd
zamienia powstałe krotki znaków w ciągi znaków, gotowe do połączenia na nowej linii i wydrukowania.źródło
Python 2, 118
Tworzy pionową podwójną helisę z listy ciągów i transponuje ją, aby uzyskać poziomą. Jestem pewien, że można to poprawić.
źródło
Java,
500488 bajtówMoja pierwsza próba i niestety jest 10 * dłużej niż obecny lider :(. Czy ktoś ma jakieś wskazówki (inne niż użycie innego języka)?
źródło
import System.*
oszczędzić pisaniaSystem
?import static java.lang.System.*;
lub mógłby zapisać standardowy strumień wyjściowy jako zmienną (choć nie wiem, czy w tym przypadku zapisałby lub przeszkodziłby, nie sprawdził).sc
zmiennej, ponieważ jest ona wywoływana tylko raz. Ogolił 14 bajtów.class M{public static void main(String[]a){int n=new Integer(new java.util.Scanner(System.in).next()),i=n;if(n>0){for(;i-->0;)o(" /\\");o("\no");for(i=n;i-->1;)o(" /");o(" o\n");for(i=0;i++<n;)o(" \\/");}else if(n<0){o(" o \n");for(i=0;i++<~n;)o("/ \\\n\\ /\n \\ \n");o("/ \\\n\\ /\n o \n");}else o("o\n");}static<T>void o(T s){System.out.print(s);}}
( 352 bajty ) Wypróbuj online.n->{int i=n;if(n>0){for(;i-->0;)o(" /\\");o("\no");for(i=n;i-->1;)o(" /");o(" o\n");for(i=0;i++<n;)o(" \\/");}else if(n<0){o(" o \n");for(i=0;i++<~n;)o("/ \\\n\\ /\n \\ \n");o("/ \\\n\\ /\n o \n");}else o("o\n");};<T>void o(T s){System.out.print(s);}
Wypróbuj online.Haskell, 156 bajtów
Następnie możesz napisać jako:
źródło
1<2
lubTrue
zapisywać bajty.C #,
242241238230222219 bajtówZachęcony komentarzem Martina , oto moja pierwsza próba czegoś takiego:
Bardziej czytelnie:
źródło
C #
199197196 bajtówWersja bez golfa:
Chodzi o to, aby zbudować wyświetlacz poziomy z wyświetlacza pionowego, renderując transponowaną matrycę znaków.
źródło
for(;m>0;--m)
nafor(;m-->0;)
w obu pętlach"\n/ \\\n\\ /\n "
można również skrócić zgodnie z metodami w mojej odpowiedzi - tj. Użyć@"..."
, gdzie każdy „\\” staje się „\”, a każdy „\ n” staje się prawdziwą nową liniąbool u
navar u
kolejny cały bajt :)Python 3, 118 bajtów
Moje pierwsze zgłoszenie do gry w golfa, więc może nie być wcale imponujące.
Po prostu używa Python's ... if ... else ... trójskładnikowy operator do rozdzielenia trzech scenariuszy. To daje ciąg złożony z powtarzania niektórych mniejszych ciągów określoną liczbę razy do wydrukowania.
źródło
Julia, 229 bajtów
O rany, to jest o wiele za duże. To najdłuższa jak dotąd odpowiedź z dużym marginesem. Prawdopodobnie mógłbym dużo zaoszczędzić, zwracając ciąg zamiast go drukować lub całkowicie unikając matrycy. Eksperymentuję z tym później.
Tworzy to funkcję lambda, która przyjmuje pojedynczą liczbę całkowitą i drukuje odpowiednio sformatowaną podwójną helisę. Aby to nazwać, nadaj mu nazwę, np
f=n->(...)
.Niegolfowane + wyjaśnienie:
Kilka przykładów:
źródło
Python 3, 135 bajtów
Wypróbuj online tutaj
źródło
Perl, 91
97Ostatecznie transpozycja okazała się zbyt droga.
Poprzednie rozwiązanie:
Przetestuj mnie .
źródło
/^0/?O:etc
je$_?etc:O
$".="\23"^"\\ / \\ \\ / "x abs."O ";print/-/?$":/^0/?O:map{reverse$/,$"=~/(.).{$_}$/mg}0..2
Schemat, 379 bajtów
Moja pierwsza próba golfa kodowego i niestety jedna z najdłuższych. :(
Niesklasyfikowane:
źródło
Java, 282
Moje pierwsze podejście ze szczególnie ładnymi nazwami zmiennych:
Nie mam pojęcia, dlaczego to robię. To musi być coś rekreacyjnego.
źródło
Java, 317
Moja pierwsza próba golfowego kodu.
źródło
Python 3, 165 bajtów
Wypróbuj online tutaj .
źródło
Perl,
193197187180166163B1 bajt kary za przełącznik -n wiersza poleceń. Uruchom z
echo 1|perl -M5.10.0 -n scratch.pl
:Z białymi znakami:
źródło
-M5.10.0
nie wpływa na liczbę bajtów?say
jest przydatny do gry w golfa…PHP, 341
Wersja bez golfa
źródło
JAVA 377
384bajtyźródło
C ++
269262258źródło
R,
228201Moja pierwsza próba golfa kodowego. Myślę, że to działa, ale nie jest subtelne.
źródło
Groovy,
142134129125120118Nareszcie związany z python 2!
źródło
Węgiel drzewny ,
282422 bajtówWypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Wydrukuj górę
O
i pozostaw kursor o jedno miejsce w dół i w lewo.Drukuj łańcuchy
/
,\
a\
i powtórzyć dla absolutnej wartości numer wejścia.Wróć do ostatniego
\
.Zastanów się, aby utworzyć prawą stronę helisy. Robię to tutaj, ponieważ w przeciwnym
↗
razie nie parsowałyby się jednoznacznie.Nadpisać ostatnią
\
ze związkiemO
.Jeśli dane wejściowe były dodatnie, obróć płótno.
źródło
Płótno ,
333230 bajtówWypróbuj tutaj!
Wyjaśnienie:
źródło
C ++, 352
Wcale nie najkrótsza odpowiedź, ale jak dotąd pierwsza w C ++ :)
Tutaj jest w C ++ Shell z białymi znakami do przetestowania
źródło
perl 156
Całkiem prosta próba, mój drugi golf. Myślę, że nowe linie liczą się jako 1 bajt, prawda?
Teraz wymyślę, jak połączyć wszystkie te trójskładniki razem. Mam dużo miejsca na ulepszenia z tymi
:'';
wszędzie.źródło
C, 189 bajtów
Z białymi znakami i znakami nowej linii:
Kilka uwag na temat tego podejścia:
źródło
Perl, 184 bajty
Myślałem, że to będzie o wiele krótsze! Prawdopodobnie jest kilka prostych rzeczy, które mogę zrobić, aby zaoszczędzić kilka bajtów. Minęło pięć lat, odkąd poważnie programowałem w Perlu!
źródło
PHP, 155
źródło
J ,
67 59 5551 bajtówWypróbuj online!
źródło