Czy to numer Lynch-Bell?

25

Otrzymasz dodatnią liczbę całkowitą (która nigdy nie będzie zawierać 0) jako dane wejściowe. Twoim zadaniem jest sprawdzenie, czy jest to numer Lynch-Bell, czy nie.

Liczba jest liczbą Lynch-Bell, jeśli wszystkie jej cyfry są unikalne, a liczba jest podzielna przez każdą z jej cyfr.

W rzeczywistości istnieje tylko 548 numerów Lynch-Bell, więc kodowanie na stałe jest możliwe, ale prawie na pewno będzie dłuższe.

126 jest liczbą Lynch-Bell, ponieważ wszystkie jego cyfry są unikalne, a 126 można podzielić przez 1, 2 i 6.

Możesz wygenerować dowolną wartość prawdy i fałszu.

Przykłady:

7 -> truthy
126 -> truthy
54 -> falsy
55 -> falsy
3915 -> truthy

To jest OEIS A115569 .

Okx
źródło
1
Związane z. (Pyta o wszystkie liczby zamiast stwarzać problem decyzyjny.)
Martin Ender
2
Czy mogę brać dane wejściowe jako ciąg?
TheLethalCoder
2
@TheLethalCoder Oczywiście możesz, to głupie pytanie.
Okx,
10
@Okx Nie wszystkie plakaty z wyzwaniami są tak elastyczne pod względem dozwolonych danych wejściowych, że zawsze warto zapytać.
TheLethalCoder

Odpowiedzi:

27

Mathematica, 42 bajty

0!=##&@@d&&##&@@((d=IntegerDigits@#)∣#)&

Myślę, że 0!=##&@@d&&##&@@jest nowy niski poziom czytelności dla Mathematica ...

Wyjaśnienie

Niektóre z podstawowych stosowanych tutaj cukru syntaktycznego:

  • & ma bardzo niski priorytet i zamienia wszystko, co z niego zostało, w funkcję bez nazwy.
  • &&jest tylko Andoperatorem.
  • # jest argumentem najbliższej obejmującej nienazwaną funkcję.
  • ##jest sekwencją wszystkich argumentów funkcji.
  • @jest notacją przedrostkową dla wywołań funkcji, tj f@x == f[x].
  • @@to Apply, który przekazuje elementy listy jako pojedyncze argumenty do funkcji, tj f@@{a,b,c} == f[a,b,c].

Z tym na uboczu ...

(d=IntegerDigits@#)

Powinno to być dość oczywiste: daje nam to listę cyfr dziesiętnych wejścia i zapisuje wynik d.

(...∣#)

Testuje to dane wejściowe pod kątem podzielności według każdej z jego cyfr (ponieważ jest to operator podzielności Listable). To daje nam listę Trues i Falses.

...&@@...

Stosujemy funkcję po lewej stronie do listy wartości logicznych, tak że każda wartość logiczna jest osobnym argumentem.

...&@@d

Stosujemy inną funkcję d, aby poszczególne cyfry podano jako osobne argumenty. Funkcja jest 0!=##&, tj . Sprawdza, czy wszystkie cyfry są odrębne (i że różnią się od nich, ale wynika to z wyzwania, a jeśli nie, to i tak nie byłby dzielnikiem). jest tak naprawdę tylko 1-bajtowym wygaszaczem przy korzystaniu z niego samego i działa, ponieważ istnieje 1-bajtowy element ( ), o którym wiemy, że nie jest obecny. Więc ta pierwsza rzecz sprawdza, czy cyfry są unikalne. Nazwijmy ten wynikUnequal[0, d1, d2, ...]00!=##&Unequal0U

...&&##

Ponownie, jest to naprawdę po prostu skrót And[U, ##]. Przy ##czym sekwencje Poszczególne wartości logiczne od wstępnego sprawdzianu podzielnosci są rozszerzył się na And, więc mamy , która sprawdza, że obie cyfry są wyjątkowe i każda cyfra dzieli wejście.And[U, d1∣n, d2∣n, ...]

Martin Ender
źródło
6
##&@@d&&##&@@? Co to w ogóle robi?
Okx,
@Okx Dodano wyjaśnienie.
Martin Ender
Czy możesz zostać zastąpiony 0!=przez 0<?
sergiol
@sergiol musiałbym posortować cyfry, aby to zrobić.
Martin Ender
Rzeczywiście nowa niska czytelność, zwykle Mathematica wygląda jak wiązka cukru składniowego wokół kilku nazw funkcji, które rozumiem, nie wiedziałam, że możesz zrobić program całkowicie z cukru: p (oczywiście, twoje doskonałe wyjaśnienie, pozwól mi zobaczyć że oczywiście nie jest to cukier, ale i tak imponujące!)
mbrig
11

Python 3 , 56 bajtów

lambda n:any(int(n)%int(x)for x in n)or len(n)>len({*n})

Wypróbuj online!

Dane wyjściowe, Falsejeśli jest to numer Lynch-Bell, w Trueprzeciwnym razie.

Pręt
źródło
1
Czy to jest wprowadzanie jako ciąg?
CalculatorFeline,
2
Ma to dwa problemy: 1) nie daje zgodnych z prawdą / falsey odpowiedzi, jak określono (tylko 4 bajty!); 2) zgłasza wyjątek na wejściu „10”. W przeciwnym razie bardzo miły i zwięzły!
CR Drost
@CalculatorFeline Tak.
CR Drost
@CRDrost 1) wyjście jest dobrze zdefiniowane, więc nie ma problemu (zwykle) 2) nigdy nie będzie 0wejścia
Rod
1
1) Mam na myśli problem, który polegał na tym, że poprosili o X, a ty go nie dałeś. 2) Ach, masz całkowitą rację, całkowicie mi tego brakowało.
CR Drost
8

Brachylog , 10 bajtów

≠g;?z%ᵐ=h0

Wypróbuj online!

Wyjaśnienie

≠             All digits are different
 g;?z         Zip the input with each of its digits
     %ᵐ       Map mod
       =      All results are equal
        h0    The first one is 0
Fatalizować
źródło
6

C #, 87 83 bajtów

using System.Linq;s=>s.Distinct().Count()==s.Length&s.All(c=>int.Parse(s)%(c-48)<1)

Napisałem to w notatniku przed testem w Visual Studio, gdzie działało dobrze, więc właśnie zdałem sobie sprawę, że jestem teraz na takim poziomie nerd ...

Pełna / sformatowana wersja:

using System;
using System.Linq;

class P
{
    static void Main()
    {
        Func<string, bool> f = s => s.Distinct().Count() == s.Length
                                  & s.All(c => int.Parse(s) % (c - 48) < 1);

        Console.WriteLine(f("7"));
        Console.WriteLine(f("126"));
        Console.WriteLine(f("54"));
        Console.WriteLine(f("55"));
        Console.WriteLine(f("3915"));

        Console.ReadLine();
    }
}
TheLethalCoder
źródło
5
Obligatory xkcd
Sanchises
6

JavaScript (ES6), 42 41 bajtów

s=>![...s].some((e,i)=>s%e|s.search(e)<i)

Pobiera dane wejściowe jako ciąg znaków i zwraca truelub falseodpowiednio. Edycja: Zapisano 1 bajt dzięki @RickHitchcock. Inne wersje:

Pobiera dane wejściowe jako ciąg i zwraca 0lub 1(tj. Logiczną odwrotność) dla 40 bajtów:

s=>/(.).*\1/.test(s)|[...s].some(e=>s%e)

Pobiera dane wejściowe jako liczbę i zwraca 0lub 1dla 43 bajtów:

n=>/(.).*\1/.test(n)|[...''+n].some(e=>n%e)

Pobiera dane wejściowe jako liczbę i zwraca 1lub 0dla 45 bajtów:

n=>!/(.).*\1/.test(n)&![...''+n].some(e=>n%e)
Neil
źródło
Nie byłem zaznajomiony z opcją \ n dla odwoływania się wstecz. +1. Możesz przenieść logikę testową na jakąś metodę, aby zapisać bajt:s=>![...s].some((e,i)=>s%e|s.search(e)<i)
Rick Hitchcock
Kiedy użyłem [...new Array(9999999)].map((_,n)=>n+1+"").filter(s=>![...s].some((e,i)=>s%e|s.search(e)<i)).length, dostałem 5081zamiast oczekiwanego 548, więc nie jest to poprawne, jak napisano. Jednak naprawdę napięty kod.
CR Drost
Przepraszamy, wycofuję swój komentarz na temat tego, że to nieprawda. Mój kod testowy jest nieprawidłowy, ponieważ oryginalny plakat oczekuje, że zera zostały już odfiltrowane. Z dodatkowym .filter(x => x.indexOf('0')===-1)zwraca 548 zgodnie z obietnicą.
CR Drost
6

Galaretka , 6 4 bajtów

Dg⁼Q

Wypróbuj online!

Jak to działa

Dg⁼Q  Main link. Argument: n

D     Decimal; convert n to base 10.
 g    Take the GCD of each decimal digit k and n.
      For each k, this yields k if and only if k divides n evenly.
   Q  Unique; yield n's decimal digits, deduplicated.
  ⁼   Test the results to both sides for equality.
Dennis
źródło
3
Jest również, gQV=jeśli wolisz rozwiązanie tylko ASCII.
Dennis
5

Python 3 , 54 bajty

Zwraca, Falsegdy liczba jest liczbą Lynch-Bell. Pobiera ciągi jako dane wejściowe. Sam sobie wymyśliłem, ale bardzo podobny do Rod. Skomentowałbym pod jego postem, ale nie mam jeszcze reputacji.

lambda s:len({*s})<len(s)+any(int(s)%int(c)for c in s)

Wypróbuj online!

C McAvoy
źródło
2
Witamy w PPCG!
Stephen
Witamy! Podobnie jak Rod's, twoja funkcja zgłasza wyjątek na wejściu „10”.
CR Drost
1
@CRDrost „Otrzymasz jako liczbę dodatnią liczbę całkowitą (która nigdy nie będzie zawierać 0)”.
C McAvoy,
Zgadza się, zamieściłem komentarze wszędzie, na co narzekałem, ale najwyraźniej tęskniłem. Przepraszamy, wycofano!
CR Drost
@CRDrost Nie martw się!
C McAvoy,
2

PHP, 62 48 bajtów

while($i=$argn[$k++])$r|=$argn%$i|$$i++;echo!$r;

Uruchom jako potok -nRlub przetestuj go online . Puste wyjście dla fałszu, 1dla prawdy.

awaria

while($i=$argn[$k++])   # loop through digits
    $r|=                    # set $r to true if
        $argn%$i            # 1. number is not divisible by $i
        |$$i++;             # 2. or digit has been used before
echo!$r;                # print negated $r
Tytus
źródło
2

Haskell , 61 bajtów

(#)=<<show
(d:r)#n=notElem d r&&mod n(read[d])<1&&r#n
_#_=0<3

Wypróbuj online!

Definiuje anonimową funkcję, (#)=<<showktóra po podaniu liczby zwraca Truelub False.

Laikoni
źródło
Ta funkcja nie działa na wejściu 10.
CR Drost
Przykro mi, że się mylę - spóźniłem się z tym, że nie musisz udzielać odpowiedzi na dane wejściowe z zerami.
CR Drost
1

Mathematica, 57 bajtów

Tr@Boole[IntegerQ/@Union[s=#/IntegerDigits@#]]==Length@s&
J42161217
źródło
1
Możesz zaoszczędzić wiele bajtów, jeśli używasz wbudowanegoIsLynchBellNumber
Okx
1
dlaczego nie złożysz tej samej oferty Martinowi?
J42161217
@Okx, ale w ten sposób jest mniej zabawy.
QBrute
@QBrute Czy możesz żartować?
Okx
1
@Okx Byłoby bardziej wiarygodne jako LynchBellNumberQ. ;)
Martin Ender
1

Python 2 , 66 bajtów

Jest to rozwiązanie w Pythonie 2, którego Truejedynym celem jest wyjście w prawdę i Falsefałsz:

lambda n:len(set(n))==len(n)and not any((int(n)%int(x)for x in n))

Wypróbuj online!

Pan Xcoder
źródło
1

Haskell, 260 241 201 162 bajtów

f([x])=1<2
f(x:xs)=not(x`elem`xs)&&(f xs)
r n i= n`mod`(read[(show n!!i)]::Int)==0
q n 0=r n 0 
q n i=r n i&&q n(i-1)
p n=length(show n)-1
s n=q n(p n)&&f(show n)

Wyjaśnienie

f ([x]) = True                                           f function checks for                                                       
f (x:xs) = not(x `elem` xs) && (f xs)                    repeated digits              
r n i = n `mod` (read [(show n !! i)] :: Int) == 0       checks whether num is 
                                                         divisible by i digit
q n 0 = r n 0                                            checks wether n divisible
q n i = r n i && q n (i-1)                               by all of its digits                             
p n = length (show n) -                                  gets length of number                             
s n = (q n (p n)) && (f (show n))                        sums it all up!!!

Znacząco skróciłem dzięki do Laikoni

Sergii Martynenko Jr
źródło
1
Witamy w szczególności w PPCG i Haskell! Odpowiedź można znacznie skrócić, usuwając zbędne spacje, np. Wokół znaków równości lub obok nawiasów.
Laikoni
@Laikoni Thanx za radę! Patrzę na to
Sergii Martynenko Jr 5'17
1

Japt , 15 14 11 10 9 bajtów

ì®yUÃ¥Uìâ

Spróbuj

Kudłaty
źródło
©!-> «dla -1 bajtów
Justin Mariner
Dzięki, @JustinMariner; nie wiem, jak to poszło tak długo, że nie został zauważony! Znalazłem jednak krótsze rozwiązanie.
Shaggy
0

Neim , 9 bajtów

𝐮ℚ₁𝐅₁𝕌₁ℚ𝕒

Wypróbuj online!

-2 dzięki Okx .

Hmm, jest ładna symetria ... oO.O.O.Oo

Erik the Outgolfer
źródło
Można golfa 𝐂D𝐮𝔼do 𝐮ℚ(uniquify, sprawdź równości ignorując typów)
Okx
Jest jeszcze miejsce na
grę
@Okx Hmm ... Nie widzę tam nic szczególnie interesującego.
Erik the Outgolfer
0

Perl 6 , 27 bajtów

{$_%%.comb.all&&[!=] .comb}

Wypróbuj online!

  • .combjest metodą, która bez podania argumentów dzieli łańcuch na poszczególne znaki. Liczba jest domyślnie konwertowana na ciąg, a zatem .combzwraca jej cyfry.
  • .comb.all jest połączeniem wszystkich cyfr.
  • $_ %% .comb.alljest łącznikiem podzielności argumentu wejściowego $_przez wszystkie jego cyfry. Na przykład, jeśli $_jest 123, skrzyżowanie to all(True, False, True), które zapada się Falsew prawdziwym kontekście.
  • [!=] .combredukuje cyfry argumentu wejściowego z !=operatorem, który ocenia, Trueczy wszystkie cyfry są różne.
Sean
źródło
0

Siatkówka , 37 bajtów

(.).*\1
0
.
<$&$*1>$_$*
<(1+)>\1+

^$

Wypróbuj online! Link zawiera przypadki testowe. Objaśnienie: Pierwszy etap zastępuje każdą zduplikowaną cyfrę cyfrą zero. Drugi etap zastępuje każdą cyfrę jej jednoznaczną reprezentacją, po której następuje jednoznaczna reprezentacja oryginalnego numeru. Trzeci etap oblicza następnie pozostałą część pierwotnej liczby przez każdą niezerową cyfrę. Jeśli numer jest numerem Lynch-Bell, spowoduje to usunięcie wszystkiego i zostanie to przetestowane na ostatnim etapie.

Neil
źródło
0

Ruby 2.4, 42 bajty

->x{(r=x.digits)|[]==r&&r.none?{|f|x%f>0}}

(Jeszcze nie ma TIO, przepraszam)

GB
źródło
0

CJam, 17 bajtów

CJam to Java języków golfowych. Jest nawet interpretowany w Javie!

{_Ab__L|=@@f%:+>}

Wyjaśnienie:

{   e# Stack:              3915
_   e# Duplicate:          3915 3915
Ab  e# Digits in base 10:  3915 [3 9 1 5]
__  e# Duplicate twice:    3915 [3 9 1 5] [3 9 1 5] [3 9 1 5]
L|  e# Remove duplicates:  3915 [3 9 1 5] [3 9 1 5] [3 9 1 5]
=   e# Test equality:      3915 [3 9 1 5] 1
@@  e# Rotate twice:       1 3915 [3 9 1 5]
f%  e# Modulo each:        1 [0 0 0 0]
:+  e# Sum:                1 0
>   e# Greater than:       1
}   e# Output:             1 (truthy)
Esolanging Fruit
źródło
0

VBScript, 177 bajtów

Cześć wszystkim, to mój pierwszy post w CG i pierwsza próba, więc mam nadzieję, że przestrzegałem wszystkich zasad ...

Function L(s)
dim i,j,k,m,n
j = Len(s)
redim a(j)
n = 0
for i = 0 to j-1
   A(i) = Mid(s,i+1,1)   
   m = m + s Mod A(i)   
   if j = 1 then         
   else                             
        for k = 0 to i - 1        
            if A(i)  = A(k) then n = n + 1   
        next
   end if
next
if m + n = 0 then L = "y" else L = "n"
End Function

Można to uruchomić z Notatnika, dodając wiersz na końcu

Msgbox L(InputBox(""))

A następnie zapisujesz go jako .vbs, a następnie kliknij dwukrotnie.

Wyjaśnienie:

Function L(s)                  'creates the function "L" taking test number as input
dim i,j,k,t,m,n                'variables
j = Len(s)                     '"j" gets length of test number
redim a(j)                     'creates array "a", size is length of test number 
n = 0                          'sets repeat character counter "n" to zero
for i = 0 to j-1               'for length of string
   A(i) = Mid(s,i+1,1)         'each array slot gets one test number character
   m = m + s Mod A(i)          '"m" accumulates moduli as we test divisibility of each digit
   if j = 1 then               'if test number is of length 1, it passes (do nothing)
   else                        'otherwise, gotta test for repeats     
        for k = 0 to i - 1     'for each digit already in array, test against current digit   
            if A(i)  = A(k) then n = n + 1  
                               'repeat char counter "n" stores no of repeats  
        next                   'proceed through array looking for repeat  
   end if
next                           'test next digit for divisibility and repeats
if m + n = 0 then L = "y" else L = "n"      
                               'check for any repeats and moduli,
                               'then return yes or no for LynchBelledness
End Function

VBScript jest trochę tępym narzędziem do gry w golfa, ale hej, jeszcze się nie nauczyłem Ruby ...

aaaa aaaa
źródło
Nie możesz usunąć niektórych białych znaków, takich jak „L =” y ”
Okx
Technicznie tak! Powinienem to zrobić ... btw, patrzę na języki codegolf, które mogą być fajne do nauki, ale dla większości dokumentacja jest minimalna do nieistniejącej ... czy ktoś może polecić dobry język, który jest dobrze udokumentowany? Próbowałem „Właściwie / Poważnie”, ale natrafiłem na przeszkody z powodu braku dokumentów ....
aAaa aAaa
0

PHP , 51 bajtów

wypisuje zero dla true i jeden dla false

for(;$c=$argn[$i++];$$c=1)$t|=$$c||$argn%$c;echo$t;

Wypróbuj online!

PHP , 62 bajty

wypisuje zero dla true i jeden dla false

for($a=$argn;$c=$a[$i];)$t|=strpos($a,$c)<+$i++||$a%$c;echo$t;

Wypróbuj online!

Jörg Hülsermann
źródło
0

Pyth , 10 bajtów

qiRQKjQT{K

Sprawdź wszystkie przypadki testowe.

W jaki sposób?

qiRQKjQT {K ~ Pełny program.

     jQT ~ Lista cyfr dziesiętnych wejścia.
    K ~ Przypisz do zmiennej K.
 iRQ ~ Dla każdej cyfry dziesiętnej ...
 i Q ~ ... Uzyskaj największy wspólny dzielnik z samym wejściem.
        {K ~ K ze zduplikowanymi elementami usuniętymi.
q ~ jest równy? Wynik niejawnie.

Pyth , 11 bajtów

&!f%sQsTQ{I

Sprawdź wszystkie przypadki testowe.

W jaki sposób?

&! f% sQsTQ {I ~ Pełny program, z niejawnym wejściem.

  f Q ~ Filtruj po ciągu wejściowym.
   % sQsT ~ Dane wejściowe są konwertowane na liczbę całkowitą modulo bieżącej cyfry.
             ~ Zachowuje ją, jeśli jest wyższa niż 0, i odrzuca ją w inny sposób.
 ! ~ Negacja. Jeśli lista jest pusta, zwraca True, w przeciwnym razie False.
& {I ~ A czy dane wejściowe są niezmienne w deduplikacji? Wynik niejawnie.
Pan Xcoder
źródło
0

Perl 5 , 34 bajtów

33 bajty kodu + 1 dla -pflagi

$n=$_;$\|=$n%$_|$k{$_}++for/./g}{

Wypróbuj online!

Wyjścia 0dla prawdy, każda inna liczba dla fałszu

Xcali
źródło
0

Kotlin 1.1, 98 66 59 bajtów

{i->i.none{i.toInt()%(it-'0')>0}&&i.length==i.toSet().size}

Upiększony

{i ->
    // None of the digits are not factors
    i.none { i.toInt() % (it-'0') > 0 }
    // AND
    &&
    // None of the digits are repeated
    i.length == i.toSet().size
}

Test

var L:(String)-> Boolean =
{i->i.none{i.toInt()%(it-'0')>0}&&i.length==i.toSet().size}
data class TestData(val input: String, val output: Boolean)

fun main(args: Array<String>) {
    var inputs = listOf(
        TestData("7", true),
        TestData("126", true),
        TestData("54", false),
        TestData("55", false),
        TestData("3915", true)
    )

    for (test in inputs) {
        if (L(test.input) != test.output) {
            throw AssertionError(test.toString())
        }
    }
    println("Test Passed")
}
jrtapsell
źródło
0

APL (Dyalog Unicode) , 24 bajty

{((,⍵)≡∪⍵)×∧/0=(⍎¨⍵)|⍎⍵}

Wypróbuj online!

Prosty Dfn, prawdopodobnie można go nieco pograć w golfa. Wydaj standardowe boolany APL 1 dla prawdy, 0 dla fałszu.

Warto wspomnieć, że funkcja przyjmuje argumenty raczej jako ciągi niż ints.

W jaki sposób:

{((,⍵)≡∪⍵)×∧/0=(⍎¨⍵)|⍎⍵}  Dfn, argument ⍵.
                      ⍎⍵   Convert  to integer
                     |     Modulus
                (⍎¨⍵)      Each digit in 
              0=           Equals 0? Returns a vector of booleans
            ∧/             Logical AND reduction
           ×               multiplied by (the result of)
  (     ∪⍵)                unique elements of 
                          Match
   (,⍵)                     as a vector; the Match function then returns 1 iff all digits in  are unique
J. Sallé
źródło
0

Julia 1.0 , 39 bajtów

f(x,d=digits(x))=rem.(x,d)==0*unique(d)

rem.(x,d)to wektor zawierający resztę po podzieleniu x przez każdą cyfrę x. 0*unique(d)jest wektorem o długości równej liczbie unikalnych cyfr ze wszystkimi wartościami zerowymi. Sprawdź, czy są równe.

Wypróbuj online!

gggg
źródło
0

ruby -n , 40 bajtów

p gsub(/./){$'[$&]||$_.to_i%$&.hex}<?0*8

Wypróbuj online!

Wczytaj liczbę jako ciąg. Zastąp każdy znak (cyfrę) kolejnym wystąpieniem tego znaku, jeśli występuje, lub liczbą całkowitą modulo tej cyfry. Spowoduje to ciąg znaków tylko 0wtedy i tylko wtedy, gdy jest to numer Lynch-Bell. Czemu? Jeśli występuje powtarzająca się cyfra, każde wystąpienie ostatniej pozostaje takie samo, a ponieważ dane wejściowe nie zawierają zer, oznacza to niezerową cyfrę. W przeciwnym razie sprawdzamy tylko, czy każda cyfra równomiernie dzieli liczbę.

Ponieważ nie ma 8-lub więcej cyfr liczb Lynch-Bell (dowód formalny: OEIS tak mówi), sprawdzenie, czy wynikowy ciąg znaków jest leksykograficznie wcześniejszy niż ciąg znaków, '00000000'jest równoważny sprawdzeniu, czy wszystkie zera.

histocrat
źródło
0

R , 86 bajtów

x=scan(,'');a=as.double;all(table(utf8ToInt(x))==1)&&all(!a(x)%%a(el(strsplit(x,""))))

Pobiera dane wejściowe jako ciąg. Z pewnością czuję, że można grać w golfa.

Wypróbuj online!

Sumner18
źródło