Apakah ini nomor Lynch-Bell?


25

Anda akan diberi angka bulat positif (yang tidak akan pernah mengandung 0) sebagai input. Tugas Anda adalah memeriksa apakah itu nomor Lynch-Bell atau tidak.

Angka adalah nomor Lynch-Bell jika semua digitnya unik dan nomornya dapat dibagi oleh masing-masing digitnya.

Bahkan, sebenarnya hanya ada 548 nomor Lynch-Bell, jadi hard-coding adalah suatu kemungkinan, tetapi hampir pasti akan lebih lama.

126 adalah nomor Lynch-Bell karena semua digitnya unik, dan 126 dapat dibagi dengan 1, 2, dan 6.

Anda dapat menampilkan nilai apa pun yang benar dan salah.

Contoh:

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

Ini adalah OEIS A115569 .


1
Terkait (Minta semua angka alih-alih mengajukan masalah keputusan.)
Martin Ender

2
Bisakah saya mengambil input sebagai string?
TheLethalCoder

2
@TheLethalCoder Tentu saja Anda bisa, itu pertanyaan konyol.
Okx

10
@Okx Tidak semua poster tantangan sama fleksibelnya dengan input yang diizinkan karena Anda selalu patut bertanya.
TheLethalCoder

Jawaban:


27

Mathematica, 42 byte

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

Saya pikir 0!=##&@@d&&##&@@ini adalah rendahnya keterbacaan baru untuk ...

Penjelasan

Beberapa gula sintaksis dasar yang digunakan di sini:

  • & memiliki prioritas yang sangat rendah dan mengubah semuanya yang tersisa menjadi fungsi yang tidak disebutkan namanya.
  • &&hanya Andoperator.
  • # adalah argumen fungsi terlampir terdekat terlampir.
  • ##adalah urutan semua argumen fungsi.
  • @adalah notasi awalan untuk panggilan fungsi, yaitu f@x == f[x].
  • @@adalah Apply, yang meneruskan elemen daftar sebagai argumen individu ke suatu fungsi, yaitu f@@{a,b,c} == f[a,b,c].

Dengan itu keluar dari jalan ...

(d=IntegerDigits@#)

Ini harus cukup jelas: ini memberi kita daftar angka desimal input dan menyimpan hasilnya d.

(...∣#)

Ini menguji input untuk dapat dibagi oleh masing-masing digit (karena operator dibagi adalah Listable). Ini memberi kita daftar Trues dan Falses.

...&@@...

Kami menerapkan fungsi di sisi kiri ke daftar boolean, sehingga setiap boolean adalah argumen yang terpisah.

...&@@d

Kami menerapkan fungsi lain d, sehingga digit individu diberikan sebagai argumen terpisah. Fungsinya 0!=##&, yaitu . Itu memeriksa bahwa semua digit berbeda (dan bahwa mereka berbeda dari tetapi yang diberikan oleh tantangan, dan jika tidak, itu tidak akan menjadi pembagi pula). benar-benar hanya penghemat 1-byte untuk menggunakan itu sendiri, dan itu berfungsi karena ada elemen 1-byte ( ) yang kita tahu tidak ada. Jadi hal pertama ini memeriksa bahwa angka-angka itu unik. Mari kita sebut hasil iniUnequal[0, d1, d2, ...]00!=##&Unequal0U

...&&##

Sekali lagi, ini benar-benar hanya singkatan And[U, ##]. Dengan ##menjadi urutan, boolean individu dari pemeriksaan keterbagian awal diperluas ke And, jadi kami mendapatkan pemeriksaan yang mana kedua digit tersebut unik dan setiap digit membagi input.And[U, d1∣n, d2∣n, ...]


6
##&@@d&&##&@@? Apa yang bahkan dilakukannya?
Okx

@ OKK Menambahkan penjelasan.
Martin Ender

Mungkin Anda bisa menggantinya 0!=dengan 0<?
sergiol

@sergiol Saya harus mengurutkan angka untuk melakukan itu.
Martin Ender

Baru rendah dalam keterbacaan memang, biasanya Mathematica terlihat seperti sekelompok sintaks-gula di sekitar beberapa nama fungsi yang dapat saya mengerti, saya tidak tahu Anda bisa membuat program sepenuhnya dari gula: p (tentu saja, penjelasan Anda yang luar biasa mari saya lihat itu tentu saja tidak semua gula, tapi tetap saja, sangat mengesankan!)
mbrig

11

Python 3 , 56 byte

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

Cobalah online!

Output Falsejika itu adalah nomor Lynch-Bell, Truejika tidak.


1
Apakah ini dimasukkan sebagai string?
CalculatorFeline

2
Ini memiliki dua masalah: 1) tidak memberikan jawaban yang benar / salah seperti yang ditentukan (hanya 4 byte!); 2) itu melempar pengecualian pada input "10". Kalau tidak, sangat bagus dan ringkas!
CR Drost

@CalculatorFeline Ya.
CR Drost

@CRDrost 1) ouput didefinisikan dengan baik sehingga tidak ada masalah (biasanya) 2) tidak akan pernah ada 0dalam input
Rod

1
1) Maksud saya, ada masalah, yaitu mereka meminta X dan Anda tidak memberikannya. 2) Ah, kamu benar sekali, aku sangat merindukan itu.
CR Drost

8

Brachylog , 10 byte

≠g;?z%ᵐ=h0

Cobalah online!

Penjelasan

≠             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 byte

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

Saya menulis ini di notepad sebelum pengujian di Visual Studio, di mana ia bekerja dengan baik, jadi baru sadar saya sekarang tingkat nerd ...

Versi Lengkap / Diformat:

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

JavaScript (ES6), 42 41 byte

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

Mengambil input sebagai string dan mengembalikan trueatau falsejika perlu. Sunting: Disimpan 1 byte berkat @RickHitchcock. Versi lain:

Mengambil input sebagai string dan mengembalikan 0atau 1(yaitu pembalikan logis) untuk 40 byte:

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

Mengambil input sebagai angka dan mengembalikan 0atau 1selama 43 byte:

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

Mengambil input sebagai angka dan mengembalikan 1atau 0selama 45 byte:

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

Saya tidak terbiasa dengan opsi \ n untuk referensi balik. +1. Anda dapat memindahkan logika uji ke beberapa metode untuk menyimpan byte:s=>![...s].some((e,i)=>s%e|s.search(e)<i)
Rick Hitchcock

Ketika saya menggunakan [...new Array(9999999)].map((_,n)=>n+1+"").filter(s=>![...s].some((e,i)=>s%e|s.search(e)<i)).lengthsaya mendapatkan 5081bukan yang diharapkan 548, jadi ini tidak benar seperti yang tertulis. Kode yang sangat ketat.
CR Drost

Maaf, saya menarik kembali komentar saya tentang ini tidak benar. Kode pengujian saya tidak benar karena poster asli mengharapkan nol telah disaring. Dengan tambahan .filter(x => x.indexOf('0')===-1)ini mengembalikan 548 seperti yang dijanjikan.
CR Drost

6

Jelly , 6 4 byte

Dg⁼Q

Cobalah online!

Bagaimana itu bekerja

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
Ada juga gQV=jika Anda lebih suka solusi ASCII saja.
Dennis

5

Python 3 , 54 byte

Kembali Falseketika nomor adalah nomor Lynch-Bell. Mengambil string sebagai input. Datang dengan saya sendiri tetapi sangat mirip dengan Rod. Saya akan berkomentar di bawah posnya tetapi saya belum memiliki reputasi.

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

Cobalah online!


2
Selamat datang di PPCG!
Stephen

Selamat datang! Seperti Rod's, fungsi Anda melempar pengecualian pada input "10".
CR Drost

1
@CRDrost "Anda akan diberi angka bulat positif (yang tidak akan pernah berisi 0) sebagai input."
C McAvoy

Benar, saya sudah memposting komentar di tempat lain saya mengeluh tentang hal ini, tetapi saya tampaknya melewatkan yang ini. Maaf, ditarik!
CR Drost

@CRDrost Jangan khawatir!
C McAvoy


2

PHP, 62 48 byte

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

Jalankan sebagai pipa dengan -nRatau uji secara online . Keluaran kosong untuk kepalsuan, 1untuk kebenaran.

kerusakan

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 byte

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

Cobalah online!

Menentukan fungsi anonim (#)=<<showyang, diberi nomor, kembali Trueatau False.


Fungsi ini gagal pada input 10.
CR Drost

Maaf, saya salah tentang itu - saya melewatkan bahwa Anda tidak diharuskan untuk memberikan jawaban apa pun untuk input yang memiliki 0 di dalamnya.
CR Drost



1

Mathematica, 57 byte

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

1
Anda dapat menyimpan banyak byte jika menggunakan builtinIsLynchBellNumber
Okx

1
kenapa kamu tidak mengajukan penawaran yang sama ke Martin?
J42161217

@Okx tapi kurang menyenangkan.
QBrute

@QBrute Bisakah Anda bercanda?
Okx

1
@ OKx Itu akan lebih dipercaya LynchBellNumberQ. ;)
Martin Ender

1

Python 2 , 66 byte

Ini adalah solusi dalam Python 2, yang seluruh tujuannya adalah untuk menghasilkan Truekebenaran dan Falsekepalsuan:

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

Cobalah online!


1

Haskell, 260 241 201 162 byte

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)

Penjelasan

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

Secara signifikan telah mempersingkat thanx ke Laikoni


1
Selamat datang di PPCG dan golf Haskell khususnya! Jawaban ini dapat diperpendek dengan menghapus spasi berlebihan, misalnya yang di sekitar tanda sama dengan atau di sebelah tanda kurung.
Laikoni


@Laikoni Thanx atas saran Anda! Saya mencari ke dalamnya
Sergii Martynenko Jr


0

Neim , 9 byte

𝐮ℚ₁𝐅₁𝕌₁ℚ𝕒

Cobalah online!

Terima kasih kepada Okx .

Hmm, ada simetri yang bagus ... oO.O.O.Oo


Anda dapat golf 𝐂D𝐮𝔼ke 𝐮ℚ(uniquify, cek untuk kesetaraan mengabaikan jenis)
Okx

Masih ada ruang untuk bermain golf di sana;)
Okx

@Okx Hmm ... Saya tidak melihat sesuatu yang sangat menarik di sana.
Erik the Outgolfer

0

Perl 6 , 27 byte

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

Cobalah online!

  • .combadalah metode yang, ketika tidak diberi argumen, membagi string menjadi karakter individu. Sejumlah secara implisit dikonversi menjadi string, dan karenanya .combmengembalikan digit-digitnya.
  • .comb.all adalah dan-persimpangan dari semua digit.
  • $_ %% .comb.alladalah dan-persimpangan persimpangan argumen input $_oleh semua digitnya. Misalnya, jika $_ada 123, persimpangan adalah all(True, False, True), yang runtuh ke Falsedalam konteks yang benar.
  • [!=] .combmengurangi digit argumen input dengan !=operator, yang mengevaluasi Trueapakah semua digit berbeda.

0

Retina , 37 byte

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

^$

Cobalah online! Tautan termasuk kasus uji. Penjelasan: Tahap pertama menggantikan setiap digit duplikat dengan nol. Tahap kedua menggantikan setiap digit dengan representasi unary diikuti oleh representasi unary dari nomor aslinya. Tahap ketiga kemudian menghitung sisa pembagian angka asli dengan masing-masing angka bukan nol. Jika nomor tersebut adalah nomor Lynch-Bell maka ini akan menghapus semuanya dan ini diuji pada tahap akhir.


0

Ruby 2.4, 42 byte

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

(Belum ada TIO, maaf)


0

CJam, 17 byte

CJam adalah Java dari bahasa golf. Itu bahkan ditafsirkan di Jawa!

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

Penjelasan:

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

Hai semua, ini adalah posting CG pertama saya, dan upaya pertama, jadi harap saya mengikuti semua aturan ...

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

Ini dapat dijalankan dari Notepad dengan menambahkan garis di bagian akhir

Msgbox L(InputBox(""))

Dan kemudian menyimpannya sebagai .vbs, lalu klik dua kali.

Penjelasan:

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 adalah instrumen tumpul untuk bermain golf, tapi hei, saya belum belajar Ruby ...


Tidak bisakah Anda menghapus beberapa spasi putih seperti 'L = "y"'
Okx

Secara teknis, ya! Saya harus melakukan itu ... btw, saya sedang melihat bahasa codegolf yang mungkin keren untuk dipelajari, tetapi untuk sebagian besar, dokumentasinya minimal hingga tidak ada ... adakah yang bisa merekomendasikan bahasa yang baik yang didokumentasikan dengan baik? Sedang mencoba "Sebenarnya / Serius" tetapi menghantam beberapa kendala karena kurangnya dokumen ....
aAaa aAaa


0

Pyth , 10 byte

qiRQKjQT{K

Verifikasi semua kasus uji.

Bagaimana?

qiRQKjQT {K ~ Program lengkap.

     jQT ~ Daftar digit desimal input.
    K ~ Tetapkan ke variabel K.
 iRQ ~ Untuk setiap digit desimal ...
 i Q ~ ... Dapatkan pembagi umum terbesar dengan input itu sendiri.
        {K ~ K dengan elemen duplikat dihapus.
q ~ Apakah sama? Output tersirat.

Pyth , 11 byte

&!f%sQsTQ{I

Verifikasi semua kasus uji.

Bagaimana?

&! f% sQsTQ {I ~ Program lengkap, dengan input implisit.

  f Q ~ Filter atas string input.
   % sQsT ~ Input dikonversi ke modul integer dari digit saat ini.
             ~ Simpan jika lebih tinggi dari 0, dan buang sebaliknya.
 ! ~ Negasi. Jika daftar itu kosong, mengembalikan Benar, kalau tidak Salah.
& {I ~ Dan apakah invarian input dalam deduplicating? Output tersirat.

0

Perl 5 , 34 byte

33 byte kode + 1 untuk -pbendera

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

Cobalah online!

Keluaran 0untuk kebenaran, angka lain untuk kepalsuan


0

Kotlin 1.1, 98 66 59 byte

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

Yg diperindahkan

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

Uji

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 byte

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

Cobalah online!

Dfn sederhana, mungkin bisa bermain golf lebih banyak. Hasilkan booleans APL standar 1 untuk truey, 0 for falsy.

Perlu disebutkan bahwa fungsi mengambil argumen sebagai string daripada int.

Bagaimana:

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

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

rem.(x,d)adalah vektor yang berisi sisa setelah membagi x dengan setiap digit dalam x. 0*unique(d)adalah vektor dengan panjang sama dengan jumlah digit unik, dengan semua nilai nol. Periksa apakah keduanya sama.

Cobalah online!


0

ruby -n , 40 byte

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

Cobalah online!

Baca angka sebagai string. Gantikan setiap karakter (digit) dengan kemunculan karakter berikutnya, jika ada, atau seluruh nomor modulo digit itu. Ini akan menghasilkan string hanya 0s jika dan hanya jika ini adalah nomor Lynch-Bell. Mengapa? Jika ada digit yang diulang, setiap instance dari yang terakhir tetap sama, dan karena input tidak mengandung nol yang berarti digit bukan nol. Kalau tidak, kami hanya memeriksa apakah setiap digit membagi angka secara merata.

Karena tidak ada angka Lynch-Bell 8 atau lebih digit (bukti formal: OEIS mengatakan demikian), memeriksa apakah string yang dihasilkan secara leksikografis lebih awal daripada string '00000000'sama dengan memeriksa apakah semuanya nol.


0

R , 86 byte

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

Mengambil input sebagai string. Saya tentu merasa ini golf.

Cobalah online!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.