Kto nie lubi dobrego fraktala? Sierpińskiego Dywan jest klasycznym przykładem fraktala.
Aby ukończyć to zadanie, musisz wygenerować dywan typu i wydrukować wynikowy obraz na stdout
(formatowanie patrz przykład poniżej) , reprezentujący dywan poziomy. Kroki można znaleźć w tym artykule w Wikipedii .
Ta wartość zostanie pobrana z stdin
lub równoważna.
Na przykład wprowadzenie wartości 4 dałoby dywan 4 poziomu:
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
Wprowadzenie 3 spowoduje wytworzenie dywanu poziomu 3:
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
Wprowadzenie 2 spowoduje wytworzenie dywanu na poziomie 2:
■ ■ ■
■ ■
■ ■ ■
A wejście 1 dałoby dywan na poziomie 1 (tylko kwadrat):
■
Zwróć uwagę na spacje między kolumnami.
Chodzi o to, aby użyć znaku ■ do bloków i spacji do przerw
Linia zaczyna się od znaku ■.
Jak zawsze, najmniejsze rozwiązanie wygrywa według liczby znaków (ze względu na niestandardowe znaki).
Alternatywnie można użyć # zamiast znaku w językach, które nie obsługują Unicode.
Odpowiedzi:
CJam,
3837313028 znakówNo cóż, liczymy według znaków, więc rozpakujmy Unicode:
Sprawdź to tutaj. Wystarczy wpisać żądany poziom w polu wejściowym.
Wyjaśnienie
Po konwersji podstawowej jest to
który jest taki sam jak poniżej, tylko ze znakiem Unicode zapisanym jako
9632c
:Kod ten jest oparty na następujących obserwacji: jeśli patrzymy w układzie współrzędnych (x, y) w każdej komórce, to uzyskać puste komórki, kiedy zarówno x i y mają
1
w tej samej pozycji w ich bazowego 3 reprezentacji. Jeśli się nad tym zastanowić, powtarzalny wzór na małą skalę jest znaczącą cyfrą podstawową 3, to kolejna bardziej znacząca cyfra rządzi następnym powtórzeniem na większą skalę i tak dalej.Zawartość wynikowej tablicy jest drukowana automatycznie.
Dzięki Dennisowi za zgolenie trzech bajtów.
źródło
#0<'■S
->#~S'■
zapisuje 1 znak.[1_]a#~
z3Yba&
.&
produkuje wartość prawdy / fałszu (a nawet, że istnieje). Być może warto zamieścić post we wskazówkach CJam dotyczących kanonicznego sposobu testowania, czy tablica zawiera jakiś element.Matlab
(113) (110) (99)(85)Możesz go wypróbować tutaj (będziesz musiał zastąpić
input('')
go wybranymi danymi wejściowymi).Teraz 99 dzięki feersum! A teraz do 85 dzięki RTL!
Gra w golfa:
Nie golfowany:
Wyjaśnienie:
Nadużywam produktu Kronecker do tego zadania. (Jest to specjalny produkt zdefiniowany dla dwóch matryc o dowolnej wielkości. Przykład:
Następnie
Oto przykład dla n = 5 (w starej metodzie liczenia jest to 4);
źródło
d=zeros(size([c,c]))
powinieneś użyćd=[c c]*0
.d
można uniknąć nadużywaniakron
raz jeszczedisp(char(kron(c,[1,0])*3+32));
,Haskell,
114108źródło
Python - 100
źródło
Perl 5: 68 znaków
n na standardowym.
Trójka kodowana reprezentacja trójskładnikowa listy współrzędnych jest najpierw generowana w
@,
(nazwa wybrana, więc nie ma potrzeby odstępu między@,
ifor
) przy użyciu cyfr 0, 1 i 3. Teraz dodanie współrzędnych xiy w domenie dziesiętnej będzie miało wartość 2 w wyniku wtedy i tylko wtedy, gdy na pasujących pozycjach były dwa.//
służy do propagowania zmiennej domyślnej$_
z zewnętrznej pętli (for
) do zmiennej postmatch,$'
gdy jest ona zasłoniętamap
zmienną domyślną w wewnętrznej pętli.źródło
Java,
330283 znakówParam to pożądany rozmiar. O ile nie ma optymalizacji algorytmu, próbowałem wszystko zniszczyć.
Dzięki @StretchManiac usunięcie tej
i
metody i wyczyszczenie deklaracji nieco sprowadziło.Kod czytelny
źródło
String[]a
, a jeśli używasz tylkoi
raz, lepiej byłoby pozbyć się tej metody.""+s
w swojejp
metodzie? To trzy dodatkowe postacie absolutnie bez celu. Nawet gdyby tego rodzajus
było coś innegoString
, byłoby to zupełnie niepotrzebne.static void p(int s){System.out.print((char)s);}
i zrób toint s=35;
,s=32;
ip(10);
(zamiastp("\n");
) i zapisz kilka innych znaków.Integer.valueOf
nanew Byte
Rakieta
230229225220Nie najlepsza godzina gry w rakietę.
Gra w golfa:
Nie golfowany:
źródło
C:
123 118 111104 znakówOparty na podobnym pomyśle jak moje rozwiązanie perla. Po dodaniu spacji:
Używa trójskładnikowego systemu kodującego każdą cyfrę 2 bitami. Nielegalne wartości (posiadające dwie z nieparzystej pozycji) są filtrowane za pomocą
x & (x>>1) & 0b01010101
. Obie współrzędne są przechowywane w jednej wartości, więc sprawdzenie koloru piksela jest zmniejszone dox & (x >> 2 * n) & 0b01010101
.n
dla wygody jest przechowywany jako potęga 2.Edytować
Zastąpiony
define
prostą stałąm
.Edytuj 2
0x5555555
maska może być reprezentowana za pomocą(1LL<<32)/3
, ale potrzebujemy tylkon
tych bitów, więcn/3
jest wystarczająca.Edytuj 3
Drobne poprawki. Jeden zysk 2 char zależny od wykonania scanf przed załadowaniem wartości
n
dla wykonania--n
. Eol może tylko podążać#
, duh.źródło
HTML / JavaScript, 205 znaków
Obfuscatweet , 205 znaków
HTML / JS, 298 znaków
Ze względu na to, jak HTML gra z białymi znakami, kilka znaków musiało być przeznaczonych na znak nbsp. Ponadto domyślną czcionką większości przeglądarek nie jest Courier, więc musiałem to również ustawić. Stylizacja warta około 20 znaków. Jeśli wymaga to bezpośredniej metody wprowadzania danych, mogę ją dodać, ale zmiana danych wejściowych obecnie powoduje ustawienie innej wartości na n.
Próbny
Czytelny HTML / JS
źródło
CJam,
38353231 znakówWypróbuj online.
Przykładowy przebieg
Jak to działa
konwertuje ciąg Unicode z podstawy 60 000 (
6e4b
) na podstawę 128 (128b
), rzutuje na znak (:c
) i ocenia wynikowy ciąg (~
).W rezultacie wykonywany jest następujący kod:
źródło
Python 3 -
116113 znakówEDYCJA: Cóż, użyłem sztuczki, której sam nie lubię, i skompresowałem kod o 3 bajty. Nie wiem, czy to najlepszy sposób, ale pójdę z tym.
Może zawierać pewne niedrukowalne znaki, więc oto wersja łańcucha do wydrukowania.
Niezbyt świetne, ale przynajmniej bije niektóre języki.
Co to rozwija się do:
Nieco golfista na wypadek, gdyby ktoś nie widział, jak to działa:
źródło
Mathematica, 71 bajtów
wkład
wydajność
źródło
CJam, 76 znaków
To jest bezpośrednie tłumaczenie podanej tu formuły
Wypróbuj tutaj
źródło
Bash + coreutils, 105 znaków Unicode
Ponieważ liczymy znaki, a nie bajty:
W zdekodowanej formie:
Pure Bash, 143 bajty
Dane pobierane są z argumentów wiersza poleceń:
Wydajność:
źródło
DO#
Pełny program - 237:
LINQPad - 166+
Math.Ceiling(Math.Log(a + 1) / Math.Log(10))
źródło
using System;class P{static void Main(string[]a){string g,h;for(int b=(int)Math.Pow(3,int.Parse(a[0])-1),c=-1,d,e,f;++c<b;Console.WriteLine(g))for(g="",d=0;d<b;g+=h)for(h="■",e=c,f=d++;e>0|f>0;e/=3,f/=3)h=e%3==1&f%3==1?" ":h;}}
( 229 bajtów / 227 znaków ) (■
= 3 bajty, więc możesz je zastąpić,#
aby zaoszczędzić również 2 bajty). Umieściłem głównie wszystko w pętlach for, więc nie ma już potrzeby stosowania nawiasów.C - 154
Dane wejściowe ze standardowego wejścia. Próbowałem znaleźć dobry sposób na uniknięcie dodatkowej funkcji, ale nie mogłem jej wymyślić.
Liczba znaków obejmuje tylko niezbędne spacje.
źródło
PHP, 194 znaków
n
Otrzymał jako pierwszy argument w linii poleceń.Czytelny
źródło
■
zamiast#
, możesz zapisać 2 znaki, usuwając cudzysłowy.Scala 230 znaków
Kod do gry w golfa:
Nieskluczony kod:
Uwzględniono tylko niezbędne miejsca.
źródło
V , 21 bajtów (niekonkurencyjny)
Wypróbuj online!
Hexdump:
V jest nowszy niż wyzwanie, więc musi być oznaczony jako niekonkurujący. Ale nadal, to miło zobaczyć ta odpowiedź jest waaaaay krótsze niż te wszystkie inne, nawet gdy zliczanie bajtów zamiast znaków.
źródło
ok, 40 bajtów
Wypróbuj online.
Zaczyna się od
1
, a następnie rysuje w siatce(1 1 1;1 0 1;1 1 1)
, którą następnie rysuje w siatce w ten sam sposób itp. Powtórzył niezbędną liczbę razy.źródło
Python 2 , 91 bajtów
Wypróbuj online!
źródło
C # (.NET Core) , 162 bajty
Wypróbuj online!
Degolfed
źródło
SOGL V0.12 , 27 bajtów
Wypróbuj tutaj!
źródło
R , 92 znaki
94 bajty ze znakiem specjalnym.
Wypróbuj online!
źródło
Płótno ,
171617 znakówWypróbuj tutaj!
-1: Używany
[
zamiast{
do usunięcia pierwszego;
w pętli.+1: Naprawiono błędne zachowanie:
■
teraz odpowiada poziomowi 1, jak określono w oryginalnym poście.źródło
■
jest wielobajtowy. Mówi tak w dolnej części oryginalnego postu.Pip
-S
, 30 znakówWypróbuj online!
Podstawowa idea: rozważ siatkę współrzędnych w podstawie 3. Otwory w dywanie pojawiają się, gdy 1) trit we współrzędnej x jest
1
, a 2) trit w tej samej pozycji na współrzędnej y również1
.Podobne rozwiązanie, ta sama liczba znaków, ale -2 bajty:
{2N({aTB3R2i}MSg)?s'■}MC3**a/3
źródło
K (ngn / k) , 50 bajtów
dzięki @DLosc za przypomnienie, że powinienem wypisywać spacje między kolumnami
Wypróbuj online!
źródło