Napisz program, który przyjmuje (za pomocą STDIN / wiersza poleceń) nieujemną liczbę całkowitą N.
Gdy N wynosi 0, twój program powinien wypisać O
(to jest duże, a nie zero).
Gdy N wynosi 1, twój program powinien wydrukować
\|/
-O-
/|\
Gdy N wynosi 2, program powinien wydrukować
\ | /
\|/
--O--
/|\
/ | \
Gdy N ma wartość 3, program powinien wydrukować
\ | /
\ | /
\|/
---O---
/|\
/ | \
/ | \
W przypadku większego N wzór ten jest kontynuowany w ten sam dokładnie sposób. Każda z ośmiu promieniach słońca „” powinny być wykonane z odpowiednich N -
, |
, /
lub \
znaków.
Detale
- Zamiast programu możesz napisać funkcję, która przyjmuje liczbę całkowitą. Ta funkcja powinna normalnie wydrukować projekt słońca lub zwrócić go jako ciąg znaków.
Musisz albo
- nie mają żadnych spacji końcowych, lub
- ma tylko tyle spacji końcowych, że wzór jest idealnym prostokątem (2N + 1) * (2N + 1).
Dane wyjściowe dla dowolnego lub wszystkich N mogą opcjonalnie mieć końcowy znak nowej linii.
Punktacja
Najkrótszy kod w bajtach wygrywa.
code-golf
ascii-art
kolmogorov-complexity
Hobby Calvina
źródło
źródło
N=0
.Odpowiedzi:
Pyth,
393836 bajtówWypróbuj online: Pyth Compiler / Executor
Wyjaśnienie
Kolejnym 36-bajtowym rozwiązaniem byłoby:
źródło
C:
11610299959290Myślę, że zbliżam się do minimalnego rozwiązania przy użyciu tego podejścia, ale nie mogę przestać czuć, że istnieje o wiele lepsze podejście w C. Ungolfed:
źródło
c,r;s(n){for(r=c=-n;r<=n;c++)putchar(c>n?c=-c,r++,10:c?r?c-r?c+r?32:47:92:45:r?124:79);}
GNU sed, 252 + 1
Uff - pobiłem odpowiedź php!
Ocena + 1 za użycie
-r
parametru.Z powodu ograniczeń sed musimy spalić prawie 100 bajtów, po prostu przekonwertować N na ciąg N spacji. Reszta to dobra zabawa.
Wyjaśnienie
:
) przekształca N w ciąg N spacjis/ //
usuwa jedną spacjęs^.*^\\&|&/^;ta
konwertuje spacje N-1 na:\
+ spacje N-1 +|
+ spacje N-1 +/
\
jedną spację w prawo i/
jedną spację w lewo ...\|/
, który zostanie zastąpiony-O-
i przeskocz don
etykietyze
-
i wydrukować-0-
z/|\
, i wymienićz
-
i wskoczyć z powrotem do pętli głównej\
jedną spację w prawo i/
jedną spację w lewo ...\$
co wskazuje, że zostały zakończone i zakończ.Wynik
źródło
J,
373440 bajtówStosowanie:
Objaśnienie (od lewej do prawej):
i:
generuje listę-n, -(n-1), ..., n-1, n
( )"*/~@i:
tworzy iloczyn Descartesa i: ze sobą w układzie macierzy, np. dlan = 1
tworzy następującą3-by-3
macierzdla każdego elementu macierzy z liczbami całkowitymi
x y
wykonujemy następujące czynności+&|,-,+,[,]
obliczyć listę właściwości+&|
abs(x)+abs(y)
, równa się0
iff (jeśli i tylko jeśli)x=0
iy=0
-
xy, równa się0
iff,x=y
czyli jesteśmy na przekątnej+
x + y, równa się0
iff,x=-y
czyli jesteśmy na anty-przekątnej[
x równa się0
iff,x=0
czyli jesteśmy w środkowym rzędzie]
y równa się0
iff,y=0
czyli jesteśmy w środkowej kolumnie'O\/-|'#~0=
porównaj powyższe wartości właściwości0
ii
pobierz znak th z ciągu,'O\/-|'
jeślii
właściwość th jest prawdziwa.{.
pobiera pierwszy znak ciągu, a jeśli nie ma nikogo, zwraca spację jako dopełnienie, tak jak potrzebujemy1:echo
Wypróbuj online tutaj.
źródło
PHP, 182 bajty
To wydawało się zabawne zajęcie dla mojej pierwszej odpowiedzi. Komentarze do mojego kodu są mile widziane.
Oto kod bez golfa z komentarzami:
Edytowane z kodem przez royhowie
źródło
if(($y-$h)==($x-$h))
robi to samo coif(($y==$x)
. Możesz uratować inną postać, zastępującif($x==y$)foo();else bar();
jąif($x^$y)bar();else foo();
. Powinieneś także spróbować użyć operatorów trójskładnikowych zamiastif .. else
instrukcji.function s($n){$e=2*$n+1;for($i=0;$i<$e*$e;$i++){$x=$i%$e;$y=floor($i/$e);echo$y==$x?($x==$n?"O":"\\"):($e-1==$x+$y?"/":($y==$n?"-":($x==$n?"|":" ")));echo$x==$e-1?"\n":"";}}
$r
; po prostu użyjecho
($r.=
to ta sama ilość bajtów, coecho
). 2. używany operator trójskładnikowy (zapisuje wiele znaków). 3.$h
był bezużyteczny, ponieważ był równy$n
. 4. Nie należy używaćfloor
do$x = floor($i%$e);
, ponieważ moduł na liczbę całkowitą nie będą musiały być zaokrąglona w dół.Python 2, 99
Druki linia po linii, tworząc każdą linię poprzez sprawdzenie czy współrzędnych
(i,j)
(skoncentrowane na(0,0)
) spełniaj==-i
,j==0
,j==i
albo żaden z hack aby uczynić pracę linii środkowej.źródło
R
zamiast.5
zapisać 1 bajt.CJam,
48 45 43 4138 bajtówTo wciąż jest za długie i wciąż robię zbędne rzeczy, ale oto:
Wypróbuj online tutaj
źródło
SpecBAS - 117 bajtów
Spowoduje to wydrukowanie ukośników i myślników w jednej pętli, a następnie umieszczenie „O” na środku.
Wyjście za pomocą 1, 2 i 9
źródło
"-": NEXT y: PRINT AT s,s;"O"
do"-";AT s,s;"O": NEXT y
zaoszczędzić dwa bajty.JavaScript (ES6) 97
98To wydaje się dość inne ...
źródło
OS / 2 Classic Rexx, 102 ... lub 14 dla „wersji oszustów”
Wyjmij kanały, aby je „zagrać w golfa”.
Wersja cheatera, nazwij skrypt dowolnym kodem źródłowym, którego chcesz, o długości do 255 znaków (wymaga dysku HPFS):
EDYCJA: Żeby było jasne, wersja oszustów nie jest przeznaczona! To po prostu głupie i pokazać, że stary pies wciąż może robić sztuczki. :)
np. W przypadku prawdziwej zabawy i gier implementacja wyrażeń „lambda” w stylu Java-8 / C11 w iteratorze list. Nie przetestowano, ale powinien działać na komputerze mainframe IBM z 1979 r. ;)
- Kod wywołujący zakłada oczywiście, że już utworzyłeś rdzeń (tablicę).
źródło
Haskell,
1099896 bajtówDzięki im i Maurisowi za pomoc!
Wyjaśnienie:
Operator
#
określa, który znak pojawia się we współrzędnych (i, j), a słońce jest wyśrodkowane na (0,0). Funkcjaf
buduje wynik Łańcuch odwzorowując#
wszystkie pary współrzędnych od -n do n.Stosowanie:
źródło
s
, na przykład0#0='O'
,0#_='-'
itp i1<2
zamiastTrue
.map(i#)[-n..n]
zaoszczędzić dwa bajty.R
177149 bajtówMickey T. jest mężczyzną! Pomógł mi naprawić moje pierwotnie niepoprawne rozwiązanie i zaoszczędzić 28 bajtów. Dzięki, Mickey!
Niegolfowane + wyjaśnienie:
Wszelkie dalsze sugestie są mile widziane!
źródło
scan
Naprawdę nie potrzebnew=
. Można go również głębiej przełożyć na polecenia.if
Można porzuciła jeśli zmieni sposób matryca jest obsługiwany w kilku przypadkach. Stosuję jem=matrix(" ",(w=2*(n=scan()+1)-1),w);m[row(m)-rev(col(m))==0]='/';diag(m)="\\";m[,n]='|';m[n,]="-";m[n,n]="O";m[,w]=paste0(m[,w],'\n');cat(t(m),sep='')
. Myślę, że dalsza gra w golfa.C #,
230226 bajtówZgodnie z żądaniem wersja bez golfa: string ug (int n) {
To jest mój pierwszy post, więc przepraszam, jeśli zrobiłem coś źle. Wszelkie uwagi i poprawki są mile widziane.
źródło
s=2*n+1
raczej zamiasts=(n*2)+1
iw==s-h-1
zamiastw==(s-h)-1
tego sprawi, że będzie to nieco krótsze.Rubin:
9892 znakówProc, który zwraca łańcuch ze Słońcem.
Przykładowy przebieg:
źródło
Rdza, 215 znaków
Próbowałem użyć metody krojenia ciągów (tworząc ciąg
n-1
spacji i krojenie do i z indeksu) w następujący sposób:Ale to właściwie 3 znaki dłużej.
Nieskluczony kod:
Najbardziej podoba mi się to, jak golę kilka znaków na ciągach formatujących. Na przykład,
jest równa
ponieważ „automatyczne zwiększanie” pozycji argumentu ciągu formatu nie ma wpływu na ręczne określenie liczby i działa całkowicie niezależnie.
źródło
Oktawa 85
Zbudowanie macierzy jak zawsze =)
eye
tworzy matrycę tożsamości, reszta jest chyba oczywista.źródło
IDL 8.3, 135 bajtów
Nie wiem, czy można bardziej grać w golfa ... To bardzo proste. Najpierw tworzymy
m x m
tablicę (m=2n+1
) pustych ciągów; Następnie zwracamy znaków w linii (y=x
,y=-x
,y=n
, ix=n
). Następnie upuszczamy O w punkcie(n, n)
i drukujemy całość, sformatowaną jakom
ciągi długości 1 w każdej linii, aby nie było dodatkowych odstępów od natywnego drukowania tablicy.Test:
źródło
Matlab,
9387 bajtówNiestety nagłówek funkcji musi być tak duży ... Poza tym myślę, że całkiem dobrze gra w golfa. Zastanawiam się, czy można to zrobić lepiej z niektórymi różnicami składniowymi w Octave.
źródło
N=input('')
do zapisywania 2 znaków. Poza tym możesz po prostu napisać,[E V D;H 79 H;D V E '']
aby przekonwertować całą macierz na tablicę char, co pozwoli ci zaoszczędzić kolejny bajt lub dwa. (Właśnie przesłałem program Octave z nieco innym podejściem, ale zanim znalazłem twój =)JavaScript ( wersja robocza ES7 ) 115
źródło
Pyth - 52 bajty
Najtrudniejsze było wymyślenie, jak zamieniać ukośniki z każdej strony. Postanowiłem zdefiniować lambda, która używa symboli.
Prawdopodobnie można grać w golfa więcej, wyjaśnienia wkrótce.
Wypróbuj online tutaj .
źródło
Perl, 94
Jest tu wiele zagnieżdżonych operatorów trójskładnikowych, ale myślę, że kod jest dość prosty.
Wypróbuj tutaj: ideone.com/E8MC1d
źródło
for$x(-($n=<>)..$n){map{print$x^$_?$x+$_?$x?$_?$":'|':'-':'/':$x?'\\':O}-$n..$n;print$/}
- Kilka poprawek: zamień wewnętrzny na na mapę i zmień $ y na $ _; inline($n=<>)
.C # - 291 (pełny program)
źródło
JavaScript (ES6),
139135140 + 1 bajt(+1 dotyczy
-p
flagi z węzłem w konsoli)naprawiony:
stosowanie:
bez golfa:
źródło
(A=Array).from(A(m))
Python 3,
193186 bajtówGrał w golfa
Wynik
Nie golfił
źródło
s=' ',b='\\',f='/',d='|',g='-'
jest bardzo długi, więc lepiej byłoby przenieść go, dodającs,b,f,d,g=" \/|-"
do drugiej linii." \/|-"
jako pojedynczy ciąg, zamiast rozdzielać go na pojedyncze znaki. Możesz rozpakować ciąg taki jakx,y,z="123"
, co sprawiax="1"
,y="2"
iz="3"
.CJam,
5955 bajtówTo nie zdobędzie żadnych nagród w obecnej postaci, ale byłem szczęśliwy, że udało się!
Dzięki Sp3000 za wskazówki dotyczące gry w golfa.
źródło
S
zamiast'
wersji dla miejsca i 2)'-A*'O'-A
Możesz zrobić'-A*_'O\
zamiast tego, ponieważ dwukrotne wygenerowanie go jest długiePython,
175 129 127125 bajtówWypróbuj online tutaj .
źródło
Rubin - 130 bajtów
stosowanie:
źródło
f=->n{a=(0...n).map{|i|(s=' ')*i+?\\+s*(m=n-1-i)+?|+s*(m)+?/+s*i};puts(a+[?-*n+'O'+?-*n]+a.reverse.map(&:reverse))}
(Zobacz Wskazówki dla golfa w Ruby, aby uzyskać więcej.)Perl
8591908986B.Nie golfowany:
źródło
Prolog, 219 bajtów
Nie, to niewiele z golfowego języka. Ale myślę, że ta strona potrzebuje więcej Prologu.
Testowane
swipl
na systemie Linux. Wywołać tak:swipl -s asciiSun.prolog
; następnie zapytaj o pożądany rozmiar słońca:Nie golfowany:
źródło
JavaScript (ES6),
142140134117 bajtówSpróbuj
źródło