Rozważ następujący proces:
Weź nieujemną liczbę całkowitą N.
np. N =
571
Wyrażaj to w postaci binarnej bez zer wiodących. (Samo zero jest jedynym wyjątkiem, który się staje
0
.)np.
571
=1000111011
binarnieRozbij kolejne ciągi zer i jedynek w tej reprezentacji binarnej.
np
1000111011
→1
,000
,111
,0
,11
Sortuj przebiegi od najdłuższego do najkrótszego.
np
1
,000
,111
,0
,11
→000
,111
,11
,1
,0
Nadpisuj wszystkie cyfry w każdym przebiegu naprzemiennymi znakami
1
„i0
”, zawsze zaczynając od1
„s”.np
000
,111
,11
,1
,0
→111
,000
,11
,0
,1
Połącz wynik, aby uzyskać nową liczbę binarną.
np
111
,000
,11
,0
,1
→1110001101
=909
dziesiętnie
Kiedy kreślisz wartości wygenerowane przez ten proces, otrzymujesz całkiem czysty wykres:
I mam nadzieję, że jest oczywiste, dlaczego nazywam powstałą sekwencję sekwencją Skyline świątyni :
Wyzwanie
Napisz program lub funkcję, która przyjmuje nieujemną liczbę całkowitą N i drukuje lub zwraca odpowiedni numer porządkowy Temple Skyline. Dane wejściowe i wyjściowe powinny być w systemie dziesiętnym.
np. jeśli wejście jest 571
wyjściem powinno być 909
.
Najkrótszy kod w bajtach wygrywa.
Dla odniesienia, oto terminy w sekwencji od N = 0 do 20:
0 1
1 1
2 2
3 3
4 6
5 5
6 6
7 7
8 14
9 13
10 10
11 13
12 12
13 13
14 14
15 15
16 30
17 29
18 26
19 25
20 26
.BQ
zamiastjQ2
, co oznacza, że możesz stracić przestrzeń między8
poprzednim a poprzednim2
.is*R`s=!Z_ShMr.BQ8 2
to interesujące rozwiązanie o tej samej długości. Głównie publikowanie, ponieważ tak naprawdę nie spodziewałem się, że argument przypisania w mapie działa poprawnie.`s
z]
. Oszczędza jeden bajt.Python 2, 121 bajtów
125121: Dzięki Sp3000 za golenie 4 bajtów!
125
źródło
n*`~i%2`for
zamiast"10"[i%2]*n for
sorted(...,key=len)
zamiast używać,map(len,...
ale nie rozumiem teraz w pełni twojego programu, więc nie jestem pewien , czy przyniosłoby to ci korzyść.len
ponieważ to jedyna informacja, której potrzebuję, aby zreplikować liczbę 1 i 0. Wypróbowałem twoją sugestię i dodaje ona 2 bajty, ponieważ będę musiał użyćlen
dwa razy, ale dziękuję za sugestię!JavaScript ES6, 110 bajtów
113116119120Zaoszczędzono 3 bajty dzięki @intrepidcoder
Zaoszczędź 3 bajty dzięki @NinjaBearMonkey
Proste podejście. Nie podoba mi się długość funkcji sortowania, ale nie mogę wymyślić sposobu na golfa.
źródło
+
zamiasteval
.split(/(0+)/g)
powinienem móc go wymienićmatch(/(.)\1*/g)
.+(s=0, ... .map(l=>l.replace(/./g,s^=1))...)
C ++,
535527 bajtów(dzięki zereges za golenie niektórych bajtów.)
Teraz, kiedy pozbyliśmy się tych bajtów, program jest teraz konkurencyjny;)
Jestem nowym golfistą, więc proszę o wskazówki w komentarzach .
Rzeczy takie jak „nie potrzebujesz tych nawiasów” lub „użyj printf” są pomocne, ale doceniam również porady dotyczące logiki. Z góry dziękuję!
Dla ułatwienia czytania przedstawiam wersję bez golfa:
EDYCJA wersja gry w golfa obniżyła kilka bajtów, wersja bez golfa pozostała niezmieniona
źródło
int a; int b;
używaćint a,b;
. Również zmienne w zakresie globalnym są inicjowane za pomocą0
. Nie musisz także używać nawiasów klamrowych, gdy jest tylko jedno polecenie do wykonania. Równieżones=!ones;
można uprościćones ^= 1;
for
pętlę1
, tj.for(int i=D;i;i--)
I użyjpow(2,i-1)
wewnątrz pętli.ones
może być równieżint
. Może makrowanieint(pow(i))
doP(i)
. Polecam przeczytanie dyskusji tutajHaskell,
132131 bajtówPrzykład użycia:
Jak to działa:
źródło
J - 30 bajtów
Funkcja przejmująca liczbę całkowitą po prawej stronie. Prawidłowo obsługuje 0.
#:
- Weź reprezentację binarną.1,2~:/\]
- Między każdą cyfrą zgłoś Prawda, jeśli są różne. Przygotuj wartość True, aby lista miała wartość True na początku każdego „uruchomienia”.(#;.1~...)
- Używając powyższego wektora boolowskiego, oblicz długość każdego przebiegu.\:~
- Sortuj te długości od najdłuższego do najkrótszego.2|#\
- Weź listę naprzemiennie1 0 1 0 ...
tak długo, jak lista długości.(...#...)
- Dla każdej liczby po lewej (posortowane długości) weź tyle odpowiednich pozycji po prawej stronie (naprzemiennie 1 i 0)&.
- Przekształć tę nową reprezentację binarną z powrotem na liczbę.Przykłady:
źródło
Perl 5.10,
121101Myślę, że sortowanie może być krótsze.
Edycja: -20 bajtów, dzięki symbabque!
źródło
\n
im
nie jest on wymagany do dopasowywania wyrażeń regularnych. W zamianie po prostu użyj.
zamiast grupy char.grep
Część też nie jest potrzebna .oct
Jest schludny chociaż :)Python 3,
146136 bajtówźródło
map
zlambda
, byłoby lepiej zrobić''.join(... for ... in ...)
?Mathematica, 83 bajty
Definiuje nienazwaną funkcję.
źródło
Rubin,
107104102 bajtów(3 bajty zapisywane dzięki Nimi )
Nie zamierzam pokonać takich jak CJam, ale mam dość mały jak na rozsądny język.
źródło
(i+=1)%2
jesti=1-i
.Java 8,
179176 bajtówUżyłem dwóch importów statycznych:
java.util.Integer.highestOneBit
ijava.util.Arrays.sort
.Dla czytelności, oto kod nierozszyfrowany:
źródło
Python 2, 170 bajtów
źródło
t(0) = 0
Kiedy1
jest oczekiwane, at(4) = 1
kiedy 6