Ponownie zainspirowany zadaniem programowania 101, oto kolejne wyzwanie.
Wkład:
- Dodatnia liczba całkowita
n >= 3
. (musi być nieparzysty)
Wydajność:
n
linie gwiazdek, gdzie pierwsza linia man
gwiazdki, a każda nowa linia ma dwie gwiazdki mniej niż poprzednia linia. Aż do trafienia 1 gwiazdką. Stamtąd każda nowa linia ma dwie gwiazdki więcej niż linia wcześniej, aż do powrotu don
gwiazdek. Spacje lub coś w rodzaju spacji muszą zostać użyte do wyrównania gwiazdek, aby naprawdę wyglądały jak klepsydra.
Główne zasady:
- Końcowe znaki nowej linii są dozwolone, ale nie muszą być używane.
- wcięcie jest koniecznością.
- To jest golf golfowy, więc wygrywa najkrótsza odpowiedź w bajtach.
- Ponieważ kurs jest nauczany w C ++, chętnie widzę rozwiązania w C ++.
Przypadek testowy (n = 5):
*****
***
*
***
*****
Odpowiedzi:
Węgiel , 6 bajtów
Zupełnie proste. Wyciągnąć poli G o o
*
, o długości boku pobranej z wejścia N umbra, gdzie boki przejść dół i w prawo, w lewo, w poziomie i w górę i w prawo:Następnie wypełnij kontur automatycznie i wypełnij go.
Wypróbuj online!
źródło
Python 2, 57 bajtów
Pełny program. Przechodzi linia po linii, wypisując odpowiednią liczbę gwiazdek na środku.
Funkcja rekurencyjna była dłuższa (67 bajtów):
lub
źródło
max
ze związkiemabs
, ale wszystko co mam toabs(n-1)+1
, co jest gorsze, ponieważ dodatek wymaga nawiasów'*'*-~abs(n-1)
, ale wtedy ma ona taką samą długość jak'*'*max(n,2-n)
.def f(n,s=''):r=s+'*'*n+'\n';return 1/n*r or r+f(n-2,s+' ')+r
na 61 bajtów, ale wciąż jest dłuższy. Nawet z wiodącą nową liniądef f(n,s='\n'):r=s+'*'*n;return 1/n*r or r+f(n-2,s+' ')+r
wciąż ma 58 bajtów ...center
. Nigdy nie wiedziałem, że istniało do tej pory.V , 12 bajtów
Wypróbuj online!
Lubię takie wyzwania, ponieważ mogę pochwalić się zaletami natury 2D 2D. Wyjaśnienie. Najpierw musimy utworzyć ciąg n gwiazdek. Robimy to:
Na marginesie, jest to bezpośrednio równoważne z
@ai*<esc>
vim, a rejestr@a
jest wstępnie inicjowany na „arg1”. Dzięki temu wprowadzanie numeryczne jest znacznie wygodniejsze.Następnie poruszamy się postacią w prawo za pomocą
h
. Oto część zabawy:Teraz technicznie ta ostatnia część jest
Ponieważ tak naprawdę jest polecenie wcięcia
>>
. V dogodnie zakłada, że niekompletne polecenia dotyczą bieżącej linii, a także domyślnie wypełnia drugiò
znak w celu zapętlenia.źródło
C ++ Metatemplates, 186 bajtów
Z wyraźną formułą z mojej odpowiedzi C, Metatemplates konkurują!
Nie golfowany:
stosowanie:
niekonkurujący
Dla zabawy:
Stosowanie:
źródło
PowerShell v2 +, 54 bajty
Zajmuje wejście
$n
(gwarantowane być nieparzysta liczba całkowita), konstruuje dwa zakresy z$n..1
a2..$n
i łączy je ze sobą, a następnie używaWhere-Object
, aby wybrać tylko te z nieparzystych|?{$_%2}
. Te są wprowadzane do pętli. W każdej iteracji konstruujemy odpowiednią liczbę spacji, połączonych ciągiem znaków z odpowiednią liczbą gwiazdek. Te ciągi są pozostawione w potoku, a dane wyjściowe za pośrednictwem niejawnychWrite-Output
wstawia między nimi nowe wiersze po zakończeniu programu.Przykłady
źródło
Python, 78 bajtów
Tylko z wcięciem:
Stosowanie:
źródło
C,
114109 bajtówbez golfa:
Poprzednie rozwiązanie rekurencyjne:
źródło
JavaScript (ES6), 66 bajtów
Chodzi o to, aby wygenerować każdą klepsydrę z poprzedniej: dodaj spację na początku każdej linii oraz dodawaj i dodawaj
n
gwiazdki.źródło
05AB1E ,
21201917 bajtówZaoszczędzono 2 bajty dzięki carusocomputing
Wypróbuj online!
Wyjaśnienie
źródło
Ir"*"×.pRû
- Dotarłem tak daleko, twarz zbladła, kiedy zdałem sobie sprawę, jak daleko jestem, zobaczyłem, że odpowiedziałeś, idziesz spróbować nauczyć się iteracji w tym języku, korzystając teraz z tego przykładu. Dzięki!;ƒ'*¹N·-×Nð×ì})û»
użyj nowego polecenia palindromize. -2 bajty.ÅÉ
i.c
prawdopodobnie nie były jeszcze dostępne w momencie, gdy to opublikowałeś. :)MATL , 12 bajtów
Wypróbuj online!
Wyjaśnienie
Wykorzystuje to ostatnio dodaną funkcję zakresu symetrycznego .
źródło
PHP, 95 bajtów
Zamiast zapisywać wiersze w tablicy, a następnie wyprowadzać wszystko, pętla for przechodzi w dół do 1, a następnie wraca do pierwotnej liczby.
źródło
C ++ 11, 93 bajty
Nieznacznie nie golfista:
Stosowanie:
źródło
'\n'
ze10
:)MATL , 20 bajtów
Wypróbuj online!
źródło
R, 77 bajtów
Tworzy macierz znaków, którą następnie drukuje
cat
,fill=n
upewniając się, że linie są odpowiednio wyrównane. Zauważ, że elementy są przechowywane w macierzy jako pierwsze w kolumnie (tzn. Pierwsze dwa elementy są,M[1,1]
aM[2,1]
nieM[1,2]
).źródło
Java 7,
170 165164 bajtyDzięki @Hypino za oszczędność 5 bajtów.
Dzięki Kevinowi za uratowanie 1 bajtu.
źródło
s=
zs=s+"\n"
i 2 więcej bajtów, zmieniającreturn(n=--n-1)
sięreturn(n=n-2)
w sumie 4 bajty.String s="",c="",t="";
doString s,c,t=s=c="";
( -2 bajtów ) ireturn(n=n-2)>=0?s+"\n"+c+c(n,++x)+
doreturn n-1>0?s+"\n"+c+c(n-2,++x)+
( ponownie -2 bajtów )n=n-2
->,n-1>0
ponieważ n powinno być użyte w innym argumencie funkcji.n
sięn-2
w tej części.return(n=n-2)>=0 ... n
zmiana nareturn n-1>0 ... n-2
jest wciąż krótsza. PS: Podziękowałeś mi za zapisanie bajtów, ale nie zmieniłeś kodu w swojej edycji. ;)String c(int n,int x){String s,c=s="";int i=0;for(;i++<n;s+="*");for(i=x;i-->0;c+=" ");return n>1?s+"\n "+c+c(n-2,x+1)+"\n"+c+s:"*";}
bezt
( test ideone - 133 bajty )PHP - 95 bajtów
Zapisano bajt, używając rzeczywistej nowej linii zamiast
"\r"
źródło
Pyth, 22 bajty
Program, który pobiera liczbę całkowitą na STDIN i wypisuje wynik.
Wypróbuj online
Jak to działa
źródło
C,
195191 bajtówPowinieneś grać w golfa nieco mniej
Możemy to przetestować tutaj na ideone
źródło
C, 79 bajtów
Dzieli zmienną odliczania
k
na indeksy wierszy i kolumn. Jeśli indeks kolumny to 0 (ostatni znak z rzędu), to wypisuje znak nowej linii (10). Następnie dopasowuje indeksy wierszy i kolumn wokół środkowej gwiazdki. Zatemabs(x) < abs(y)
jest krótki warunek wyprowadzenia spacji.źródło
Rubinowy,
5554 bajtówźródło
?**n
Prace; nie potrzebujesz tam miejsca.Java 7, 156 bajtów
Dość proste. Śledzi linie z
n
, gwiazdy zj
, spacjes
i kierunek zd
. Naprawdę chciałem po prostu nierekurencyjnej odpowiedzi Java na tablicy, ale nie szkodzi, że jest ona również nieco krótsza :)Z podziałami linii:
źródło
APL, 19 bajtów
Test:
Wyjaśnienie:
źródło
1+
i użyć APL, który ma⎕IO←0
.Haskell, 84 bajty
źródło
putStr
i można pozbyć sięfromEnum
jak ten .C (gcc) ,
8074 bajtówDziękuję pułapkowi za 6 bajtów
Wypróbuj online!
źródło
PowerShell ,
5450 bajtówWypróbuj online!
źródło
PHP ,
10488 bajtówWypróbuj online!
To nie bije najniższych wyników dla PHP w tym wyzwaniu, ale jest to po prostu zbyt szalone, żebym go wyrzucił.Ok, więc grałem w golfa, aby być (nie na długo) najniższym wynikiem dla PHP w tym wyzwaniu, ale to nie zmienia faktu, że wciąż jest szalony.
źródło
Groovy, 66 bajtów
Wypróbuj: https://groovyconsole.appspot.com/script/5145735624392704
Wyjaśnił:
((n..1)+(2..n))
- Odwróć palindromize do n[n,..,1,..,n]
.each{if(it%2>0){...}
- Iteruj przez nieparzyste elementy.println(("*"*it).center(n))
- Wyśrodkuj n gwiazdek i wydrukuj każdą na nowej linii.źródło
.each
blok kodu może być{it%2&&println(("*"*it).center(n))}
.PHP, 191 bajtów
Biegnij jak
php -f golf_hourglass.php 15
Chodzi o to, aby stworzyć górną połowę (część przed singlem
*
), a następnie po prostu powtórzyć górną część dwa razy, ale za drugim razem w odwrotnej kolejności.źródło
for(;$i<$a=$argv[1];$i+=2){$t=str_pad(str_pad("",$i+1,"*"),$a," ",2)."\n";$i?$s.=$t:$r=$t;}echo strrev($s)."\n".$r.$s;
for(;$i<$a=$argv[1];$i++){$t=str_pad(str_pad("",$i+1+$i%2,"*"),$a," ",2)."\n";$i%2?$s.=$t:$s=$t.$s;}echo$s;
tak jest lepiej\n
rzeczywistą nową linią, aby zapisać bajt.Pyke,
2219 bajtówWypróbuj tutaj!
źródło
C, 117 bajtów
Bez golfa
źródło