W teraz usuniętym pytaniu dotyczącym przepływu stosów ktoś opublikował następujące informacje:
Napisać program lub funkcję do drukowania wzorów zmiennego *
i #
na podstawie danej liczby całkowitej n
. Kilka przykładów:
Wejście: n=1
Wyjście:
*
Dane n=5
wyjściowe:
*####
###**
***##
###**
*####
Wejście: n=8
Wyjście:
*#######
######**
***#####
####****
****####
#####***
**######
#######*
Ponieważ wyglądało to na całkiem fajne wyzwanie do gry w golfa, oto jest.
Jak budowane są te wzorce?
Pierwszy wiersz zaczyna się od pojedynczego *
, a po nim n-1
końcowy #
.
Drugi wiersz zawiera dwa *
, z n-2
prowadzeniem #
.
Trzecia linia zaczyna się od trzech *
, po których następuje n-3
końcowa liczba #
.
itp.
Gdy osiągniemy środek ( n/2
), odliczamy ponownie ilość *
, co można zobaczyć w powyższych przykładach.
UWAGA: w przypadku nieparzystych liczb wejściowych odwrócona para wierszy (pierwsza i ostatnia; druga i następna ostatnia; itd.) Są dokładnie takie same. W n=5
przykładzie pierwsza i ostatnia linia to *####
; druga i ostatnia linia to ###**
.
Jednak dla parzystych liczb wejściowych odwrócona para linii jest odwrócona. W n=8
przykładzie pierwszą i ostatnią linią są *#######
i #######*
; drugą i ostatnią linią są ######**
i **######
; itp.
Zasady konkursu:
- Możesz użyć dowolnych dwóch różnych znaków drukowalnych zamiast
*
i#
. Możesz użyćA
iB
;3
i7
;<
i>
; itp. Podaj w swoich odpowiedziach, czego użyłeś. - Możesz założyć
n
, że będzie dodatnią liczbą całkowitą (>= 1
) - Możesz wydrukować listę / tablicę ciągów dla każdej linii lub macierz 2D znaków, zamiast drukować je do STDOUT.
Główne zasady:
- To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach.
Nie pozwól, aby języki kod-golfowe zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania. - Do odpowiedzi mają zastosowanie standardowe reguły , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami i zwracanymi typami, pełnych programów. Twoja decyzja.
- Domyślne luki są zabronione.
- Jeśli to możliwe, dodaj link z testem swojego kodu.
- Zalecane jest również dodanie wyjaśnienia do odpowiedzi.
Przypadki testowe (od pierwszego n=1
do drugiego n=10
)
*
*#
#*
*##
#**
*##
*###
##**
**##
###*
*####
###**
***##
###**
*####
*#####
####**
***###
###***
**####
#####*
*######
#####**
***####
###****
***####
#####**
*######
*#######
######**
***#####
####****
****####
#####***
**######
#######*
*########
#######**
***######
#####****
*****####
#####****
***######
#######**
*########
*#########
########**
***#######
######****
*****#####
#####*****
****######
#######***
**########
#########*
Odpowiedzi:
Galaretka , 9 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Python 2 , 62 bajty
Wypróbuj online!
Zastosowania
x
i przestrzeń.Wiersze są obliczane w następujący sposób:
Korzystanie ze
%*s
specyfikatora do wyboru pomiędzyn
i-n
.źródło
Perl 6 , 57 bajtów
Wypróbuj online!
Używa tej samej metody, co odpowiedź Python Lynna . Wyjścia za pomocą
*
i spacji.źródło
MATL,
343118 bajtówWypróbuj na MATL Online
Używa 0 dla * i 1 dla #. Na podstawie odpowiedzi Galaretki Lynn .
Starsza odpowiedź, 31 bajtów:
Wypróbuj na MATL Online
Używa 1 dla * i 0 dla #.
źródło
APL (Dyalog Classic) , 18 bajtów
Wypróbuj online!
wyjścia
AB
zamiast*#
⎕
oceniane wejście n⍳⎕
wektor0 1 ... n-1
⊢⌊⌽
min (⌊
) między sobą (⊢
) i ich zwrotem (⌽
) - patrz pociągi⊂>⊢⌊⌽
gdzie⍳
wektor jako całość (⊂
) jest mniejszy od każdego z nich⊢⌊⌽
- zwraca wektor wektorów boolowskich (0/1)⊢∘⌽\
odwróć co drugi wektor↑
wymieszać w matrycę⎕a
wielkie litery alfabetu angielskiego,'AB
...Z'
⎕a[
]
wymienić0
1
z'A'
'B'
źródło
⎕a[...}
konwersja ich na spacjeA
iB
bez spacji jest krótsza niż zachowanie ich jako spacji0
i1
bez spacji, biorąc pod uwagę, że ich użyłeś, ale po prostu ciekawi mnie, czy istnieje duża różnica w bajtach, jeśli zachowujesz je jako0
i1
.⎕d[
...]
albo⊃¨⍕¨
... W tym ostatnim wyrażeniu⍕¨
jest „formatuj każdy” - zamienia każdą liczbę w zagnieżdżony wektor znaków , więc potrzebujemy „najpierw każdego” „(⊃¨
), aby uzyskać tylko skalary char (i dlatego nie ma spacji podczas drukowania).Węgiel drzewny , 21 bajtów
Wypróbuj online! Używa
0
i1
. Link jest do informacji pełnej wersji kodu i obejmuje§*#
co przekłada wyjście do*
i#
w pytaniu. Wyjaśnienie:źródło
Galaretka ,
1215 bajtów+3 naprawianie
n=1
błędu krawędzi :(Pełną programu przyjmującą całkowitą drukowany wyjście, jak zdefiniowano w PO przy użyciu
0
i1
do*
i#
odpowiednio.Wypróbuj online!
W jaki sposób?
źródło
Galaretka , 15 bajtów
Wypróbuj online!
Pełny program
*
=1
#
=0
źródło
Java 10, 145 bajtów
Wszystkie trójskładniki sprawiają, że jest nieco niechlujny, ale działa dobrze. Próbowałem spłaszczyć zagnieżdżoną pętlę i różne inne rzeczy, ale tylko zwiększyły liczbę bajtów. Wypróbuj online tutaj .
Nie golfowany:
Java
811,179127 bajtówWypróbuj online tutaj (TIO nie ma jeszcze Java 11, więc używa niestandardowej metody, która powoduje taką samą liczbę bajtów jak
String#repeat()
).Dzięki Kevin Cruijssen za grę w golfa aż 52 bajty!
Nie golfowany:
źródło
"*".repeat(...)
i"#".repeat(...)
(a także zwracając ciąg zamiast bezpośredniego drukowania i gryn-j-1
w golfan+~j
):n->{String r="",a,b;for(int j=0;j<n;b="#".repeat(j<n/2?n+~j:j),r+=(j++%2<1?a+b:b+a)+"\n")a="*".repeat(j<n/2?j+1:n-j);return r;}
repeat()
metoda jest naprawdę fajna do gry w golfa.Lua ,
148133 bajtówWypróbuj online!
-15 bajtów dzięki @KevinCruijssen i @JoKing.
źródło
(n+1)/2
na-~n/2
;or n-i+1
door-~n-i
;i%2==0
doi%2<1
; ireverse() or
doreverse()or
. Ponadto, zarówno wersja TIO, jak i liczba bajtów zawierają ciągły średnik, który nie wydaje się konieczny. Ładna pierwsza odpowiedź. +1 ode mnie Witamy w PPCG! :)-~n
robi twoja sugestia? To zdecydowanie działa, ale nie rozumiem dlaczego.~
jest jednoargumentowym operatorem negacji bitowej. Jednak ważne dla codegolfing jest to, że~i
ma taką samą wartość jak-i-1
. Możemy więc użyć-~i
zamiasti+1
i~-i
zamiasti-1
. Jest to przydatne w dwóch przypadkach, które mogę wykorzystać w twojej odpowiedzi: pozbyć się nawiasów, ponieważ-
i~
mają pierwszeństwo nad innymi operatora operacji matematycznych, więc(n+1)/2
może zatem być-~n/2
. Inną przydatną częścią jest pozbycie się przestrzeni w niektórych przypadkach, tak jak to zrobiłemor-~n-i
.~
dlax+1
ix-1
i Użyj unary~
dlaa-b-1
ia+b+1
. Wszystkie ogólne wskazówki, a także wskazówki dotyczące konkretnego języka ( dla języka ( w tym przypadku wskazówki dotyczące gry w golfa w Lua ) mogą być interesujące do przeczytania. :)Kotlin , 86 bajtów
Wypróbuj online!
Zastosowania
x
i spacja jako symbole wyjściowe. Pochodzi z Lynn Answerźródło
Perl 5 +
-pa -MPOSIX -M5.010
, 58 bajtówWypróbuj online!
źródło
C (gcc) ,
10499 bajtówWypróbuj online!
źródło
C (gcc) ,
118108 bajtówTen nie wygra, ale jest to inne podejście (a przynajmniej tak mi się wydaje!) Zamiast manipulować strunami, wykorzystuję fakt, że10x- 1 nad [ 1 .. n ] = { 9 , 99 , 999 , . . . } , które następnie można pomnożyć, aby uzyskać odpowiedni wzór;
printf()
następnie uzupełnia zero dla wyrównania do prawej.Niestety,
int
ma tylko wystarczający zasięg, aby zrobić do 9 cyfr (na platformach 32-bitowych), więc musisz przejść dolong
większych wzorów; język, który natywnie wykonuje arytmetykę MP, może być w stanie użyć tego do czegoś.Dzięki pułapkowi cat za sugestię.
Wypróbuj online!
Dowód koncepcji, że działa to z arytmetyką MP:
C # (kompilator Mono C #) ,
187165 bajtów(143 bajty + 22 bajty dla
using System.Numerics;
nagłówka)Wypróbuj online!
źródło
Vim, 99 klawiszy
Zawsze interesujące jest wykonanie vima z argumentami wejściowymi. To bardzo nienaturalne, więc nie będzie niesamowicie krótkie. Prawdopodobnie istnieją inne dobre podejścia do tego.
Zakłada się, że dane wejściowe są same w buforze. Przyjmuje się, że rejestry są puste. Zakłada się, że edytor jest wystarczająco wysoki, aby zawierać wynik bez przewijania (można tego technicznie uniknąć kosztem niektórych naciśnięć klawiszy).
Wyjaśnienie
I w base64, z rzeczywistymi znakami (wprowadź dane wejściowe
input
i naciśnięcia klawiszykeys
i uruchom używającvim -u NONE -s keys input
)źródło
R , 75 bajtów
Wypróbuj online!
n
jako parametr i zwraca macierz0/1
gdzie0
odpowiada'*'
i1
odpowiada'#'
źródło
K (ngn / k) , 22 bajty
Wypróbuj online!
{
}
funkcja z argumentemx
!x
Lista(0;1;
...;x-1)
i:
Przypisać doi
i&|i
minima (&
)i
i jego odwrotność (|
)i>/:
porównaj z większym niż (>
)i
względem każdego elementu z listy po prawej stronie (/:
) - zwróć macierz boolowską (listę list)i|:/'
dla każdego ('
) j ini
, odwróć (|:
- musimy:
wymusić|
by być jednością) odpowiedni element j razy (n f/ x
stosujef
n
czasy nax
). Skutecznie odwróć co drugi rząd."*#"
użyj elementów macierzy jako wskaźników w ciągu"*#"
źródło