Zdefiniowaliśmy już tutaj numer składany .
Ale teraz zdefiniujemy Super Folding Number. Super składana liczba to liczba, która po złożeniu wystarczającej liczby razy ostatecznie osiągnie jeden mniej niż potęgę dwóch. Metoda składania jest nieco inna niż w pytaniu liczby składanej.
Algorytm składania składa się w następujący sposób:
Weź reprezentację binarną
np. 5882
1011011111010
Rozlano go na trzy partycje. Pierwsza połowa, ostatnia połowa i środkowa cyfra (iff ma nieparzystą liczbę cyfr)
101101 1 111010
Jeśli środkowa cyfra to zero, liczby tej nie można złożyć
Odwróć drugą połowę i nałóż na pierwszą połowę
010111 101101
Dodaj cyfry na miejscu
111212
- Jeśli w wyniku są jakieś 2, liczby nie można złożyć, w przeciwnym razie nowa liczba jest wynikiem algorytmu składania.
Liczba jest liczbą super składaną, jeśli można ją złożyć do ciągłego ciągu jedności. (Wszystkie numery składane są również liczbami super składanymi)
Twoim zadaniem jest napisanie kodu, który pobierze liczbę i wyświetli prawdziwą wartość, jeśli liczba jest liczbą Super Folding, a fałszem w przeciwnym razie. Zostaniesz oceniony na podstawie wielkości twojego programu.
Przykłady
5200
Konwertuj na binarny:
1010001010000
Podziel na pół:
101000 1 010000
Środek jest jeden, więc kontynuujemy Nałóż połówki:
000010
101000
Dodano je:
101010
Bez dwójki, więc dzielimy dalej na pół:
101 010
Zagięcie:
010
101
111
Wynik to 111
(7 po przecinku), więc jest to liczba super składana.
Przypadki testowe
Pierwsze 100 super składanych liczb to:
[1, 2, 3, 6, 7, 8, 10, 12, 15, 20, 22, 28, 31, 34, 38, 42, 48, 52, 56, 63, 74, 78, 90, 104, 108, 120, 127, 128, 130, 132, 142, 150, 160, 170, 178, 192, 204, 212, 232, 240, 255, 272, 274, 276, 286, 310, 336, 346, 370, 400, 412, 436, 472, 496, 511, 516, 518, 524, 542, 558, 580, 598, 614, 640, 642, 648, 666, 682, 704, 722, 738, 772, 796, 812, 852, 868, 896, 920, 936, 976, 992, 1023, 1060, 1062, 1068, 1086, 1134, 1188, 1206, 1254, 1312, 1314, 1320, 1338, 1386, 1440, 1458, 1506, 1572, 1596]
3
wkradł się do przypadków testowych? Nie widzę, jak można go złożyć, ponieważ dzieli się na1 1
, dając natychmiast2
. A może mówisz, że składanie go zero razy też się liczy?Odpowiedzi:
Oto mój pierwszy film w golfa Code:
Python 3, 167 bajtów
167 bajtów, jeśli do wcięcia używane są tabulatory lub pojedyncze spacje
Edycja: Dzięki poniższej pomocy wszystkich, powyższy kod został zmniejszony z pierwotnego rozmiaru 232 bajtów!
źródło
:
s, i zwracając0
oraz1
zamiastTrue
iFalse
.Java 7, 202 bajty
Trwało trochę wysiłku, aby stara funkcja składania była powtarzalna, ale oto ona. Szczerze mówiąc, jest to brzydkie jak grzech. Rano muszę rzucić okiem, aby sprawdzić, czy mogę grać w golfa dalej, ponieważ ledwo mogę teraz znieść wzrok.
Z podziałami linii:
źródło
CJam ,
4744 bajtówWypróbuj online! lub wygeneruj listę super składanych liczb do podanej liczby.
Próby gry w golfa można zobaczyć tutaj .
Kod dzieli się na następujące fazy:
EDYCJA: Ta wersja mniej więcej przyjmuje podejście De Morgana do poprzedniej wersji.
* Problem z uruchomieniem singletonów polega na tym, że utknęliśmy z pustym łańcuchem po plastrze.
** Jeśli liczba binarna jest super składana, jej odbicie lustrzane (w razie potrzeby z wiodącymi zerami) to. Oszczędza to bajt przejęcia prawej połowy.
źródło
JavaScript, 149 bajtów
Definiuje funkcję rekurencyjną.
Wyjaśnienie:
źródło
m=l>>1
,/2/.test(n)
,n.slice(l-m)
(Lub pokroić odwrócony ciąg). Myślę, że jeśli zmienisz przypadki niepowodzenia i sukcesu, możesz użyć/0/.test(n)?f(...):1
.JavaScript (ES6),
113109108 bajtówSformatowane i skomentowane
Próbny
źródło
Perl,
7170 bajtówObejmuje +1 dla
-p
Podaj numer na STDIN
superfolding.pl
:źródło
Python 2, 151 bajtów
ideone
Funkcja podwójnie rekurencyjna, która przyjmuje liczbę całkowitą
n
i zwraca0
lub1
.Zmienna
r
jest utrzymywana, aby umożliwić zarówno wynik składania, jak i wiedzieć, czy obecnie: mamy liczbę całkowitą (tylko pierwsza); mieć nowy ciąg binarny, aby spróbować złożyć (zewnętrzny); lub są składane (wewnętrzne).W pierwszym przejściu
n
jest liczbą całkowitą, która znajduje się<''
w Pythonie 2, więc rekurencja rozpoczyna się rzutowaniem na ciąg binarny.Następne wykonanie ma,
r=''
więc test{'1'}==set(n)
jest wykonywany w celu sprawdzenia ciągłego ciągu1
s (RHS nie może być,{n}
ponieważ być może będziemy musieli przekazać ten punkt później zr=''
pustym,n
gdy będzie to słownik, który nie będzie równy{'1'}
, zestaw).Jeśli nie jest to spełnione, sprawdzane są kryteria wewnętrznego ogona (nawet jeśli są niepotrzebne): jeśli
n in'1'
oceni na True, gdyn
jest pusty ciąg lub pojedynczy1
, po czym rozpoczyna się nowa rekurencja zewnętrzna poprzez umieszczenier
, następnie złożonego, dwójkowego łańcucha wn
i''
dor
. Literał2
jest dodawany do wyniku tego wywołania funkcji, aby nie dopuścić do przejścia do następnej części (po prawej stronie logikior
), która zostanie poprawiona później.Jeśli nie jest to prawdziwa wartość (wszystkie niezerowe liczby całkowite są prawdziwe w Pythonie), sprawdzane są kryteria rekurencji zewnętrznego ogona:
n!=0
wyklucza przypadek ze środkiem0
i testowane są dwa zewnętrzne znaki, których nie sumuje2
przez konkatenację łańcucha'11'!=n[0]+n[-1]
; Jeśli to prawdziwe zarówno zewnętrzne bity są usuwane zn
on[1:-1]
, a następnie1
jest dodawany dor
, jeżeli jest na zewnątrz w przeciwnym razie0
jest, wykorzystując fakt, że'1'>'0'
w Pythonamax(n[0],n[-1])
.Na koniec
2
koryguje się dodawanie przy każdej wewnętrznej rekurencji%2
.źródło
PHP, 113 bajtów
kończy działanie z błędem (kodem
1
), jeśli argument nie jest super-zwijany, kod0
inny. Uruchom z-r
.Dane wejściowe
0
zwrócą wartość true (kod0
).awaria
źródło
PHP, 197 bajtów
Rozszerzony
Prawdziwe wartości <10000
źródło