Lynch-Bell 번호입니까?


25

입력으로 양의 정수 (0을 포함하지 않음)가 제공됩니다. 당신의 임무는 그것이 Lynch-Bell 번호인지 아닌지를 확인하는 것입니다.

숫자는 모든 숫자가 고유하고 숫자를 각 숫자로 나눌 수있는 경우 Lynch-Bell 숫자입니다.

실제로 Lynch-Bell 번호는 548 개에 불과하므로 하드 코딩이 가능하지만 거의 확실히 더 길어질 것입니다.

126은 모든 숫자가 고유하기 때문에 Lynch-Bell 번호이며 126은 1, 2 및 6으로 나눌 수 있습니다.

당신은 진실하고 거짓된 값을 출력 할 수 있습니다.

예 :

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

이다 OEIS A115569 .


1
관련. (결정 문제를 제기하는 대신 모든 숫자를 요구합니다.)
Martin Ender

2
문자열로 입력 할 수 있습니까?
TheLethalCoder

2
@TheLethalCoder 물론 당신은 할 수 있습니다, 그것은 바보 같은 질문입니다.
Okx

10
@Okx 모든 챌린지 포스터가 항상 입력 할 수있는만큼 입력이 유연하지는 않습니다.
TheLethalCoder

답변:


27

수학, 42 바이트

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

나는 0!=##&@@d&&##&@@Mathematica에 대한 새로운 가독성이 낮다고 생각합니다 ...

설명

여기에 사용 된 기본 구문 설탕 중 일부 :

  • & 우선 순위가 매우 낮아서 남은 모든 것을 명명되지 않은 함수로 바꿉니다.
  • &&그냥 And연산자입니다.
  • # 가장 가까운 이름없는 함수의 인수입니다.
  • ##A는 연속 함수의 모든 인수의.
  • @함수 호출에 대한 접두사 표기법입니다 f@x == f[x].
  • @@is Apply, 이것은리스트의 요소를 개별 인수로 함수에 전달합니다 f@@{a,b,c} == f[a,b,c].

그 길에서 ...

(d=IntegerDigits@#)

이것은 매우 설명이 필요합니다. 입력의 10 진수 목록을 제공하고 결과를에 저장합니다 d.

(...∣#)

이것은 분산 연산자가 (분산 연산자이기 때문에) 각 자릿수에 의한 분산에 대한 입력을 테스트합니다 Listable. 이것은 우리에게 Trues와 Falses의 목록을 제공합니다 .

...&@@...

각 부울이 별도의 인수가되도록 왼쪽의 함수를 부울 목록에 적용합니다.

...&@@d

d개별 숫자가 별도의 인수로 제공되도록 다른 함수를에 적용 합니다. 이 함수는 0!=##&, 즉 . 모든 숫자가 구별 되는지 확인합니다 (그리고 숫자가 다르지만 도전에 의해 주어졌으며, 그렇지 않은 경우 어쨌든 제수가 아님). 자체 사용에있어 실제로 1 바이트를 절약 할 수 있으며 1 바이트 요소 ( )가 없기 때문에 작동합니다 . 따라서이 첫 번째 것은 숫자가 고유한지 확인합니다. 이 결과를 불러 봅시다Unequal[0, d1, d2, ...]00!=##&Unequal0U

...&&##

다시 한번, 이건 정말 짧습니다 And[U, ##]. 함께 ##서열 인 초기 가분성 검사에서 각각 논리 값은로 확장된다 And우리가 얻을 수 있도록, 두 자리 고유하고 각 숫자는 입력 분할되는 것을 확인한다.And[U, d1∣n, d2∣n, ...]


6
##&@@d&&##&@@? 그게 무슨 짓이야?
Okx

@Okx 설명을 추가했습니다.
마틴 엔더

당신이 대체 할 수있을 수 있습니다 0!=에 의해 0<?
sergiol

@sergiol 나는 그것을하기 위해 숫자를 정렬해야합니다.
마틴 엔더

실제로 가독성이 낮은 새로운 Mathematica는 이해할 수있는 몇 가지 함수 이름 주위에 많은 구문-설탕처럼 보입니다. 프로그램을 완전히 설탕으로 만들 수 있다는 것을 알지 못했습니다 .p 물론 모든 설탕은 아니지만 여전히 인상적입니다!)
mbrig

11

파이썬 3 , 56 바이트

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

온라인으로 사용해보십시오!

FalseLynch-Bell 번호 인 True경우 출력 , 그렇지 않으면 출력


1
이것이 문자열로 입력됩니까?
CalculatorFeline

2
여기에는 두 가지 문제가 있습니다. 1) 지정된대로 진실 / 거짓 답변을 제공하지 않습니다 (단지 4 바이트입니다). 2) 입력 "10"에서 예외가 발생합니다. 그렇지 않으면 아주 좋고 간결합니다!
CR Drost

@CalculatorFeline 예.
CR Drost

@CRDrost 1) 잘 정의 된 OUPUT 그래서 아무 문제가 없다 (보통) 2)가 없을 것 0입력에
로드

1
1) 내 말은, 문제가 있다는 것입니다. 그들은 X를 요구했지만 당신은 그것을주지 않았습니다. 2) 아, 당신은 완전히 맞아요, 나는 그것을 완전히 놓쳤습니다.
CR Drost


6

C #, 87 83 바이트

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

Visual Studio에서 테스트하기 전에 메모장에서 이것을 작성했는데 제대로 작동 했으므로 이제는 그 정도의 괴상한 수준이라는 것을 깨달았습니다 ...

풀 / 포맷 버전 :

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


6

자바 스크립트 (ES6), 42 41 바이트

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

입력을 문자열로 가져 true오거나 false적절하게 반환합니다 . 편집 : @RickHitchcock 덕분에 1 바이트가 절약되었습니다. 다른 버전 :

입력을 문자열로 받아서 40 바이트에 대해 0또는 1(즉, 논리 역수)를 반환 합니다.

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

입력을 숫자로 취하여 0또는 143 바이트를 반환 합니다.

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

입력을 숫자로 취하여 1또는 045 바이트를 반환 합니다.

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

역 참조를위한 \ n 옵션에 익숙하지 않았습니다. +1. 테스트 로직을 바이트를 저장하기 위해 어떤 메소드로 옮길 수 있습니다 :s=>![...s].some((e,i)=>s%e|s.search(e)<i)
Rick Hitchcock

내가 사용했을 때 예상 대신에 [...new Array(9999999)].map((_,n)=>n+1+"").filter(s=>![...s].some((e,i)=>s%e|s.search(e)<i)).length얻었 으므로 이것은 서면으로 정확하지 않습니다. 그래도 정말 타이트한 코드입니다. 5081548
CR Drost

죄송합니다.이 내용이 올바르지 않다는 의견을 철회하십시오. 원래 포스터에 0이 이미 필터링되어있을 것으로 예상하기 때문에 테스트 코드가 올바르지 않습니다. 추가 .filter(x => x.indexOf('0')===-1)로 약속 한대로 548을 반환합니다.
CR Drost

6

젤리 , 6 4 바이트

Dg⁼Q

온라인으로 사용해보십시오!

작동 원리

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
도 있습니다 gQV=당신은 ASCII 전용 솔루션을 선호합니다.
Dennis

5

파이썬 3 , 54 바이트

False숫자가 Lynch-Bell 숫자 인 경우 반환 합니다. 문자열을 입력으로 사용합니다. 내 자신의 일이지만로드와 매우 비슷합니다. 나는 그의 게시물 아래에 댓글을 달았지만 아직 평판이 없습니다.

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

온라인으로 사용해보십시오!


2
PPCG에 오신 것을 환영합니다!
Stephen

환영! Rod와 마찬가지로 함수는 입력 "10"에서 예외를 발생시킵니다.
CR Drost

1
@CRDrost "입력으로 양의 정수 (0을 포함하지 않음)가 제공됩니다."
C McAvoy

맞아, 나는 이것에 대해 불평하는 다른 곳의 의견을 게시했지만 분명히이 것을 놓쳤다. 죄송합니다, 취소되었습니다!
CR Drost

@CRDrost 걱정 마세요!
C McAvoy


2

PHP, 62 48 바이트

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

파이프로 실행 -nR하거나 온라인으로 테스트하십시오 . 허위, 진실에 1대한 빈 출력 .

고장

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




1

매스 매 티카, 57 바이트

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

1
내장을 사용하면 많은 바이트를 절약 할 수 있습니다IsLynchBellNumber
Okx

1
왜 마틴에게 같은 제안을하지 않습니까?
J42161217

@ Okx하지만 그렇게 재미는 없습니다.
QBrute

@QBrute 농담을 할 수 있습니까?
Okx

1
@Okx보다 믿을만한 것 LynchBellNumberQ입니다. ;)
Martin Ender


1

하스켈 260 241 201 162 바이트

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)

설명

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

Laikoni에 대한 고맙게도 단축 했습니다


1
특히 PPCG와 Haskell 골프에 오신 것을 환영합니다! 등호 주변이나 괄호 옆과 같은 불필요한 공간을 제거하면이 답변을 상당히 단축 할 수 있습니다.
Laikoni

1
또한 Haskell의 골프 팁Haskell의 골프 규칙 가이드 관심이있을 수 있습니다 .
Laikoni

조언을 들어 @Laikoni Thanx! 나는 그것을 찾고 있어요
Sergii Martynenko Jr



0

펄 6 , 27 바이트

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

온라인으로 사용해보십시오!

  • .comb인수가 없으면 문자열을 개별 문자로 분할하는 메소드입니다. 숫자는 암시 적으로 문자열로 변환되므로 .comb숫자를 반환합니다.
  • .comb.all 모든 자릿수의 정션입니다.
  • $_ %% .comb.all입력 인수 $_를 모든 자릿수로 나눌 수있는 정션입니다 . 예를 들어, $_이며 123, 접합부는 all(True, False, True), 축소되어있는 Falsetruthy 컨텍스트이다.
  • [!=] .comb!=연산자 를 사용하여 입력 인수의 숫자를 줄이며 True숫자가 모두 다른지 평가합니다 .

0

망막 , 37 바이트

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

^$

온라인으로 사용해보십시오! 링크에는 테스트 사례가 포함됩니다. 설명 : 첫 번째 단계는 중복 숫자를 0으로 바꿉니다. 두 번째 단계는 각 숫자를 단항 표현으로 바꾸고 원래 숫자의 단항 표현으로 바꿉니다. 그런 다음 세 번째 단계는 원래 숫자를 0이 아닌 숫자로 나눈 나머지를 계산합니다. 번호가 Lynch-Bell 번호이면 모든 항목이 삭제되고 최종 단계에서 테스트됩니다.


0

루비 2.4, 42 바이트

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

(아직 TIO가 없습니다, 죄송합니다)


0

CJam, 17 바이트

CJam은 골프 언어의 자바입니다. 심지어 Java로도 해석됩니다!

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

설명:

{   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 바이트

이봐, 이것은 내 첫 CG 게시물이고 첫 번째 시도이므로 모든 규칙을 준수하기를 바랍니다.

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

이것은 끝에 줄을 추가하여 메모장에서 실행할 수 있습니다

Msgbox L(InputBox(""))

그런 다음 .vbs로 저장 한 다음 두 번 클릭하십시오.

설명:

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는 골프를위한 약간의 무뚝뚝한 도구이지만 루비를 아직 배우지 못했습니다 ...


'L = "y"'와 같은 공백을 제거 할 수 없습니다
Okx

기술적으로는 그렇습니다! 나는 그것을해야합니다 ... btw, 나는 배우기에 좋을 수있는 코드 골프 언어를보고 있지만 대부분의 경우 문서는 존재하지 않는 것에서 최소입니다 ... 누구나 잘 문서화 된 좋은 언어를 추천 할 수 있습니까? "실제로 /
진실


0

Pyth , 10 바이트

qiRQKjQT{K

모든 테스트 사례를 확인하십시오.

방법?

qiRQKjQT {K ~ 전체 프로그램.

     jQT ~ 입력의 소수 자릿수 목록.
    K ~ 변수 K에 할당
 iRQ ~ 각 10 진수
 i Q ~ ... 입력 자체를 가진 최대 공약수를 구합니다.
        중복 요소가 제거 된 {K ~ K
q ~ 같습니까? 암시 적으로 출력합니다.

Pyth , 11 바이트

&!f%sQsTQ{I

모든 테스트 사례를 확인하십시오.

방법?

&! f % sQsTQ {I ~ 암시 적 입력을 포함한 전체 프로그램.

  f Q ~ 입력 문자열을 필터링합니다.
   % sQsT ~ 현재 숫자의 정수 모듈로 변환 된 입력.
             ~ 0보다 높으면 유지하고 그렇지 않으면 버립니다.
 ! ~ 부정. 목록이 비어 있으면 True를, 그렇지 않으면 False를 반환합니다.
& {I ~ 중복 제거시 입력이 변하지 않습니까? 암시 적으로 출력합니다.


0

코 틀린 1.1, 98 66 59 바이트

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

미화

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

테스트

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 바이트

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

온라인으로 사용해보십시오!

간단한 Dfn은 아마 조금 더 골프를 칠 수 있습니다. 수율 표준 APL 부울 값은 true, 1은 false입니다.

이 함수는 인수를 정수가 아닌 문자열로 사용합니다.

방법:

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

줄리아 1.0 , 39 바이트

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

rem.(x,d)는 x를 각 숫자로 나눈 후 나머지를 포함하는 벡터입니다 x. 0*unique(d)은 길이가 고유 숫자의 수와 같고 모두 0 인 벡터입니다. 그들이 같은지 확인하십시오.

온라인으로 사용해보십시오!


0

루비 -n , 40 바이트

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

온라인으로 사용해보십시오!

숫자를 문자열로 읽습니다. 각 문자 (숫자)를 해당 문자 (있는 경우) 또는 해당 숫자의 정수로 대체합니다. 이는 0Lynch-Bell 번호 인 경우 에만 s 의 문자열이됩니다 . 왜? 반복되는 숫자가있는 경우 마지막의 모든 인스턴스는 동일하게 유지되며 입력에 0이 포함되지 않으므로 0이 아닌 숫자를 의미합니다. 그렇지 않으면, 우리는 모든 숫자가 균등하게 숫자를 나누는 지 여부를 확인하고 있습니다.

8 자리 이상의 Lynch-Bell 번호가 없으므로 (공식 증명 : OEIS에 따르면) 결과 문자열이 사전 순으로 문자열보다 빠른지 '00000000'확인하는 것은 모두 0인지 확인하는 것과 같습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.