Скільки є номерів Лінч-Белла?


19

Виклик

Враховуючи ціле число, nяк вхідне місце де 36 >= n >= 2, виведіть, скільки номерів Лінч-Белла є в базі n.

Вихід повинен бути в базі 10.

Номери Лінча-Белла

Число - це числа Лінч-Белла, якщо:

  • Усі його цифри унікальні (повторення цифр немає)
  • Число поділяється на кожну його цифру
  • Він не містить нуля як однієї з його цифр

Оскільки всі цифри повинні бути унікальними, а у вас є обмежений набір одноцифрових чисел у кожній базі, існує кінцеве число чисел Лінча-Белла.

Наприклад, у базі 2 є лише один номер Лінча-Белла 1, оскільки всі інші числа або повторюють цифри, або містять 0.

Приклади

Input > Output
2 > 1
3 > 2
4 > 6
5 > 10
6 > 10
7 > 75
8 > 144
9 > 487
10 > 548

Mathematica Online втратив пам'ять вище бази 10. Ви можете використовувати такий код, щоб створити свій власний:

Do[Print[i," > ",Count[Join@@Permutations/@Rest@Subsets@Range[#-1],x_/;And@@(x\[Divides]FromDigits[x,#])]&[i]],{i,10,36,1}]

Перемога

Виграє найкоротший код у байтах.


1
@MagicOctopusUrn Навіщо нам потрібен словник? Нам не потрібно виводити в цю базу.
користувач202729

2
ви можете додати приклад >10?
прут

1
@JonathanAllan Я бачу, я прояснив це зараз
бета-розпад

3
Якщо потрібна підтримка лише [2-36], ми можемо також перерахувати їх усі.
Джонатан Аллан

3
Виявляється, ніхто не встиг порахувати f(36). Зробити виклик найшвидшого коду на основі цього, можливо, буде цікаво.
користувач202729

Відповіді:


8

Желе , 13 байт

Q⁼g
*`Ṗ©bç"®S

Спробуйте в Інтернеті!

Ще одне O (n n ) рішення.

Пояснення

Q⁼g  Helper link. Input: digits (LHS), integer (RHS)
Q    Unique (digits)
 ⁼   Match
  g  GCD between each digit and the integer

*`Ṗ©bç"®S  Main link. Input: integer n
*`         Compute n^n
  Ṗ        Pop, forms the range [1, n^n-1]
   ©       Store previous result in register
    b      Convert each integer to base n
     ç"    Call the helper link, vectorized, with
       ®   The register's value
        S  Sum

16 байт ṖŒPḊŒ!€Ẏ⁼g¥"ḅ¥³Sі швидше
миль

5

Желе , 15 байт

*ḃ€’Q€Qḍḅ¥€⁸Ạ€S

Спробуйте в Інтернеті!

Складність .O(nn)


5
Тільки в коді-гольф - це O(N^N)рішення не тільки прийнятне, але і добре.
DJMcMayhem

5
@DJMcMayhem Meh, я думаю, що ми можемо накачати ці цифри і отриматиO(N↑↑N)
Beta Decay

Чи повинно це бути, O(N^(N+1))тому що перевіряють дійсність кожного генерованого числа O(N)? (хоча я не розумію Jelly)
користувач202729

@ user202729 N + 1 - це просто N у позначенні big-O.
mbrig

1
@mbrig Звичайно, я розумію нотацію big-O, що ( N+1є в O(N)) не означає, що N^(N+1)це в O(N^N).
користувач202729

3

Java, 222 212 190 байт

-10 байт завдяки Герману

-22 байти завдяки Кевіну

import java.util.*;a->{int c=0,i=1;A:for(;i<Math.pow(a,a);i++){Set g=new HashSet();for(char b:a.toString(i).toCharArray())if(!g.add(b)|b<49||i%a.parseInt(b+"",a)>0)continue A;c++;}return c;}

Безголівки:

a -> {
    int count = 0;
    OUTER:
    for (int i = 1; i < Math.pow(a, a); i++) {
        Set<Character> found = new HashSet<>();
        for (char b : Integer.toString(i, a).toCharArray()) {
            if (!found.add(b) || b == 48 || i % Integer.parseInt(b + "", a) != 0) {
                continue OUTER;
            }
        }
        count++;
    }
    return count;
}

Спробуйте в Інтернеті!

Отримує дуже повільно для великої кількості.


-10 байт:a->{int c=0,i=1;A:for(;i<Math.pow(a,a);i++){java.util.Set<Character>g=new java.util.HashSet<>();for(char b:Long.toString(i,a).toCharArray())if(!g.add(b)|b<49||i%Long.parseLong(b+"",a)>0)continue A;c++;}return c;}
Герман Л

Один із перших разів, коли я бачив ярлик, який використовується у відповіді на кодовий гольф
Джастін,

A:і continue A;це 13 байт, а {--c;break;}це 12. Чи вчинить це помилку, яку я не бачу?
JollyJoker

Це може бути вартим окремої відповіді, але ви можете провести цикл через цифри в базовій n кожній цифрі i%aта i/=aкожній петлі. Ви можете уникнути набору, скориставшись int[]і перевіривши цеx[b]++<2
JollyJoker

java.util.Set<Character>‌​g=new java.util.HashSet<>();може бути import java.util.*;+ Set g=new HashSet();; Long.toStringможе бути a.toString; і Long.parseLongможе бути a.parseInt.
Kevin Cruijssen


2

Власне , 24 байти

;╗DR⌠╜DR╨i⌡M⌠;╜@¿♀%ΣY⌡MΣ

Спробуйте в Інтернеті!

Пояснення

Ця програма складається з двох основних частин: генерації перестановки та тесту Лінча-Белла. Отже, це пояснення розгляне кожну частину окремо, для більшої ясності.

Генерування перестановок

Введення: n(ціле число в [2, 36])

Вихідні дані: всі часткові та загальні перестановки [1, n-1](послідовності, що містять значення [1, n-1]без повторень, довжина яких у [1, n-1])

;╗DR⌠╜DR╨i⌡M
;╗            store a copy of n in register 0
  DR          range(1, n)
    ⌠╜DR╨i⌡M  do the following for each element k in range:
     ╜DR        range(1, n)
        ╨       k-permutations of [1, n-1]
         i      flatten

Тест Лінча-Белла

Введення: список базових nцілих чисел, представлений у вигляді списків базових nцифр

Вихід: кількість номерів Лінч-Белла в базі n

⌠;╜@¿♀%ΣY⌡MΣ
⌠;╜@¿♀%ΣY⌡M   for each base-n digit list a:
 ;╜             duplicate a, push n
   @¿           convert a from base-n to decimal
     ♀%         modulo a with each of its base-n digits
       Σ        sum
        Y       boolean negation (1 if all modulo results are 0, else 0)
           Σ  sum (count the 1s in the resultant list)

2

Математика, 82 79 76 байт

Count[Join@@Permutations/@Subsets@Range[#-1],x_/;x==x~FromDigits~#~GCD~x]-1&

Як ви вводите номер до цього? (вибачте, Mathematica для мене нова)
Beta Decay

Вставте функцію (наприклад, в пісочницю Wolfram), а потім поставте [<parameter>]після цього. З parameterчислом.
користувач202729

Чи можете ви додати TIO або еквівалент?
Shaggy


1
Чи f (5) і f (6) дійсно 10? Це дивно ...
Чарівний восьминога Урн

1

05AB1E , 22 байти

mLIBε0KÙ}ÙvyIöySIö%O_O

Спробуйте в Інтернеті!

O_O також було моїм обличчям, коли це нарешті спрацювало.

<ÝIBJ0Kæ¦Ù€œ˜ швидше, ніж я використовую для генерування чисел у фактичній відповіді, але випадково перестає працювати на щось більше 7 (без видимих ​​причин?)

Пояснення

mLIBε0KÙ}ÙvyIöySIö%O_O # (input = i)
m                      # Push i^i
 L                     # ...and get a range from one to this value
  IB                   # Map every element to their base i representation
    ε   }              # Map every element to ...
     0K                 # Itself without 0s
       Ù                # ...and only unique digits
         Ù             # Uniquify the resulting list
          v            # For each element...
           yIö          # Push it converted to base 10
              ySIö      # Push every digit of it converted to base 10 in a list
                  %     # Calculate the modulo for each digit
                   O    # Sum all results together
                    _   # Negate: Returns 0 for every positive number and 1 for 0
                     O  # Sum with the rest of the stack (Basically counting all Lynch-Bell-Numbers)
                       # Implicit print

Я впевнений, що інший підхід може заощадити більше байтів, але у вашому поточному рішенні ε0KÙ}можна 0м€Ùзберегти байт.
Кевін Круїссен

1

Perl 5, 80 76 байт (75 + -p)

$\+=!grep$_?$;%$_|$|{0,$_}++:1,@@until($@[$}++]+=1)%=$_ and++$;,$}=$}==$_}{

Зловживання $;для розваги та прибутку. Час виходу на вхід> 8.

EDIT: -4 байти шляхом об'єднання двох циклів.


1

Ruby , 80 65 байт

->n{(1..n**n).count{|i|(d=i.digits n)-[0]==d|d&&d.sum{|j|i%j}<1}}

Спробуйте в Інтернеті!

Завдяки ГБ за -15 байт.


Це не працюватиме n> 10 (через "j.to_i")
GB

Хороший улов, занадто поганий, він вийшов задовго до цього :)
Кирилл Л.

У будь-якому випадку: ви можете викликати "цифри", передаючи базу як аргумент, і економити багато: `-> n {(1..n ** n) .count {| i | (d = i.digits n) - [0] == d | d && d.sum? {| j | i% j} <0}} `
GB

Дійсно, я абсолютно пропустив, що цифри мають цей параметр. Але я бачу, що ви опублікували це як окрему відповідь і потім видалили. Я б сказав, продовжуйте, ви побили мене до цього :)
Кирило Л.

Я думаю, що моя відповідь занадто схожа, це той самий підхід з парою ярликів, в основному вкрадений код.
ГБ

1

Japt -x , 25 19 байт

-6 байт завдяки Шаггі

pU õìU ËeDâ f myDìU

Спробуйте в Інтернеті!



Або 19 байт з -xпрапором.
Кудлатий

Уау О_о мені явно страшно в гольф-джапті
лише ASCII

Ви робите добре зараз :) Потрібен час, щоб познайомитися з новою мовою, з’ясувати всі її особливості, хитрощі та примхи.
Кудлатий

@Shaggy, але коли ви використовуєте нову мову так часто, як я це роблю, слід очікувати, що я буду ближче до оптимального, ніж, як, наприклад, 25% XD
лише ASCII

0

Python 3 , 204 174 байт

lambda x,r=range,i=chain:sum(0**any(int(''.join(map(str,y)),x)%z for z in y)for y in i(*map(permutations,i(*[combinations(r(1,x),e)for e in r(x)]))))-1
from itertools import*

Спробуйте в Інтернеті!

Для кожної перестановки кожного елемента набору потужностей діапазону (1, n) (без нулів, унікальних) перетворіть у числовий рядок до бази n. Підсумовуйте все, що ділиться кожною цифрою, віднімайте 1 за рахунок набору потужності, що генерує порожній набір.

-30 байт завдяки @ovs!





0

Perl 5 , 108 + 1 ( -p) = 109 байт

while(@a<$_){$r=%k=@a=();for($t=++$i;$t;$t=int$t/$_){push@a,$t%$_}$r||=!$_||$i%$_||$k{$_}++for@a;$r||$\++}}{

Спробуйте в Інтернеті!

Це свиня. Не впевнений, чи вдасться це зробити більше, ніж база 8 на TIO, без вичерпання часу.


0

C # (Visual C # Interactive Compiler) , 144 байти

n=>{int j,i,p;for(j=i=0;i++<~0UL;){p=i;var a=new List<int>();for(;p>0;p/=n)a.Add(p%n);j+=a.All(c=>c>0&&i%c<1&a.Count(x=>x==c)<2)?1:0;}return j;}

Перебирає всі числа від 0 до ulong.MaxValueта вибирає ті, які є номерами Лінча-Белла у зазначеній базі. Займається вічно, навіть на 2, хоча якщо ви встановите ~0ULчастину циклу for для чогось меншого, ви можете отримати вихід для введення до 7 протягом хвилини на TIO.

Спробуйте в Інтернеті!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.