„Liczba Giza”, zwana również potocznie liczbą Timmy'ego, to dowolna liczba, w której cyfry przedstawiają piramidę ( A134810 ). Na przykład „12321” jest liczbą Gizy, ponieważ można ją wizualizować w następujący sposób:
3
2 2
1 1
Jednak coś takiego jak „123321” nie jest liczbą Giza, ponieważ na górze piramidy znajdują się dwie cyfry
33
2 2
1 1
Innymi słowy, liczba jest liczbą Giza, jeśli spełnione są wszystkie następujące warunki:
Ma nieparzystą liczbę cyfr, a środkowa cyfra jest największa
Jest palindromiczny (ten sam odczyt do przodu lub do tyłu) i
Pierwsza połowa cyfr rośnie ściśle o jeden. (Ponieważ musi być palindromiczny, oznacza to, że druga połowa cyfr musi ściśle zmniejszać się o jeden)
Musisz napisać pełny program lub funkcję, która przyjmuje dodatnią liczbę całkowitą jako dane wejściowe i ustalić, czy jest to liczba Giza, czy nie. Możesz wziąć dane wejściowe jako ciąg lub liczbę. Jeśli jest to liczba Giza, należy podać prawdziwą wartość . W przeciwnym razie wartość fałszowania.
Istnieje w sumie 45 liczb Giza, więc każde z tych danych wejściowych powinno dać prawdziwą wartość:
1
2
3
4
5
6
7
8
9
121
232
343
454
565
676
787
898
12321
23432
34543
45654
56765
67876
78987
1234321
2345432
3456543
4567654
5678765
6789876
123454321
234565432
345676543
456787654
567898765
12345654321
23456765432
34567876543
45678987654
1234567654321
2345678765432
3456789876543
123456787654321
234567898765432
12345678987654321
Wszelkie inne dane wejściowe powinny dawać wartość fałszowania. Oczywiście nie musisz obsługiwać nieprawidłowych danych wejściowych, takich jak liczby dodatnie, liczby całkowite lub liczby nieparzyste.
Jak zwykle jest to gra w golfa , więc standardowe luki są zakazane, a najkrótsza odpowiedź w bajtach wygrywa!
źródło
Odpowiedzi:
Python 2,
484746 bajtówPrzetestuj na Ideone .
Jak to działa
W Pythonie porównanie łańcuchowe zwraca wartość True wtedy i tylko wtedy, gdy wszystkie indywidualne porównania robią to samo. W tym konkretnym przypadku nasza lambda zwraca wartość True wtedy i tylko wtedy, gdy spełnione są wszystkie następujące warunki.
s[~len(s)/2:]in'987654321'
Dla łańcucha y o długości 2n + 1 ,
~len(s)/2
wraca ~ (2N + 1) / 2 = - (2n + 2) / 2 = - (n + 1) , więcs[~len(s)/2:]
, otrzymuje się najbardziej na prawo N + 1 znaków s .Podobnie, dla struny s o długości 2n ,
~len(s)/2
powraca ~ (2 M) / 2 = - (2n + 1) / 2 = - (n + 1) (całkowita podział zawsze okrągły kierunku -∞ , więcs[~len(s)/2:]
ponownie otrzymuje się najbardziej na prawo n + 1 znaków sPorównanie zwraca wartość True tylko wtedy, gdy skrajnie prawe n + 1 znaków tworzy podłańcuch
987654321
.Zauważ, że jeśli tak, a s ma 2n znaków, s nie może być palindromem; n p i (n + 1) TH postacie z prawej być różne, a drugi jest n p postać z lewej strony.
'987654321'>s
To porównuje ciągi leksykograficzne. Ponieważ 9 jest jedyną liczbą w Gizie, która zaczyna się od 9 , wszystkie liczby w Gizie spełniają to porównanie.
Pamiętaj, że porównywanie tych ciągów nie stanowi części naszego problemu decyzyjnego;
>s
jest po prostu o trzy znaki krótszy niżand s
.s==s[::-1]
Zwraca wartość True tylko wtedy, gdy s jest palindromem.
źródło
Perl,
39374239 + 1 = 40 bajtówDzięki nowej metodzie udało mi się zmniejszyć ogromną liczbę bajtów. Uruchom z
-n
flagą. Akceptuje dane wejściowe wielokrotnie w czasie wykonywania, odpowiednio drukując 0 lub 1.Musiałem dodać 5 bajtów, ponieważ zdałem sobie sprawę, że bez tego kod działał dla danych wejściowych, takich jak 1234567900987654321, który nie jest liczbą Giza. Ponieważ liczby Giza nigdy nie zawierają cyfry 0 (a wszystkie fałszywie dodatnie z konieczności zawierałyby cyfrę 0), te 5 bajtów to wyjaśnia.
Wyjaśnienie:
Celem wyrażenia regularnego podstawienia jest skonstruowanie ciągu 1s, którego długość stanowi połowę długości wejścia, zaokrągloną w górę. Zatem wejście
12321
spowoduje wytworzenie ciągu111
, który następnie zostanie podniesiony do kwadratu (wyjaśnienie poniżej). Dane wejściowe o parzystej długości wytworzą łańcuchy, które są zbyt małe, aby zapewnić, że końcowy regex się powiedzie.Przyczyną tego kodu jest to, że:
Możemy wyraźnie zobaczyć, że liczba 1 w RHS jest równa 1/2 więcej niż połowa wielkości LHS. (1 więcej, jeśli obciemy). Do tego:
567898765 - 123454321 = 444444444, czyli tylko 4 powtórzenia. Kiedy więc odejmiemy nasz kwadrat od naszego numeru, jeśli otrzymamy powtórkę, naszym pierwotnym numerem jest liczba Giza.
Stary kod i stara metoda (58 + 1 = 59 bajtów)
Zapisano 1 bajt dzięki @Dada
Uruchom z
-n
flagą, potokuj za pomocą tekstuecho
Oblicza unikalną liczbę giza określoną na podstawie długości i wiodącej liczby całkowitej i sprawdza, czy pasuje do wartości wejściowej.
Uruchom jako
echo -n "123454321" | perl -M5.010 -n giza.pl
Zwraca,1
jeśli jest to liczba Giza, w przeciwnym razie zero.źródło
Galaretka ,
1076 bajtówGeneruje wszystkie 45 numerów liczb Giza, a następnie testuje członkostwo.
Wypróbuj online! lub zobacz wygenerowane liczby .
Jak to działa
źródło
JavaScript (ES6),
46454241 bajtówPobiera dane wejściowe jako ciąg znaków i zwraca jednocyfrowe ciągi znaków „prawda”, „
0
fałsz”.Podstawowym pomysłem jest sprawdzenie kilku rzeczy:
źródło
Java 7,
128 119105 bajtówNigdy więcej strun! Teraz zaczynam od wygenerowania
111...
liczby o tej samej długości co input (a
) i jednej krótszej do square (b
). Następnie możesz odjąćb*b
od danych wejściowych i sprawdzić podzielność wedługa
.c
jest po to, by sprawdzić nieparzyste / parzyste, nie przejmuj się> _>Białe znaki:
Stara metoda, 119 bajtów
Przechodzi przez tablicę, sprawdzając różnicę 1 (lub -1, w zależności od której połowy) między każdą cyfrą. Następnie sprawdza, czy długość jest nieparzysta.
Białe znaki:
źródło
char[]
liczą się one jako ciąg , więc powiedziałbym, że jest poprawny.05AB1E ,
98 bajtówPrawda to 1 , fałsz to 0 .
Wykorzystuje kodowanie CP-1252 . Wypróbuj online!
źródło
2ä¬û¹Q
to też zadziała i pozwoli zaoszczędzić dwa bajty.Python 2,
77, 76, 64, 63 bajtówProste rozwiązanie rekurencyjne. Sprawdza, czy pierwsza i ostatnia cyfra są sobie równe, a druga cyfra minus jedna. Następnie sprawdza, czy środek jest również liczbą Giza. Zwraca wartość true, gdy dojdzie do jednej cyfry.
Jeden bajt zaoszczędzony dzięki @Rod, mnóstwo bajtów zaoszczędzonych dzięki DLosc i ETHProductions!
źródło
len(s)==1
pomocą,1==len(s)
aby zaoszczędzić 1 bajt na miejscu, a takżeand
s można zastąpić,*
aby zaoszczędzić 3 bajty1or
też działa. (O ile nie jest to0
poprzedzające -o
wtedy Python myśli, że jest to liczba ósemkowa.)and
ze*
gdy wymagane jest zachowanie zwarcie, jak to jest w funkcji rekurencyjnej. Pierwszyand
powinien być wymienny, ale potrzebuje dwóch zestawów nawiasów, co neguje jakiekolwiek oszczędności. (cc: @Rod)int()
okołos[0]
lub 2) użyćs[0]==`int(s[1])-1`
?s[-1]==s[0]==`int(s[1])-1`
(wymaga konkretnie Python 2).PowerShell v3 +,
14710867 bajtówRadykalnie zmienione podejście. Generuje wszystkie możliwe liczby Giza, a następnie sprawdza, czy dane wejściowe
$args[0]
to-in
ta kolekcja. Poniżej powstaje zbiór liczb Giza:Przykładowe przebiegi:
źródło
Python 3, 65 bajtów
Nie jestem do końca pewien, ale myślę, że to działa.
źródło
0
, możesz to usunąć :) Nie będzie też liczb dłuższych niż 17, które spełniają ten warunek, więc też nie potrzebujesz tego. Jest to w zasadzie to samo rozwiązanie, które ma Dennis :)Python 2,
687366 bajtównadużywa fakt
11^2=121
,111^2=12321
i tak dalej, to obliczyć i dodać1111..
tyle razy jak offset.Przykłady:
23432=111^2+11111*1
676=11^2+111*5
źródło
f
, nie musisz go tak naprawdę nazywać. Możesz zapisać dwa bajty, usuwającf=
1234567900987654321
zwracają wartość true, gdy powinna być fałszywa.Perl, 41 bajtów
40 bajtów kodu +
-p
flagi.Wysyła 1, jeśli wejście jest liczbą Giza, nic innego. Podaj dane wejściowe bez ostatniej nowej linii, aby je uruchomić:
Objaśnienia : najpierw
s/(.)(?=(.))/$1-$2/ge
zamień każdą cyfrę$1
(a następnie$2
) na$1-$2
. Jeśli jest to liczba Giza, to każda cyfra jest o jeden mniejsza niż następna na początku i jeszcze jedna na końcu, wówczas ciąg powinien zawierać tylko-1
w pierwszej części, a1
w drugiej (z wyjątkiem ostatniej, która pozostaje niezmieniona) . Tak/^(-1(?1)1|).$/
sprawdza druga część : szuka-1
następnej rekurencji, po której następuje1
.-1 bajt dzięki Martin Ender.
Moja poprzednia wersja 15 bajtów dłuższa (całkiem inna, więc pozwolę jej tutaj):
źródło
|
drugiego wyrażenia regularnego.> <> RYBY
57524948 bajtówEdycja 1: = zwraca 0 lub 1, jeśli prawda, więc usunęła czek i wykorzystała tę wartość do zwiększenia, a następnie sprawdza równość po tym. (zapisano 6 bajtów, utracono 1 dla nowej linii).
Edycja 2: 3 znaczniki kierunkowe usunięte i 11 umieszczone w szczelinie, aby przesunąć stos na równą długość, aby wymusić fałsz (zapisane 3 bajty).,
Edycja 3: Zduplikuj długość stosu, aby sprawdzić MOD przez 2 i len (1), zostało to zrobione przez dwukrotne umieszczenie długości, ale teraz wypełniło to puste miejsce w linii 2 (zapisano 1 bajt).
źródło
C #,
1208610810292 bajtyPełny program z niektórymi przypadkami testowymi:
Brawo dla jednowierszowych warunków, teraz pokonując odpowiedź Java :)! Muszę też napisać moje pierwsze komentarze wyjaśniające, chociaż prawdopodobnie są one oczywiste. Dzięki @Dada za znalezienie problemu z moim algorytmem (było to prawdą w przypadku liczb, które były dublowane jak 13631). Teraz poniżej 100, ponieważ najwyraźniej sprawdzanie długości% 2 jest zbędne.
źródło
true
liczb takich jak13631
? Również, ponieważ wykonujesz rekurencyjne połączenie zx
, myślę, że musisz uwzględnićx=
w swojej liczbie bajtów.Bash, 111 bajtów
AKTUALIZACJA
Pamiętaj, że normalizację liczb wejściowych można prawdopodobnie całkowicie pominąć, jeśli po prostu dodasz pierwszą cyfrę z powrotem do wygenerowanego numeru GIZA , w ten sposób:
a następnie po prostu porównaj to bezpośrednio z danymi wejściowymi.
Oświadczenie: ten nie jest tak naprawdę zoptymalizowany, więc jest bardziej dowodem koncepcji niż prawdziwym rywalem
Grał w golfa
Algorytm
Dowolną liczbę GIZA można znormalizować do postaci kanonicznej, odejmując pierwszą cyfrę od reszty:
i jest tylko jedna kanoniczna liczba GIZA o określonej długości.
Wiedząc o tym, możemy łatwo wygenerować kanoniczny numer GIZA na podstawie długości numeru wejściowego:
następnie znormalizuj numer wejściowy:
i porównaj
Test
źródło
Właściwie 22 bajty
Wypróbuj online!
Pobiera dane wejściowe jako cytowany ciąg (np
"12321"
.). Wyjście jest dodatnią liczbą całkowitą dla wartości true i0
false.Wyjaśnienie:
źródło
Haskell, 62 bajty
Dane wejściowe są traktowane jako ciąg.
Tworzy listę wszystkich numerów w Gizie i sprawdza, czy jest w niej numer. Lista jest tworzona przez zapętlenie
i
poprzez'1'..'9'
a następniej
poprzez'1'..i
i tworzenia elementówj .. i-1 , i , i-1 .. j
.źródło
> <> , 62 bajty
Wypróbuj online!
Wyjścia 1 dla numeru Giza; 0 w przeciwnym razie. Działa poprzez wpychanie danych wejściowych do dequeue (ok, technicznie odwracalny stos) i wielokrotne testowanie obu końców pod kątem równości, a także upewnienie się, że są dokładnie o jeden większe od poprzedniej wartości.
źródło
CJam ,
2019 bajtówZestaw testowy.
Wyjaśnienie
Podstawową ideą jest znalezienie minimalnej i maksymalnej cyfry, a następnie utworzenie z nich liczby Giza, a następnie sprawdzenie, czy jest ona równoważna z danymi wejściowymi.
Zamiast znaku minimalnego możemy również użyć pierwszego znaku, dla tej samej liczby bajtów:
źródło
Mathematica,
626160 bajtówZapisano 2 bajty dzięki @MartinEnder .
Skład funkcji. Pobiera liczbę jako dane wejściowe i zwraca
True
lubFalse
dane wyjściowe.źródło
Retina,
555436 bajtówLiczba bajtów zakłada kodowanie ISO 8859-1.
Wypróbuj online
Konwertuj każdą cyfrę na unarną, oddzieloną dwukropkami. Pętla, usuwając pasujące cyfry zewnętrzne, jeśli następna cyfra to jeszcze jedna. Dopasuj jedną pozostałą cyfrę.
źródło
12312
PHP, 71 bajtów
pobiera największą cyfrę z wejścia i odlicza, dodając nową cyfrę do ciągu porównawczego, aż parametry wejściowe i porównawcze będą równe - lub
$i
będzie0
.wypisuje najniższą cyfrę dla Timmy Number, w przeciwnym razie
0
.źródło
Pushy ,
3015 bajtówObudziłem się dziś rano i zdaję sobie sprawę, że mogę o połowę dłużej odpowiedzieć ...
(niekonkuruje, ponieważ wyzwanie stanowi język po datach)
Wejście jest podana w wierszu poleceń:
$ pushy gizas.pshy 3456543
. Wyjścia1
dla prawdy i0
fałszu. Oto podział:Algorytm został zainspirowany odpowiedzią bash: najpierw normalizuj liczbę (
45654 -> 01210
), a następnie wygeneruj znormalizowaną liczbę giza o tej samej długości (jest tylko jedna) i porównaj.Stare rozwiązanie
źródło
Rakieta 292 bajtów
Nie golfowany:
Testowanie:
Wynik:
źródło
Java 8, 162 + 19 bajtów
19 za
import java.util.*;
Odmiennie podchodząc do innej odpowiedzi Java, chciałem spróbować metody tworzenia wszystkich możliwych liczb Timmy'ego i sprawdzania, czy zawiera się w nich nasz łańcuch.
źródło
Oktawa, 56 bajtów
Sprawdź wszystkie przypadki testowe tutaj .
W MATLAB byłoby to o dwa mniej bajtów, ponieważ
diff(n)
działa na łańcuchy. W Octave potrzebujeszdiff(+n)
.Wyjaśnienie:
źródło
Mathematica, 56 bajtów
To jest trochę krótsze:
źródło
Java 7,
129 119109 bajtówStara metoda rekurencyjna, 119
-10 bajtów dzięki Geobits. My
sązwiązane były ...Wypróbuj online!
źródło
and
, myślę, że użyłeś go raz, ale nie za drugim razem? Albo źle to czytam.java.util.Arrays.copyOfRange(...)
pomijając linię importu.Perl 6 ,
4334 bajtówDzięki Jo King za -9 bajtów.
Rozwiązanie Perla dla portu Gabriela Benamy'ego .
Wypróbuj online!
źródło
Cjam, 35 bajtów
Prawdopodobnie bardzo nieoptymalny ... Jestem trochę poza praktyką!
Wypróbuj online!
źródło
Python 2,
50828180 bajtówProste podejście. Po prostu dzieli łańcuch na pół (brakuje środkowego znaku lub jeden po środku znaku, jeśli jest równej długości), odwraca drugą połowę, a następnie porównuje obie i porównuje pierwszą połowę ze łańcuchem od 1 do 9.
Edytować
Przesłane po konstruktywnej informacji zwrotnej od innych golfistów oraz uświadomieniu sobie i poprawieniu moich błędów.
-1 za utratę (marnotrawstwo) miejsca
-1 za ponowne przeczytanie pytania i uświadomienie sobie, że nie musimy brać pod uwagę 0. Naprawdę muszę przestać grać w golfa po długim dniu w pracy.
źródło
13531
i6543456
oba niepoprawnie zwracają wartość True.'0'
i'1'
oba są zgodne z prawdą.