Mój przyjaciel i ja pracowaliśmy w laboratorium na naszej zajęciach z informatyki AP i postanowiliśmy zakodować jeden z problemów, ponieważ nadal mieliśmy połowę zajęć po zakończeniu. Oto pytanie:
Biorąc pod uwagę liczbę n, czy n jest podzielne przez każdą z jej cyfr?
Na przykład 128 przejdzie ten test - dzieli się go przez 1,2 i 8. Wszelkie liczby z zerem automatycznie dyskwalifikują liczbę. Chociaż możesz używać innych języków i publikować w nich rozwiązania, jeśli chcesz, najbardziej interesuje nas to, jak kompaktowi ludzie mogą tworzyć program w Javie, ponieważ jest to język, którego używamy w klasie. Jak dotąd oboje mamy 51. Oto mój obecny kod:
public boolean dividesSelf(int n){for(int p=n;n%10>0;)n/=p%(n%10)>0?.1:10;return n<1;}
// 51 characters
// Breakdown:
// for(int p=n; Saves one semicolon to put declaration into for loop
// n%10>0;) Basic check-for-zero
// n/= Pretty simple, discarding one number off of n at a time
// p%(n%10)>0? If p (the given value) is not divisible by n%10 (the current digit)...
// .1:10; Divide by .1 (multiply by 10) so it fails the check next iteration. If it is divisible, divide by 10 to truncate the last digit
// return n<1 If the number was fully divisible, every digit would be truncated, and n would be 0. Else, there would still be non-zero digits.
Wymagania
Podpis metody może być dowolny. Po prostu policz ciało funkcji. Upewnij się jednak, że metoda zwraca wartość logiczną i przekazuje tylko jeden parametr numeryczny (nie ciąg znaków).
Kod musi być w stanie przekazać wszystkie te przypadki (aby zachować zgodność z kierunkami pierwotnego pytania, tylko logiczne wartości prawda i fałsz liczą się, jeśli język obsługuje wartości logiczne. Jeśli i tylko wtedy, gdy twój język nie ma zmiennych boolowskich, ty może reprezentować false z 0 i true z dowolną niezerową liczbą całkowitą (najlepiej 1 lub -1):
128 -> true
12 -> true
120 -> false
122 -> true
13 -> false
32 -> false
22 -> true
42 -> false
212 -> true
213 -> false
162 -> true
204 -> false
Nie liczyliśmy też spacji, więc możesz zrobić to samo, chyba że spacja jest niezbędna do działania programu (więc nowe wiersze w Javie się nie liczą, ale jedna spacja między int
i x=1
ma znaczenie.) Powodzenia !
true
ifalse
czy wartości prawdy / fałszu również są w porządku? 3.java
Znacznik tak naprawdę nie ma tu zastosowania, ponieważ samo wyzwanie nie jest związane z Javą.0
cyframi będąca wielokrotnością każdej z nich), wyobrażam sobie, że większość odpowiedzi wydłużyłaby się w nieciekawy sposób, aby włączyć sprawdzenie. Dlatego bardziej podoba mi się problem związany z tytułem (podzielny przez cyfry, a nie wielokrotność jego cyfr, co wyklucza 0).Odpowiedzi:
Perl 6, 13
Używa zmiennej niejawnej
$_
-$_ %% .comb.all
jest równoważne z$_ %% all($_.comb)
.%%
jest operatorem „jest podzielna” icomb
bez dodatkowego argumentu zwraca listę znaków w ciągu. Na przykład, jeśli argument to 123, funkcja oceniaktóry jest
robi to automatyczne przeszukiwanie węzłów
który jest
co jest fałszem w kontekście logicznym, ponieważ jest to połączenie „wszystko” i wyraźnie nie wszystkie jego elementy są prawdziwe.
Powinno być możliwe wymuszanie wartości zwracanej
Bool
i ukrywanie połączenia przed obiektami wywołującymi poprzez utworzenie podpisu funkcjisub golf($_ --> Bool())
, ale koercje w podpisach funkcji nie działają jeszcze w Rakudo. Zwracana wartość jest nadal poprawnie prawdą lub fałszem, po prostu nie jestTrue
lubFalse
.źródło
Bool
prostu dodajso
na początku koduso$_%%.comb.all
.C # i System.Linq - 26/40
Zgodnie z regułami, nie licząc samej deklaracji metody.
Pokazując to po raz kolejny, C # jest najlepszym wyborem, gdy rozważa się Javę ... Żartuję, żartuję!
Niestety, ta funkcja (i wiele innych odpowiedzi) nie da poprawnych wyników dla negatywnych danych wejściowych. Możemy to naprawić, ale rozwiązanie traci wiele ze swojego uroku (i dorasta do 46 znaków):
Edycja : zgoliłem jedną postać z sugestią Tima.
Edycja : wraz z wprowadzeniem pełnoprawnych członków w C # 6 możemy to jeszcze bardziej ograniczyć, odcinając
return
:za łącznie 26 znaków (moim zdaniem
=>
nie powinno być więcej niż nawiasy klamrowe). Wersja obsługująca liczby ujemne może być podobnie skrócona.źródło
.0
? Nie potrzeba niczego poza modułem całkowitym.i % 0
zi
liczbą całkowitą dajeDivideByZeroException
.48d
jest taki sam jak48.0
, ale o jeden mniej znaków (d dla podwójnej).&
, ponieważ&
nie powoduje zwarcia - otrzymasz wyjątek dzielenia przez zero%
. Możemy to naprawić, czyniąc to podwójnym (zd
), ale potem znowu straciliśmy jedną postać.APL (
(najwyraźniej nawiasy się nie liczą)1311)Wyjaśnienie:
⍎¨⍕⍵
: oceń każdy znak w reprezentacji ciągu⍵
⍵|⍨
: dla każdego z nich znajdź jego modulo i⍵
0∧.=
: sprawdź, czy wszystkie są równe0
Przypadki testowe:
źródło
X%0
? bez rzucania?0|X
dajeX
.(0∧.=⍎¨∘⍕|⊢)
Python 2: 43 znaków
Sprawdza, czy liczba ma jakieś niezerowe reszty modulo swoje cyfry, i wysyła negację tego. Cyfry zerowe są dziwnie obsługiwane: ponieważ przetwarzanie
%0
powoduje błąd, cyfry0
są zastępowane przez.3
, co wydaje się zawsze dawać niezerowy wynik z powodu niedokładności liczb zmiennoprzecinkowych.Ciało funkcji ma 32 znaki.
źródło
Perl - 27 bajtów
Nie licząc podpisu funkcji, zgodnie z instrukcją.
Przykładowe użycie:
Przykładowe dane wyjściowe:
Rozwiązanie problemu: „Liczą się tylko logiczne wartości prawda i fałsz. Wartości prawda / falsey się nie liczą”.
Wyjścia:
„Prawda” i „Fałsz” są zdefiniowane jako
1
i""
.Erratum:
Jak słusznie zauważa Brad Gilbert , perl definiuje prawdę jako skalar, który jest jednocześnie liczbą całkowitą
1
i ciągiem"1"
, a fałsz jako skalar, który jest jednocześnie liczbą całkowitą0
i ciągiem""
.źródło
$_
:pop=~s///ger<1
. Nie wiem, czy PO się na to zgodzi1
i czy""
są to ważne wyniki. Jeśli nie, to można to naprawić dwoma dodatkowymi bajtami: wystarczy dodać|0
.perl -pe'$_=s/./!$&||$_%$&/ger<1|0'
ma 26 bajtów łącznie z flagą|0
i-p
. Nie musisz używać funkcji.dualvar(1,'1')
idualvar(0,'')
.SVIV
(int),SVNV
(double) iSVPV
(string).'abc'
jako liczby (zakładając, że maszuse warnings;
włączony.)CJam,
1110 bajtówDefiniuje nazwaną funkcję
F
i odrzuca blok ze stosu.Wypróbuj online.
Przypadki testowe
Jak to działa
źródło
JavaScript ES6,
393228 bajtówDzięki za sugestię core1024 zastąpienia
(""+v).split("")
z[...""+v]
i openorclose dla sugeruje użycieevery
funkcji.Odpowiedź obecnie nie zawiera jednego bitu mojego kodu: O
Poprzednie rozwiązanie
==""
nie jest poprawnym sposobem sprawdzenia, czy tablica jest pusta, ponieważ[""]==""
zwracatrue
, ale tablica gwarantuje, że zawiera niepusty łańcuch, więc działa tutaj.Reszta to dość standardowa konwersja typu skróconego w JavaScript.
źródło
(""+v).split("")
je[...""+v]
.every
metody?v=>[...""+v].every(x=>v%x<1)
;v=>![...""+v].some(x=>v%x)
v%0
zwraca,NaN
aNaN == false
więc w twoim przypadku numery zawierające 0, takie jak10
, mogą zwrócićtrue
.Java 8, 46 bajtów (treść metody)
Korzystanie z konwersji Jeroena Mosterta na podwójną lewę.
źródło
Pyth, 12 bajtów
To filtruje znaki w łańcuchu jako zero (
!vT
) lub brak dzielenia input (%vzvT
), a następnie logiczne nie z wynikowej listy.Wypróbuj tutaj.
źródło
Ruby, 44 bajty (treść funkcji: 37)
Prawdopodobnie ma potencjał do dalszej gry w golfa.
Dane wejściowe przejęte przez funkcję
f
. Przykładowe użycie:źródło
.to_i
na.hex
, ponieważ liczby jednocyfrowe są takie same w bazie 16, i możesz zmienić==0
na<1
.Python -
59504947 bajtówJestem pewien, że jest szybszy sposób ... no cóż.
Edycja - Podziękowania dla FryAmTheEggman za wskazówki dotyczące gry w golfa.
Edycja 2 - FryAmTheEggman równie dobrze mógł napisać to w tym momencie, ups
Edycja 3 - Ręce do góry, jeśli nawet nie wiedziałeś, że geneksy to coś. ...Tylko ja?
źródło
f=lambda n:all([c>'0'and 0==n%int(c)for c in`n`])
. I nie ma problemu :)all
metoda.1>n%int(c)
zadziała?all(c>'0'and 0==n%int(c)for c in`n`)
robi dokładnie to samo, z 2 znakami mniej, a nawet zapisuje przydział listy.Pyth 11
Łączy to odpowiedzi @ isaacg i @ xnor . Filtruje cyfry z wejścia, sprawdzając wartość
input % (eval(current_digit) or .3)
. Następnie sprawdza, czy wynikowy ciąg jest pusty, czy nie.Znalazłem kilka innych wariantów tej samej długości:
Wypróbuj online.
źródło
Bash + coreutils, 44 bajty
Pełna definicja funkcji to:
Nie jestem pewien, jak to ocenić, ponieważ normalnie funkcje powłoki używają jednego zestawu
{}
lub()
zawierają ciało funkcji. Znalazłem tutaj, że mogę również użyć podwójnego,(())
aby zawrzeć ciało funkcji, które powoduje rozszerzenie arytmetyczne, czego potrzebuję tutaj. Na razie liczę tylko jedną parę tych nawiasów - dalsza dyskusja na ten temat jest mile widziana.Wynik:
źródło
true
/false
?J - 14 znaków
Ciało funkcji jest częścią po
=:
. Jeśli chcemy zminimalizować liczbę znaków dla całej funkcji, jest to 15 znaków*/@(0=,.&.":|])
.,.&.":
to najkrótsza droga w J, aby rozwinąć liczbę jako liczbę cyfr dziesiętnych: przekonwertować na ciąg, oddzielić cyfry i przekonwertować każdą cyfrę z powrotem na liczbę.,.&.":|]
pobiera numer wejścia (]
) modulo (|
) z tych cyfr.0*/@:=
zwraca true, jeśli wszystkie wyniki były równe 0, w przeciwnym razie daje false.źródło
Java -
121102977978 bajtówWiem tylko, że to później zostanie zablokowane. No cóż.
Wrócę.
źródło
Haskell -
1005438Wciąż się uczę, krytyka jest doceniana
źródło
length
, są niepotrzebne. 2) Zastąpt
jego definicją. 3)elem y s
jest niepotrzebny. 4)/='0'
można przesunąć na lewy filtr zamiastelem y s
. 5) W tym przypadku/='0'
jest równoważne>'0'
, ponieważ każda litera jest cyfrą. 6) Wstawmod
backticks, aby stał się infix. 7) Umieść wszystko w jednym wierszu.s==filter(...)s
, powinieneś użyćall(...)s
. teraz, ponieważs
pojawia się tylko raz w wyrażeniu, możesz go zastąpić jego definicją i upuścićwhere
. zamiast tego==0
możesz użyć<1
.all(\y->...)$show x
przezand[...|y<-show x]
.CJam, 15 bajtów
Jest to blok, najbliższy funkcji w CJam. Liczę tylko ciało (tzn. Pomijając aparat ortodontyczny). Możesz użyć tego w następujący sposób:
Lub jeśli chcesz przetestować szereg danych wejściowych, możesz to zrobić
Blok pozostawia
0
(fałsz) lub1
(prawda) na stosie, aby wskazać wynik. (CJam nie ma typu logicznego.)Sprawdź to tutaj.
Wyjaśnienie:
Alternatywnie, również 15 bajtów
Wyjaśnienie
źródło
CJam, 15 bajtów
{}
jest najbliższą funkcją w CJam. Właśnie liczę treść tej funkcjiUżyj tego w ten sposób:
Aby uzyskać albo
1
(jeśli liczba jest podzielna), albo0
(jeśli liczba nie jest podzielna przez swoje cyfry).Wypróbuj online tutaj
Wyjaśnienie
źródło
Ab
rozdzielić cyfry? Wydaje się, że po prostu przekonwertował go na bazę 10. Ponadto, skąd% wie, aby modyfikować według liczby, a nie tylko następnej cyfry, ponieważ wydaje się, że następna cyfra będzie następna na stosie?128{ed_edAedbedf{ed_ed{ed%ed}1ed?ed}ed1edbed!ed}~
%
po prostu weź dwie ostatnie liczby (w tym przypadku) i oblicz mod. Dwie ostatnie liczby tutaj to rzeczywista liczba i cyfra (zawsze)C89, 43 bajty
C89 nie ma typu boolowskiego. Mam nadzieję, że to działa. Użyłem również drugiego parametru, aby przekazać kopię oryginalnego numeru przez stos, ale definicja może być dowolna. Aby uzyskać poprawny wynik, wystarczy wywołać funkcję o tej samej wartości dla obu parametrów (
d(128, 128)
).EDYCJA: Zastosowane sugerowane zmiany przez anonimowego użytkownika
źródło
C11 - 44 bajtów w ciele funkcyjnym
Kolejna wersja C, nierekurencyjna i bez wyjątku zmiennoprzecinkowego.
Działa to również w C ++, Javie i większości innych języków podobnych do C.
Edytowano, aby uwzględnić ulepszenie komentarza primo.
źródło
int n=i;for(;i%10>0&&n%(i%10)<1;i/=10);return i<1;
jeden bajt krótszy niż kod OP.Julia
322523Poprawiono za pomocą cyfr
Naprawiono również problem z liczbami ujemnymi
Stara metoda
Wszystkie cyfry dzielą się, jeśli suma wszystkich pozostałych wynosi 0. Podobnie jak inne, problem z liczbami ujemnymi.
Wynik
Ulepszona metoda obsługuje również BigInt
jednak
dlatego
źródło
C / C ++, 58 bajtów (44 w treści)
Wywołuje niezdefiniowane zachowanie (patrz komentarze)
true
ifalse
mają wartość 1 i 0, ale możesz dodać jeden znak do podpisu, aby zwrócić abool
.I dla zabawy, wersja rekurencyjna, która jest mniejsza, jeśli zezwolisz na wywołania formularza
r(128,128)
Edycja : teraz zabronione przez reguły:
C / C ++, 53 bajty (33 w treści)
źródło
R:
726765Funkcja
Dzięki @AlexA i @plannapus za oszczędności
Testowe uruchomienie
źródło
d=as.double(strsplit(toString(a),"")[[1]]);!(anyNA(a%%d)|sum(a%%d))
. :)paste(a)
zamiasttoString(a)
daje ten sam wynik.GNU Awk: 53 znaki
Policzona część:
Cała funkcja:
Ponieważ Awk nie ma wartości boolowskich, zwraca 1 tor true i 0 dla false.
źródło
JavaScript (ES6) 30
Funkcja z jednym parametrem numerycznym. Używając% i odejmowania, nie trzeba specjalnego przypadku „0”, ponieważ 0% 0 to NaN w JavaScript.
Edytuj Zapisano 1 znak dzięki DocMax
Dla zabawy, nadużywanie zasady nie liczenia podpisu funkcji, 4
Testuj w konsoli FireFox / FireBug
Wynik
źródło
of(t=n+'')
of t=n+''
PHP: 85 bajtów (64 bajty na ciele)
Aby ta funkcja działała, wystarczy przekazać ciąg znaków lub liczbę.
0
poprawnie zwróci false.Kod:
NIE USTAWAJ II PARAMETRU!
JavaScript: 76 bajtów (61 bajtów w treści)
Jest to przepisanie poprzedniej funkcji.
Niewiele zmieniło się między obiema wersjami.
Oto kod:
Polyglot: JavaScript + PHP 187
217bajty (7684 bajty bez płyty grzewczej):Dlaczego to zrobiłem?
Z powodu, a może dlatego, że mogę!
Zignoruj błąd w PHP: i tak działa!Nie jest już potrzebny, został naprawiony przez usunięcie 3 bajtów.
Oto arcydzieło:
Możesz uruchomić ten kod zarówno na konsoli, jak i na tłumaczu PHP!
Stara wersja:
źródło
Oktawa, 33 (39 łącznie z konfiguracją funkcji)
Korzystanie z konwersji numerycznej na macierz:
Podziel liczbę elementarnie przez macierz X, gdzie X jest tworzony przez konwersję liczby na ciąg i odejmowanie 48, aby ponownie przejść od wartości ASCII do liczb. Weź modulo 1, aby uzyskać część dziesiętną każdego podziału, potwierdź, że wszystkie są zerowe (jeśli jakieś są NaN z powodu / 0, suma będzie NaN, a zatem nie zero).
Przykładowe dane wejściowe przy użyciu www.octave-online.net:
Wynik:
źródło
f(123)
, który można podzielić przez 1, 2 i 3). Ale to działa dla podanych przypadków testowych.MATLAB - 39 znaków
źródło
BASH - 117 znaków
testy
źródło
PHP -
747164 znakówGra w golfa:
Mniej gra w golfa:
Wyniki testu:
(Kod)
(Wynik)
źródło