Wyzwanie
Zbuduj zestaw Cantor N-Leveled .
Zestaw trójskładnikowy Cantora jest tworzony przez wielokrotne usuwanie otwartych środkowych trzecich zbioru segmentów linii.
Program otrzymuje jeden parametr N
(liczbę całkowitą), a następnie drukuje (w konsoli lub w podobny sposób) zestaw Cantor N poziomów. Wydruk może zawierać tylko znaki undescore ( _
) i spacje. Parametr może być dodatni lub ujemny, a znak wskazuje orientację konstrukcyjną zestawu kantora: jeśli N > 0
zestaw kantora jest konstruowany w dół, a N < 0
zestaw kantora jest konstruowany w górę. Jeśli N = 0
następnie program wypisze jedną linię ( _
).
Na przykład:
N = 2
_________
___ ___
_ _ _ _
N = -2
_ _ _ _
___ ___
_________
N = 3
___________________________
_________ _________
___ ___ ___ ___
_ _ _ _ _ _ _ _
N = -3
_ _ _ _ _ _ _ _
___ ___ ___ ___
_________ _________
___________________________
Kryteria wygranej
Ponieważ jest to wyzwanie dla golfa, wygrywa najkrótszy kod.
Edytowano: Zmodyfikuj 0 danych według sugestii ugorena.
_
(ale wydrukowanie go w dół po uzyskaniu -0).Odpowiedzi:
GolfScript,
49 4240 znakówDzięki dzięki Hammar za 42-> 40.
Moja najlepsza próba jak dotąd podejścia bardziej liczbowego jest niestety znacznie dłuższa:
lub
i podejrzewam, że długość
base
izip
uniemożliwi nadrobienie zaległości.źródło
~.abs.@/\.3\?'_'*\{.3%..,' '*\++}*](%n*
ma 39 znaków, ale ulega awarii na wejściu0
. :-(n/abs(n)
, aby dostaćsignum(n)
.Python,
116 113 104103 znakówStarszy algorytm został uzupełniony o 113 znaków
źródło
Rubin (97)
Na podstawie pythonowej wersji Stevena Rumbalskiego:
Poprzednie próby, obie o tej samej długości (112)
Buduj linie z części:
Zacznij od jednej linii, zrób w niej dziury:
źródło
Perl, 93 znaki
Pomyślałem, że postaram się sprawdzić, jak dobrze rozwiązanie GolfScript Petera Taylora przenosi się na Perla. Godne uwagi funkcje obejmują użycie
sort
zamiastreverse
do zapisywania trzech znaków, wykorzystując fakt, że spacja sortuje się wcześniej_
.źródło
Common Lisp,
217210 znakówRozszerzony:
Domyślam się, że kodowi Lisp uda się pobić jakąkolwiek początkową liczbę dla innego języka (C, 219) Mam się dobrze :)
źródło
C (
163161znaków)Pożycza kilka sztuczek od odpowiedzi ugorena , ale podstawowa logika jest zupełnie inna. Nie mogłem śledzić jego pętli for, więc może być możliwe hybrydyzacja i uratowanie kilku innych.
źródło
C,
219193179143136131 znakówPodążyłem za kolejnymi pomysłami Petyera Taylora, a także ulepszeniem własnym, zaoszczędziłem jeszcze 6.
Zintegrowałem kilka wskazówek od @PeterTaylor, a także skopiowałem jego główną funkcję, z niewielkimi zmianami, które ratują postać (czy to w porządku, aby ją skopiować? Ponieważ żadne z nas nie wygra tej, myślę, że nie jest tak źle).
Pomyślałem o znacznej poprawie działania mojej rekurencji i po zobaczeniu odpowiedzi Petera Taylora wdrożyłem ją, aby odzyskać prowadzenie. Po ponownym przeczytaniu jego odpowiedzi zobaczyłem, że zrobiłem prawie dokładnie to, co on. Wygląda to na sugerowaną przez niego hybrydyzację.
Uprościłem również pętlę
main
, zachowując tę samą długość.I wziął sztuczkę Petera, aby wydrukować nowy wiersz, zamiast
puts("")
- ratuje postać.Usunięto
int
z deklaracji zmiennej - ostrzeżenie, ale zapisuje 4 znaki.Nowy algorytm nie oblicza z góry 3 ^ x, ale używa pojedynczej pętli do drukowania 3 ^ x znaków.
Można zapisać jeszcze jeden, definiując
int*v
, ale wtedy 64-bitowy nie będzie działać.Liczba znaków wyklucza białe znaki (które można usunąć).
Starszy algorytm, 219 znaków:
źródło
i
parametru, ponieważ użycie globalnego zakłóciłoby działaniemain
.l--
będę się wtrącaćo>=l
i będę musiał go zastąpić>
(więc dlaczego piszę to tak, jakby to coś złego?) Mógłbym również skopiować cięmain
, co jest prostsze i krótsze niż moje.i
- przegapiłem fakt, że tak naprawdę już go nie używam (myślałem, że masz na myśli, że go nie zaliczam).p
wydaje się teraz całkiem optymalny, a twójmain
był lepszy (nie jestem pewien, czy jest optymalny, ale nie mogę go dalej poprawić). Więc oprócz nowej genialnej struktury programu, jedyną drogą było kopiowanie kodu drugiej osoby.J,
44393837 bajtówUżywa iteracji do zbudowania następnego zestawu, zaczynając od 1 (reprezentującego
_
) na początku.Stosowanie
Wyjaśnienie
źródło
@.
może w połączeniu z nią$:
może się tu przydać ? Np. Coś(zero case)`(positive case)`(negative case)@.*
, a może nawet":@_:`(positive case)`(|."1@$:)@.*
.R ,
141 139137 bajtówWypróbuj online!
-15 bajtów, dzięki Giuseppe
'('
jako funkcji tożsamości;write
zamiastcat
wydrukować; sprytne użycie%x%
.-2 bajty dzięki Kirill L. przy użyciu
c
zamiast'('
jako funkcji tożsamości.źródło
%x%
? Mogą występować problemy z przyjmowaniem naprzemiennych wierszy ...kron
! Wyobrażam sobie, że powinno to być w stanie obniżyć się do 125 bajtów, jeśli znajdziemy właściwe podejście.`(`
jako funkcji tożsamości, dzięki czemu możesz użyćwrite
bezpośrednio zamiastcat
ifor
pętli. 141 bajtów(
można go użyć w ten sposób lub żeif
można go użyć do wyboru jednej z dwóch funkcji. I zacznę używać zapisu ... zapisuje dużo „\ n”.Python,
177164 znakówźródło
input
asint
. Ostatnie dwie linie można skrócić doprint"\n".join(r[::N>0 or-1])
Perl, 113 znaków
Rozszerzony:
źródło
JavaScript 121 bajtów
Wewnętrzna funkcja rekurencyjna, następnie w razie potrzeby zadbaj o wyjście wstecz
Mniej golfa
Test
źródło
Partia,
265262242236235 bajtówEdycja: Zapisano
1219 bajtów dzięki @ l4m2. Zapisano 8 bajtów, usuwając niepotrzebną%a%
zmienną.źródło
set c=%n%,-1,0 [LF] if %n% lss 0 set c=0,1,%a% [LF] for /l %%i in (%c%)do call:l %%i
?JavaScript (Node.js) , 148 bajtów
Wypróbuj online!
źródło
Python 2 , 102 bajty
Wypróbuj online!
źródło
Prolog (SWI) ,
265232213 bajtówWypróbuj online!
źródło
PowerShell , 111 bajtów
Wypróbuj online!
Mniej golfa:
źródło