É um número da Lynch-Bell?


25

Você receberá um número inteiro positivo (que nunca conterá um 0) como entrada. Sua tarefa é verificar se é um número Lynch-Bell ou não.

Um número é um número Lynch-Bell se todos os seus dígitos forem exclusivos e o número for divisível por cada um dos dígitos.

Na verdade, existem apenas 548 números da Lynch-Bell, então a codificação é uma possibilidade, mas quase certamente será mais longa.

126 é um número de Lynch-Bell porque todos os seus dígitos são únicos e 126 é divisível por 1, 2 e 6.

Você pode gerar qualquer valor verdadeiro e falso.

Exemplos:

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

Este é o OEIS A115569 .


1
Relacionado. (Pede para todos os números em vez de constituir um problema de decisão.)
— Martin Ender

2
Posso receber a entrada como uma string?
— TheLethalCoder

2
@TheLethalCoder Claro que você pode, essa é uma pergunta boba.
— Okx 04/07/19

10
@Okx Nem todos os pôsteres de desafios são tão flexíveis nas entradas permitidas quanto você sempre merece uma pergunta.
— TheLethalCoder

Respostas:


27

Mathematica, 42 bytes

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

Eu acho que 0!=##&@@d&&##&@@é uma nova baixa legibilidade para o Mathematica ...

Explicação

Alguns dos açúcares sintáticos básicos usados ​​aqui:

  • & tem precedência muito baixa e transforma tudo o que resta dele em uma função sem nome.
  • &&é apenas o Andoperador.
  • # é o argumento da função sem nome que o encerra mais próxima.
  • ##é uma sequência de todos os argumentos da função.
  • @é uma notação de prefixo para chamadas de função, ie f@x == f[x].
  • @@é Apply, que passa os elementos de uma lista como argumentos individuais para uma função, ie f@@{a,b,c} == f[a,b,c].

Com isso fora do caminho ...

(d=IntegerDigits@#)

Isso deve ser bastante auto-explicativo: isso nos fornece uma lista dos dígitos decimais da entrada e armazena o resultado d.

(...∣#)

Isso testa a entrada quanto à divisibilidade de cada um de seus dígitos (porque o operador de divisibilidade é Listable). Isso nos dá uma lista de Trues e Falses.

...&@@...

Aplicamos a função no lado esquerdo à lista de booleanos, de modo que cada booleano seja um argumento separado.

...&@@d

Aplicamos outra função a d, para que os dígitos individuais sejam dados como argumentos separados. A função é 0!=##&, ie . Ele verifica se todos os dígitos são distintos (e que são distintos, mas isso é dado pelo desafio e, se não fosse, não seria um divisor de qualquer maneira). é realmente apenas uma economia de 1 byte no uso de si mesmo, e funciona porque há um elemento de 1 byte ( ) que sabemos que não está presente. Portanto, essa primeira coisa verifica se os dígitos são únicos. Vamos chamar esse resultadoUnequal[0, d1, d2, ...]00!=##&Unequal0U

...&&##

Novamente, isso é realmente apenas uma abreviação para And[U, ##]. Com ##sendo uma sequência, as booleans individuais a partir da verificação inicial divisibilidade são expandidos para o And, então temos que verifica que ambos os dígitos são únicas e cada dígito divide a entrada.And[U, d1∣n, d2∣n, ...]


6
##&@@d&&##&@@? O que isso faz?
— Okx 04/07/19

@Okx Adicionada uma explicação.
— Martin Ender

Pode ser que você pode substituir 0!=por 0<?
— sergiol

@sergiol Eu teria que classificar os dígitos para fazer isso.
— Martin Ender

De fato, com pouca legibilidade, normalmente o Mathematica parece um monte de açúcar de sintaxe em torno de alguns nomes de funções que eu consigo entender; eu não sabia que você poderia criar um programa inteiramente com o açúcar: p (claro, sua excelente explicação, deixe-me ver que o seu claro que não todo o açúcar, mas ainda assim, muito impressionante)!
— mbrig

11

Python 3 , 56 bytes

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

Experimente online!

Saída Falsese for um número Lynch-Bell, Truecaso contrário.


1
Isso está inserindo como uma string?
— CalculatorFeline

2
Isso tem dois problemas: 1) não fornece respostas verdadeiras / falsas conforme especificado (são apenas 4 bytes!); 2) lança uma exceção na entrada "10". Caso contrário, muito agradável e conciso!
— CR Drost

@CalculatorFeline Sim.
— CR Drost

@CRDrost 1) a ouput bem definidos para que haja nenhum problema (geralmente) 2) nunca haverá 0na entrada
— Haste

1
1) Quero dizer, há um problema: eles pediram o X e você não deu. 2) Ah, você está totalmente certo, eu perdi completamente isso.
— CR Drost

8

Braquilog , 10 bytes

≠g;?z%ᵐ=h0

Experimente online!

Explicação

≠             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

6

C #, 87 83 bytes

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

Eu escrevi isso no bloco de notas antes de testar no Visual Studio, onde funcionou bem, então percebi que agora eu sou esse nível de nerd ...

Versão completa / formatada:

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();
    }
}

5
— Xkcd

6

JavaScript (ES6), 42 41 bytes

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

Recebe a entrada como uma sequência e retorna trueou falseconforme apropriado. Edit: Salvo 1 byte graças a @RickHitchcock. Outras versões:

Recebe a entrada como uma string e retorna 0ou 1( ou seja, inverso lógico) por 40 bytes:

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

Pega a entrada como um número e retorna 0ou 1para 43 bytes:

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

Pega a entrada como um número e retorna 1ou 0para 45 bytes:

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

Eu não estava familiarizado com a opção \ n para referência remota. +1. Você pode mover a lógica de teste para o método some para salvar um byte:s=>![...s].some((e,i)=>s%e|s.search(e)<i)
— Rick Hitchcock

Quando usei [...new Array(9999999)].map((_,n)=>n+1+"").filter(s=>![...s].some((e,i)=>s%e|s.search(e)<i)).length, cheguei ao 5081invés do esperado 548, portanto, isso não está correto como está escrito. Código realmente apertado, no entanto.
— CR Drost

Desculpe, retiro meu comentário sobre isso não estar correto. Meu código de teste não está correto porque o pôster original espera que os zeros já tenham sido filtrados. Com um extra, .filter(x => x.indexOf('0')===-1)isso retorna 548 conforme prometido.
— CR Drost

6

Geléia , 6 4 bytes

Dg⁼Q

Experimente online!

Como funciona

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.

3
Também há gQV=se você preferir uma solução somente ASCII.
— Dennis

5

Python 3 , 54 bytes

Retorna Falsequando um número é um número Lynch-Bell. Toma seqüências de caracteres como entrada. Surgiu sozinho, mas muito parecido com o de Rod. Eu teria comentado sob o post dele, mas ainda não tenho nenhuma reputação.

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

Experimente online!


2
Bem-vindo ao PPCG!
— Stephen

Bem vinda! Como no Rod, sua função lança uma exceção na entrada "10".
— CR Drost

1
@CRDrost "Você receberá um número inteiro positivo (que nunca conterá um 0) como entrada."
— C McAvoy

Certo, publiquei comentários em todos os outros lugares em que reclamei, mas aparentemente perdi esse. Desculpe, retraído!
— CR Drost

@CRDrost Não se preocupe!
— C McAvoy


2

PHP, 62 48 bytes

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

Executar como tubo -nRou testá-lo on-line . Saída vazia por falsidade, 1por verdade.

demolir

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

2

Haskell , 61 bytes

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

Experimente online!

Define uma função anônima (#)=<<showque, dado um número, retorna Trueou False.


Esta função falha na entrada 10.
— CR Drost

Desculpe, estou errado sobre isso - perdi que você não precisa fornecer nenhuma resposta para entradas que tenham 0s nelas.
— CR Drost



1

Mathematica, 57 bytes

Tr@Boole[IntegerQ/@Union[s=#/IntegerDigits@#]]==Length@s&

1
Você pode salvar vários bytes se você usar o IsLynchBellNumber
— built

1
por que você não faz a mesma oferta a Martin?
— J42161217

@ Ok, mas é menos divertido assim.
— QBrute

@QBrute Você pode pegar uma piada?
— Okx 04/07/19

1
@ Ok teria sido mais crível como LynchBellNumberQ. ;)
— Martin Ender

1

Python 2 , 66 bytes

Esta é uma solução no Python 2, cujo objetivo é produzir Truepor verdade e Falsepor falsidade:

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

Experimente online!


1

Haskell, 260 241 201 162 bytes

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)

Explicação

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!!!

Reduziram significativamente o thanx para Laikoni


1
Bem-vindo ao PPCG e Haskell, em particular! Essa resposta pode ser consideravelmente reduzida, removendo espaços supérfluos, por exemplo, os que estão ao redor dos sinais de igual ou ao lado de parênteses.
— Laikoni 5/07

1
Você pode também estar interessado em Dicas para jogar golfe em Haskell e no Guia de regras de golfe em Haskell .
— Laikoni 5/07

@Laikoni Thanx pelo seu conselho! Eu estou procurando por isso
— Sergii Martynenko Jr



0

Perl 6 , 27 bytes

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

Experimente online!

  • .combé um método que, quando não recebe argumentos, divide uma string em seus caracteres individuais. Um número é implicitamente convertido em uma sequência e, portanto,.comb retorna seus dígitos.
  • .comb.all é uma junção e de todos os dígitos.
  • $_ %% .comb.allé uma junção e da divisibilidade do argumento de entrada $_por todos os seus dígitos. Por exemplo, se $_for 123, a junção é all(True, False, True), que cai paraFalse entra em em um contexto de verdade.
  • [!=] .combreduz os dígitos do argumento de entrada com o !=operador, que avalia Truese os dígitos são todos diferentes.

0

Retina , 37 bytes

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

^$

Experimente online! O link inclui casos de teste. Explicação: O primeiro estágio substitui qualquer dígito duplicado por um zero. O segundo estágio substitui cada dígito por sua representação unária, seguida pela representação unária do número original. O terceiro estágio calcula o restante da divisão do número original por cada dígito diferente de zero. Se o número for um número Lynch-Bell, isso excluirá tudo e será testado no estágio final.


0

Ruby 2.4, 42 bytes

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

(Nenhum TIO ainda, desculpe)


0

CJam, 17 bytes

CJam é o Java das linguagens de golfe. É até interpretado em Java!

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

Explicação:

{   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)

0

VBScript, 177 bytes

Olá a todos, este é o meu primeiro post em CG, e a primeira tentativa, então espero ter seguido todas as regras ...

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

Isso pode ser executado no bloco de notas adicionando uma linha no final

Msgbox L(InputBox(""))

E, em seguida, salve-o como .vbs e clique duas vezes.

Explicação:

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

O VBScript é um instrumento sem corte para o golfe, mas, ainda não aprendi Ruby ...


Você não pode remover alguns dos espaços em branco como 'L = 'y''
— Okx

Tecnicamente sim! Eu deveria ter feito isso ... btw, estou olhando para linguagens codegolf que podem ser legais de aprender, mas para a maioria, a documentação é mínima ou inexistente ... alguém pode recomendar uma boa linguagem que esteja bem documentada? Foi experimentar "Na verdade / Sério", mas acertar alguns obstáculos devido à falta de doc ....
— AAAA AAAA


0

Pitão , 10 bytes

qiRQKjQT{K

Verifique todos os casos de teste.

Quão?

qiRQKjQT {K ~ Programa completo.

     jQT ~ A lista de dígitos decimais da entrada.
    K ~ Atribuir a uma variável K.
 iRQ ~ Para cada dígito decimal ...
 i Q ~ ... Obtenha o maior divisor comum com a própria entrada.
        {K ~ K com os elementos duplicados removidos.
q ~ é igual? Saída implicitamente.

Pitão , 11 bytes

&!f%sQsTQ{I

Verifique todos os casos de teste.

Quão?

&! f% sQsTQ {I ~ Programa completo, com entrada implícita.

  f Q ~ Filtre a string de entrada.
   % sQsT ~ A entrada convertida em um número inteiro modula o dígito atual.
             ~ Mantém-no se for maior que 0 e o descarta.
 ! ~ Negação. Se a lista estiver vazia, retorna True, caso contrário, False.
& {I ~ E a entrada é invariável sob desduplicação? Saída implicitamente.

0

Perl 5 , 34 bytes

33 bytes de código + 1 para -psinalizador

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

Experimente online!

Saídas 0para verdade, qualquer outro número para falsidade


0

Kotlin 1.1, 98 66 59 bytes

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

Embelezado

{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
}

Teste

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")
}

0

APL (Dyalog Unicode) , 24 bytes

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

Experimente online!

Dfn simples, provavelmente pode ser jogado um pouco mais. Rendimento booleanos APL padrão 1 para verdade, 0 para falsidade.

Vale ressaltar que a função aceita os argumentos como strings em vez de ints.

Quão:

{((,⍵)≡∪⍵)×∧/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

0

Julia 1.0 , 39 bytes

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

rem.(x,d)é um vetor que contém os restantes depois de dividir x por cada dígito em x. 0*unique(d)é um vetor com comprimento igual ao número de dígitos únicos, com todos os valores zero. Verifique se são iguais.

Experimente online!


0

ruby -n , 40 bytes

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

Experimente online!

Leia o número como uma sequência. Substitua cada caractere (dígito) por uma ocorrência subsequente desse caractere, se presente, ou o número inteiro module esse dígito. Isso resultará em uma sequência de apenas 0s se e somente se este for um número Lynch-Bell. Por quê? Se houver um dígito repetido, todas as instâncias da última permanecerão as mesmas e, como a entrada não contém zeros, isso significa um dígito diferente de zero. Caso contrário, estamos apenas verificando se cada dígito divide igualmente o número.

Como não há números de Lynch-Bell de 8 ou mais dígitos (prova formal: a OEIS diz isso), verificar se a sequência resultante é lexicograficamente mais cedo que a sequência '00000000'é equivalente a verificar se são todos os zeros.


0

R , 86 bytes

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

Recebe a entrada como uma sequência. Eu certamente sinto que isso é jogável.

Experimente online!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.