Biorąc pod uwagę liczbę, określ, czy jest to liczba składana.
Liczba składana to liczba taka, że jeśli weźmiesz ją jako reprezentację binarną i „złożysz” na pół, to jest wynik mnożenia przez XNOR pierwszej połowy liczby i drugiej połowy z cyframi w odwrotnej kolejności, otrzymasz zero.
Jeśli liczba ma nieparzystą liczbę cyfr binarnych, jej środkowa cyfra musi wynosić 1 i jest ignorowana podczas składania.
Ponieważ może to być nieco mylące, podam kilka przykładów:
178
Binarna reprezentacja 178 to
10110010
Aby to złożyć, najpierw podzielimy na pół
1011 0010
Cofamy drugą połowę
1011
0100
I XNOR dwie połówki:
0000
Jest to zero, więc jest to liczba składana.
1644
Binarna reprezentacja 1644 to
11001101100
Aby to złożyć, najpierw podzielimy na pół
11001 1 01100
Środkowy bit to 1, więc go wyrzucamy.
11001 01100
Cofamy drugą połowę
11001
00110
I XNOR dwie połówki:
00000
Jest to zero, więc jest to liczba składana.
4254
Binarna reprezentacja 4254 to
1000010011110
Aby to złożyć, najpierw podzielimy na pół
100001 0 011110
Środkowy bit to 0, więc nie jest to liczba składana.
Zadanie
Twoim zadaniem jest przyjęcie liczby dodatniej i zwrócenie prawdy, jeśli liczba się składa, i fałsz, jeśli tak nie jest. To jest kod golfowy, więc staraj się odliczać bajty.
Przypadki testowe
Oto pierwsze 99 liczb składanych:
[1, 2, 6, 10, 12, 22, 28, 38, 42, 52, 56, 78, 90, 108, 120, 142, 150, 170, 178, 204, 212, 232, 240, 286, 310, 346, 370, 412, 436, 472, 496, 542, 558, 598, 614, 666, 682, 722, 738, 796, 812, 852, 868, 920, 936, 976, 992, 1086, 1134, 1206, 1254, 1338, 1386, 1458, 1506, 1596, 1644, 1716, 1764, 1848, 1896, 1968, 2016, 2110, 2142, 2222, 2254, 2358, 2390, 2470, 2502, 2618, 2650, 2730, 2762, 2866, 2898, 2978, 3010, 3132, 3164, 3244, 3276, 3380, 3412, 3492, 3524, 3640, 3672, 3752, 3784, 3888, 3920, 4000, 4032, 4222, 4318, 4462, 4558]
0
, więc nie. (Być może warto mieć trzeci działający przykład jak ten.) To samo dotyczy 18.Odpowiedzi:
Galaretka , 9 bajtów
Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
Jak to działa
źródło
05AB1E ,
1312 bajtówKod:
Wykorzystuje kodowanie CP-1252 . Wypróbuj online!
Wyjaśnienie:
Najpierw konwertujemy liczbę na binarną za pomocą
b
. 1644 staje się 11001101100 . Podzieliliśmy to na dwie części za pomocą2ä
. Na przykład 11001101100 stałby się:Jeśli liczba bitów jest nierówna, pierwsza część otrzyma dodatkowy bit. Mamy
R
everse ostatni ciąg i dołączania zero użyciu0¸«
. Powodem tego jest podawanie prawdziwych wyników tylko wtedy, gdy środkowy bit ma wartość 1 ( 1 XOR 0 = 1 i 0 XOR 0 = 0 ). Jeśli nie ma bitu środkowego, 05AB1E zignoruje ostatni bit (zero, które zostało dodane):Ostatnią rzeczą, którą musimy zrobić, to zrobić elementarne XOR i wziąć iloczyn wyniku. Jeśli jest o jeden element za dużo, program po prostu pominie ostatni element (
[1, 0, 0] XOR [0, 1] = [1, 1]
) Na przykład:Staje się:
A wynikiem tego jest 1 , co jest prawdą.
źródło
s
jest wymagane.bÐg;ô
było tak daleko, jak to możliwe, zanim odświeżyłem się i zobaczyłem, jak to przybiłeś. Świetna odpowiedź, która pomaga mi się uczyć!Java 7,
152 145 142 138134 bajtówPętle nad ciągiem, tak jak w przypadku palindromu, szukają zer. Śledzi przez wielokrotne mnożenie, więc wszystko, co musisz zrobić, to sprawdzić, czy na końcu nie jest zero.
Bez pasków przewijania:
źródło
byte[]b=(a+"").getBytes();
jest krótszy niżchar[]b=a.toString(a,2).toCharArray();
i nadal wydaje się działać (-12 bajtów).getBytes
może nadal działać na char []. Dzięki :)z
jako int (w0
przypadku fałszu, dowolne inne w przypadku prawdy) - zaoszczędzi ci kilka bajtów.JavaScript (ES6),
615752 bajtówRekurencyjnie oblicza:
gdzie
N
jest ranga najwyższego bitu ustawionego na wejściu.Jeśli wejście ma nieparzystą liczbę bitów, środkowy bit jest XOR'ed z niezdefiniowaną (wartość zwracana przez
pop()
pustą tablicę), co pozwala mu pozostać niezmienionym. Tak więc0
środkowy bit usuwa wynik, a1
środkowy bit nie zmienia wyniku innych operacji - co jest zgodne z definicją wyzwania liczby składanej.źródło
Python 2, 57 bajtów
Dane wyjściowe za pomocą kodu wyjścia : błąd dla Falsey i brak błędu dla Prawdy.
Konwertuje dane wejściowe na binarne. Sprawdza, czy pierwszy i ostatni znak są nierówne, utrzymuje i powtarza to po usunięciu tych znaków.
Porównanie
s[-1]==s[0]<_
daje błąd, jeśli pierwszy i ostatni znak są nierówne, próbując ocenić nieprzypisaną zmienną o nazwie_
. Jeśli są równe, łańcuch nierówności jest zwarty. Kiedy dojdziemy do środkowego elementu1
,while
pętla kończy się, w specjalnym przypadku jest OK.Podejrzewam, że podejście czysto arytmetyczne będzie krótsze z rekurencją, taką jak
f=lambda n,r=0:...f(n/2,2*r+~n%2)...
odrywanie cyfr binarnych od końca odwróconych i odwróconych oraz wykrycie, kiedyn
i kiedyr
są równe do środka1
. Istnieją jednak subtelności z wiodącymi zerami i środkiem.źródło
Python 2,
94 79 7267 bajtówZaoszczędź 12 bajtów dzięki @xnor
Definiuje nienazwaną funkcję w drugim wierszu.
Objaśnienie (z dodaną białą spacją):
Wypróbuj tutaj!
źródło
s==''or s=='1'
może byćs in'1'
and
Może być arytmetyka*
. Można równieżf
pozostawić bezimienne.Haskell,
898886 bajtówDziała poprzez sumowanie bitowej reprezentacji bitów z jej odwrotnością i pobranie produktu. Jeśli jest to 1 lub 2, liczba jest liczbą składaną (1, jeśli są parzyste bity, które pasują, 2, jeśli są nieparzyste bity i jeden na środku).
źródło
Python 2,
100999594 bajtówTo wydaje się trochę długie, ale będę nad tym pracował :) Drukuje,
1
jeśli liczba może zostać złożona, w0
przeciwnym razie.Sprawdź to tutaj!
dzięki Wheat Wizard za 1-bajtowe zapisywanie :)
dzięki Rod za 5-bajtowe oszczędności! :)
źródło
b-1
z~b
[1,a[b]>'0'][len(a)%2]
z(a[b]>=`len(a)%2`)
e=len(a)
aby zmienićb=e/2
`e%2
`, oszczędzając 1 bajt. A potem obie odpowiedzi na pytona zostaną powiązane c:> <> , 37 + 3 = 40 bajtów
Dane wejściowe powinny być obecne na stosie przy starcie programu, więc +3 bajty dla
-v
flagi.Wypróbuj online!
źródło
Galaretka , 13 bajtów
TryItOnline
Lub pasujące warunki do 4558
W jaki sposób?
źródło
Perl, 46 bajtów
Obejmuje +1 dla
-p
Uruchom z numerem na STDIN
folding.pl
:Uważam za perlowy błąd, który nawet działa. Wewnętrzne
$_
nie powinny otrzymywać aktualizacji pozycji dopasowania po modyfikacji. W tym programie pozycja dopasowania faktycznie przesuwa się poza koniec$_
źródło
perl -pe '$_=sprintf("%b",$_)=~/^(.*)1?(??{reverse$^N=~y%01%10%r})$/'
:: /Brachylog , 16 bajtów
To nie do końca działa online ...
Pobiera dane wejściowe przez zmienną wejściową i dane wyjściowe w wyniku sukcesu lub niepowodzenia. Jest w dużej mierze oparty na tym języku
z₂
, który jest używany w języku od 30 kwietnia, ale zapomnieliśmy poprosić o włączenie TIO, więc na razie działa to tylko na lokalnej instalacji języka. Tak czy inaczej jest to prawdopodobnie zbyt naiwne podejście.Brachylog (na TIO), 19 bajtów
Wypróbuj online!
lᵛ↖Lz
jest funkcjonalnie równoważnyz₂
(jeśli nie używasz zmiennej L nigdzie indziej), ale jest również trzy bajty dłuższy.źródło
Python 2,
76 7169 bajtów-5 bajty dzięki @Dennis (
''
występuje w'1'
tak wymienićin('','1')
zin'1'
)-2 bajty dzięki @xnor (Użyj mnożenia
(...)*
w miejscuand
)Ideone
Funkcja rekurencyjna, przy pierwszym wywołaniu
n
jest liczbą, więc ocenia się ją jako mniejszą niż pusty ciąg, zif n<''
, i funkcja jest wywoływana ponownie, ale zn
rzutowaniem na ciąg binarny; ogon jest pustym łańcuchem (nawet o długości bitu) lub środkowym, który zwraca wartość true dla pustego lub a'1'
; Jest to sposób na dół, to sprawdza zewnętrzne bitów dla nierówność (równoważne XOR) i recurses na wewnętrznych bitówn[1:-1]
.źródło
n in'1'
działa.''
był obecny'blah'
, ale tak jest :)and
Może być arytmetyka*
.Python 2, 63 bajty
Odbitki
True
lubFalse
. Pobiera binarną reprezentacjęs
i wielokrotnie usuwa pierwszy i ostatni znak, o ile są one nierówne. Sprawdza, czy pozostaje pusty ciąg lub centrala1
. Odbywa się to poprzez konwersję''
do'1'
i sprawdzenie, czy wynik jest równy'1'
, co również pozwala uniknąć błędu indeksu na pustym ciągu.źródło
PowerShell v2 +, 143 bajty
Dwa możliwe podejścia, oba o tej samej liczbie bajtów.
Metoda 1:
Zajmuje wejście
$n
, jeśli jest-eq
seksualnego do1
(przypadek szczególny dla tego algorytmu), zwiększać ją. Ustaw$o
utput na1
(tzn. Zakładaj prawdę), a następnie zapętl od0
punktu środkowego liczby wejściowej, która została zmieniona[convert]
na binarną. Zwróć-!($b%2)
uwagę, aby uwzględnić liczby binarne o nieparzystej długości.Podczas każdej iteracji porównujemy bieżącą cyfrę
$n[$_]
z cyfrą o tej samej długości od końca$n[$b-$_]
i mnożymy wynik boolowski$o
(zasadniczo wykonując-and
na wszystkich z nich). Po zakończeniu pętli musimy potencjalnie uwzględnić środkową cyfrę binarną, czyli pseudo-trójkę na końcu (tablica indeksowana przez$b%2
). To1
lub0
pozostaje w potoku, a dane wyjściowe są niejawne.Metoda 2:
Pobiera dane wejściowe i wykonuje ten sam proces do
[convert]
liczby binarnej. Następnie jesteśmy wfor
pętli, dopóki.length
łańcuch binarny jest-g
reatert
han2
. Kiedy jesteśmy w pętli, jeśli pierwsze$n[0]
i ostatnie$n[-1]
cyfry to-n
ote
qual, pokroić te dwie cyfry off$n
i ponownie go do sklepu$n
. W przeciwnym razie dane wyjściowe0
iexit
. Raz jesteśmy z pętli, nie mamy (tablicę1
,1,0
,0,1
,1,1
, lub0,0
) lub ciąg binarny dla dwóch10
lub 311
. Musimy więc przetestować te dwie możliwości. Po pierwsze,-join
$n
wraz z+
wynikiem oceniamy go i testujemy1
(jest to prawdą dla tablic1
,1,0
i0,1
, ale jest$false
dla tablic0,0
i1,1
czy sznurków10
lub11
). Druga połowa-or
badania polega na sprawdzeniu, czy$n
jest to-eq
przydatne10
(tj. Wejście2
). To, że wartość logiczna jest pozostawiana w potoku, a dane wyjściowe są niejawne.źródło
CJam , 13 bajtów
Wypróbuj online! lub wygeneruj listę liczb składanych do podanej liczby.
źródło
MATL , 16 bajtów
Prawda to tablica ze wszystkimi. Sprawdź kryteria prawdy / fałszu tutaj .
Wypróbuj online! Lub Zweryfikuj pierwsze 20 przypadków testowych .
Wyjaśnienie
1644
Jako przykład weźmy dane wejściowe .źródło
PHP, 101 bajtów
lub z logiem
108 bajtów z tablicą
Prawdziwe wartości <10000
źródło
Julia , 66 bajtów
Mój pierwszy golf! działa tak samo jak rozwiązanie Pythona o tej samej długości, z niewielkimi różnicami ze względu na język (ja sam to wymyśliłem ...).
Wyjaśnienie:
źródło
C,
223201189194178 bajtówAlgorytm siły brutalnej. Zobaczmy, jak daleko można grać w golfa.
Poprawki błędów konfiguracji testowania ...
źródło
MATL , 13 bajtów
Prawda to tablica ze wszystkimi. Sprawdź kryteria prawdy / fałszu tutaj .
Wypróbuj online! Lub sprawdź pierwsze 20 przypadków testowych .
Wyjaśnienie
Wykorzystując dane wejściowe
1644
jako przykład:źródło
JavaScript, 71 bajtów
Definiuje anonimową funkcję.
Ta metoda może nie jest najkrótsza, ale o ile mi wiadomo, jest wyjątkowa. Dodaje liczbę binarną do siebie odwróconą, traktując je jako dziesiętne, a następnie sprawdzając, czy wynik jest poprawny, używając wyrażenia regularnego.
źródło
Siatkówka, 92 bajty
Liczba bajtów zakłada kodowanie ISO 8859-1.
Wypróbuj online
Konwertuj na unary. Konwertuj to na binarne. Wytnij liczbę na pół i usuń środek,
1
jeśli istnieje. Odwróć pierwszą połowę. Przełączaj jedynki i zera. Dopasuj, jeśli obie połowy są równe.źródło
Siatkówka,
717060 bajtówPrawdopodobnie wciąż mam wiele do nauczenia się na temat Retiny (np. Rekursywne wyrażenie regularne?). Objaśnienie: Krok 1 przekształca liczbę dziesiętną w unarną. Krok 2 konwertuje z jednoargumentowego na pseudobinarny. Krok 3 usuwa cyfry z obu końców, o ile są one niezgodne. Krok czwarty dopasowuje opcjonalny końcowy centralny 1, jeśli to konieczne. Edycja: Zapisano 1 bajt dzięki @ mbomb007. Zaoszczędziłem 10 bajtów, ulepszając moją jednoargumentową konwersję do binarnej.
źródło
.*
lub.+
.Python 2,
6159 bajtówZapisywanie dwóch bajtów w celu konwersji przesunięć na mnożenia
Zwraca
0
liczbę składaną i cokolwiek innego za brak składania. Wykorzystuje podejście typu „bit-twiddling”.źródło
C,
6563 bajtówDwa bajty do konwersji przesunięć na mnożenia
Biała spacja jest już wykluczona z bajtecount, zwraca 0 dla liczby składanej i cokolwiek innego dla braku składania. Korzysta z metody „kręć nieco bit”.
źródło
k, 77 bajtów
w celu wyjaśnienia tłumaczenie na
q
źródło