Użytkownik PPCG i wybrany mod, @Dennis właśnie został drugim użytkownikiem, który zarobił ponad 100 000 powtórzeń!
Jest to całkowicie oryginalny pomysł, którego nie dostałem od nikogo innego , ale zróbmy wyzwanie na podstawie jego identyfikatora użytkownika, 12012
jako hołd!
Patrząc na to, zauważysz, że jego identyfikator ma dwie odrębne „sekcje”.
12
i
012
Obie te sekcje sumują się do 3. To całkiem interesująca właściwość.
Zdefiniujmy „liczbę Dennisa 2.0” jako dowolną liczbę całkowitą dodatnią, w której każda maksymalna podsekwencja ściśle rosnących cyfr sumuje się do tej samej liczby. Na przykład,
123
jest liczbą Dennisa 2.0, ponieważ istnieje tylko jedna maksymalna podlista ściśle rosnących cyfr i sumuje się do 6. Dodatkowo 2.846,145 to także liczba Dennisa 2.0, ponieważ trzy maksymalne podlisty rosnących cyfr, a mianowicie
28
46
145
Suma do 10
. Ponadto liczby, które powtarzają tę samą cyfrę, muszą być liczbami Dennisa 2.0, ponieważ na przykład 777
można je podzielić
7
7
7
które oczywiście wszystkie sumują się do siedmiu.
Liczba taka jak nie42
jest liczbą Dennis 2.0, ponieważ jest podzielona na
4
2
które oczywiście nie sumują się do tej samej liczby.
Wyzwanie
Musisz napisać program lub funkcję, aby ustalić, czy podana liczba jest liczbą Dennisa 2.0, czy nie. Możesz pobierać dane wejściowe i wyjściowe w dowolnym rozsądnym formacie wejściowym, np. Jako ciąg, jako liczba, z pliku, argumentów / return funkcji, z STDIN / STDOUT itp., A następnie zwrócić prawdziwą wartość, jeśli liczba ta to Dennis 2.0 liczba i wartość fałsz, jeśli nie jest. Dla porównania, oto każda liczba Dennis 2.0 do 1000:
1
2
3
4
5
6
7
8
9
11
12
13
14
15
16
17
18
19
22
23
24
25
26
27
28
29
33
34
35
36
37
38
39
44
45
46
47
48
49
55
56
57
58
59
66
67
68
69
77
78
79
88
89
99
101
111
123
124
125
126
127
128
129
134
135
136
137
138
139
145
146
147
148
149
156
157
158
159
167
168
169
178
179
189
202
222
234
235
236
237
238
239
245
246
247
248
249
256
257
258
259
267
268
269
278
279
289
303
312
333
345
346
347
348
349
356
357
358
359
367
368
369
378
379
389
404
413
444
456
457
458
459
467
468
469
478
479
489
505
514
523
555
567
568
569
578
579
589
606
615
624
666
678
679
689
707
716
725
734
777
789
808
817
826
835
888
909
918
927
936
945
999
Obowiązują standardowe luki, a najkrótsza odpowiedź mierzona w bajtach wygrywa!
źródło
1236|6
,
między nimi? To prawdopodobnie bardzo go rozciąga.Odpowiedzi:
Galaretka,
1312 bajtów1 bajt dzięki @Dennis.
Wypróbuj online!
Wyjaśnienie
źródło
JavaScript (ES6),
7270 bajtówPobiera ciąg jako dane wejściowe. Zwraca wartość false lub true (która może być liczbą).
Używa wyrażenia regularnego, aby przekształcić ciąg wejściowy, taki jak
"2846145"
:Następnie wywołuje
eval()
to wyrażenie.źródło
2011
dzieli jako2 / 01 / 1
i nie jest liczbą D2.0. Jeśli chodzi o189
, jest to liczba D2.0 i18
jest to prawdziwa wartość.Python, 50 bajtów
Oczekuje
input()
oceny na ciąg, więc dane wejściowe wymagają otaczania cudzysłowami w Pythonie 2. Dane wyjściowe są przesyłane za pomocą kodu wyjścia , gdzie 0 oznacza sukces (prawda), a 1 oznacza niepowodzenie (fałsz).Przetestuj na Ideone .
Jak to działa
Inicjalizujemy r do ciągu 0 i iterujemy wszystkie cyfry d na wejściu.
Jeśli d jest większe niż pierwsza cyfra r (początkowo 0 , a następnie równa poprzedniej wartości d ),
r<d
ocenia się na True i'=+'[r<d]*2
daje++
.Jeśli d jest mniejsze niż pierwsza cyfra r ,
'=+'[r<d]*2
daje==
.Jeśli d jest równe pierwszej cyfrze r , r będzie dłuższy niż ciąg singletonu d , więc
'=+'[r<d]*2
daje to ponownie==
.We wszystkich przypadkach cyfra d i dwa wygenerowane znaki są dodawane do r .
Po przetworzeniu wszystkich cyfr wejściowych
eval(r)
ocenia wygenerowane wyrażenie.Jeśli dane wejściowe składają się z jednej ściśle rosnącej sekwencji (dodatnich) cyfr, wyrażenie wyraża się jako ich suma.
Na przykład liczba całkowita 12345 powoduje wyrażenie
5++4++3++2++1++0
, które daje 15 po ocenie. Pamiętaj, że każda sekunda + jest jednoznacznym plusem, więc nie wpływa na wynik. Dzielenie 1 przez 15 jest poprawne (wynik nie jest ważny); program kończy się normalnie.Jeśli dane wejściowe składają się z dwóch ściśle rosnących sekwencji cyfr, wyrażenie składa się z prostego porównania.
Na przykład liczba całkowita 12012 powoduje wyrażenie
2++1++0==2++1++0
, które daje wartość True po ocenie, ponieważ oba terminy mają sumę 3 . Dzielenie 1 przez True ( 1 ) jest poprawne (wynik nie jest ważny); program kończy się normalnie.Z drugiej strony liczba całkowita 12366 powoduje wyrażenie
6==6++3++2++1++0
, które daje wartość Fałsz, gdy jest oceniana, ponieważ terminy mają sumy 6 i 12 . Dzielenie 1 przez False ( 0 ) podnosi ZeroDivisionError ; program kończy pracę z błędem.Jeśli dane wejściowe składają się z trzech lub więcej ściśle rosnących sekwencji cyfr, wyrażenie składa się z łańcuchowego porównania , które zwraca wartość True wtedy i tylko wtedy, gdy wszystkie zaangażowane porównania zwracają wartość True .
Na przykład liczba całkowita 94536 powoduje wyrażenie
6++3==5++4==9++0
, które daje wartość True po ocenie, ponieważ wszystkie terminy mają sumę 9 . Tak jak poprzednio program kończy się normalnie.Z drugiej strony liczba całkowita 17263 powoduje wyrażenie
3==6++2==7++1++0
, które daje Fałsz, gdy jest oceniane, ponieważ terminy mają sumy 3 , 8 i 8 . Tak jak poprzednio, program kończy działanie z błędem.źródło
Brachylog , 13 bajtów
Wypróbuj online!
Wyjaśnienie
~c
najpierw zjednoczy się z największymi podlistami.źródło
Pyke, 18 bajtów
Wypróbuj tutaj!
źródło
PowerShell v2 +,
1006461 bajtówDosłownie jednowarstwowy, ponieważ jest to jeden potok. Pobiera dane wejściowe jako ciąg
$args[0]
. Pętle przechodzą przez nią jakochar
tablicę, każda iteracja umieszcza bieżący element za pomocą a+
lub-eq
przed nim na rurociągu w oparciu o to, czy bieżąca wartość jest-l
mniejsza niż lub wyższae
od poprzedniej wartości$i
. Te ciągi są-join
edytowane razem i przesyłane potokowo doiex
(skrót odInvoke-Expression
i podobne doeval
. Na przykład dla danych wejściowych2846145
zostanie to ocenione jako+2+8-eq4+6-eq1+4+5
, co oznaczaTrue
.To, że wartość logiczna jest pozostawiana w potoku i
True
/False
jest domyślnie zapisywana po zakończeniu programu.NB - w przypadku wprowadzania jednocyfrowego cyfra wynikowa pozostaje w potoku, co jest prawdziwą wartością w programie PowerShell.
Przykłady
źródło
GNU sed 217 lub 115
Oba zawierają +1 dla -r
217:
Pobiera dane w normalnym systemie dziesiętnym
Wypróbuj online!
115:
Pobiera dane wejściowe jako rozdzieloną przecinkami listę cyfr w unarnych. np.
123
byłoby1,11,111
Wypróbuj online!
źródło
Perl, 38 + 3 (
-p
) = 41 bajtów-9 bajtów dzięki @Ton Hospel !
Ponieważ istnieje
$'
, kod musi znajdować się w pliku, aby go uruchomić.-p
Liczy się więc 3 bajty. Zwraca 1, jeśli liczba jest liczbą Dennisa 2.0 lub pusty ciąg znaków w przeciwnym razie:źródło
s%.%2x$&.($&.O ge$')%eg;$_=/^(2+1)\1*$/
-p
$'
A
jest znacznie lepsze! Dzięki! Nie rozumiem.O
jednak ... Bez tego nie udaje się w niektórych przypadkach, ale nie rozumiem, dlaczego.$'
jest następną cyfrą i wszystkie po niej. Więc np778
. Porównuje,7
z78
którąlt
wygląda jak rosnąca sekwencja. DoO
przerwy i że porównuje7O
się78
(cokolwiek powyżej9
w pracach ASCII)$' or $
„zamiast moich grup przechwytywania, ale nie mogłem go znaleźć z tego powodu„ i tych wszystkich po nim ”. Dzięki za wskazówkę!~$&le~$'
powinna być o 1 krótszaJavaScript (ES6),
666563 bajtówZaoszczędzono 2 bajty dzięki @ edc65
Pobiera dane wejściowe jako ciąg. Stara wersja (działa tylko w przeglądarce Firefox 30+):
źródło
[...x,0]
->[...x,p=t=z=0]
Mathematica, 38 bajtów
Funkcja anonimowa. Pobiera liczbę jako dane wejściowe i zwraca
True
lubFalse
dane wyjściowe.źródło
Brachylog 2, 10 bajtów, wyzwanie dotyczące postdatacji języka
Wypróbuj online!
Jest to w zasadzie ten sam algorytm, co odpowiedź @ Fatalize (której nie widziałem, dopóki nie napisałem tego), ale zmienił się nieco, aby uczynić go bardziej golfowym zgodnie ze składnią Brachylog 2.
Jest to pełny program, zwracany,
false.
jeśli nie jest to numer Dennis 2.0 lubtrue
jeśli jest.Wyjaśnienie
Jak zwykle w przypadku pełnego programu Brachylog, jeśli wszystkie twierdzenia można spełnić jednocześnie, otrzymamy prawdziwy zwrot, w przeciwnym razie falsey. Domyślna kolejność
~c
to sortowanie partycji z mniejszą liczbą dłuższych elementów w pierwszej kolejności, aw Prologu (a więc Brachylog), domyślna kolejność jest zdefiniowana przez pierwszy predykat w programie (użycie drugiego jako rozstrzygnięcia itd.; Tutaj~c
dominuje, ponieważẹ
jest deterministyczny i dlatego nie ma nic do zamówienia).źródło
MATL,
2423201816 bajtówZwraca prawdę o matrycy falsey
Wypróbuj online!
Gratulacje @Dennis!
Wyjaśnienie
źródło
&=
!PHP,
10810592 bajtówpobiera dane wejściowe z argumentu, kończy na z
0
liczbą Dennis-2.0, z1
innym.awaria
źródło
05AB1E , 18 bajtów
Wyjaśnienie
N = 12012
użyty jako przykład.Wypróbuj online!
źródło
Ruby 2.3, 56 bajtów
Niemal na pewno nie jest to najbardziej golfowy sposób na zrobienie tego, ale pokazuje kilka fajnych funkcji językowych.
(Nie toleruje nowej linii, więc uruchom jak
ruby dennis2.rb <<< '12012'
)źródło
PHP, 144 bajty
Jestem pewien, że jest o wiele mądrzejszy (i krótszy) sposób, aby to zrobić, ale na razie się sprawdzi.
źródło
Python 2, 69 bajtów
Pobiera dane wejściowe jako ciąg.
Wyjaśnienie:
dawny
1201212012
Konwertuje na listę sum:
1+2,0+1+2,1+2,0+1+2,
Ewaluuje i konwertuje na set.
set([3])
Jeśli długość zestawu wynosi 1, wszystkie kwoty są takie same.
źródło
JavaScript (ES6), 58
Stosując moją rzadko przydatną wskazówkę https://codegolf.stackexchange.com/a/49967/21348
Skanuje ciąg znaków char, identyfikując ciąg rosnących znaków, na końcu każdego rumu sprawdza, czy suma jest zawsze taka sama
Test
źródło
Pyth , 20 bajtów
Dwie wersje
Wypróbuj pierwszy online!
Wypróbuj drugą online!
źródło
Rubin,
11710585 bajtówZwróciłoby to liczbę całkowitą tego numeru dennis lub,
nil
jeśli nie, liczbę dennis. Wszystkie liczby całkowite będą uważane za rubinowe równieżnil
za fałszywe.i
jest liczbą całkowitą, która jest sprawdzana.Trzecia wersja faktycznie powraca
true
ifalse
.PS przetestowano, aby zwrócić 172 liczby całkowite od 1 do 1000, jak w odpowiedzi.
źródło
APL, 23 bajty
Wyjaśnienie:
N←⍎¨⍕⍵
: pobierz poszczególne cyfry z wejścia, zapiszN
N⊂⍨1,2>/N
: znajdź podlisty ściśle rosnącej liczby wN
+/↑
: zsumuj każdą podlistę1=≢∪
: sprawdź, czy wynikowa lista zawiera tylko jeden unikalny elementźródło
Dodaj ++ , 109 bajtów
Wypróbuj online!
Jak to działa
€
[1 2 0 1 2 2]
źródło