Сколько существует чисел Линч-Белла?


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 Зачем нам нужен словарь? Нам не нужно выводить на этой базе.
user202729

2
не могли бы вы добавить пример >10?
Род

1
@JonathanAllan Понятно, я уже все прояснил
Beta Decay

3
Если требуется поддержка только [2-36], мы можем перечислить их все.
Джонатан Аллан

3
Оказывается, никому не удалось посчитать f(36). Сделать вызов с быстрым кодом на основе этого было бы, вероятно, интересно.
user202729

Ответы:


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
Только в code-golf это O(N^N)решение не только приемлемое, но и хорошее.
DJMcMayhem

5
@DJMcMayhem Мех, я думаю, что мы можем накачать эти цифры и получитьO(N↑↑N)
Beta Decay

Должно ли это быть, O(N^(N+1))потому что проверка достоверности каждого сгенерированного числа занимает O(N)? (хотя я не понимаю Jelly)
user202729

@ user202729 N + 1 - это просто N в обозначении big-O.
mbrig

1
@mbrig Конечно, я понимаю нотацию big-O, что ( N+1в O(N)) не подразумевает N^(N+1)в O(N^N).
user202729

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

Ungolfed:

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;}
Герман Л

Один из первых раз, когда я видел ярлык, использованный в ответе Codegolf
Джастин

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.
Кевин Круйссен,


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

Mathematica, 82 79 76 байт

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

Как вы передаете номер в это? (извините, Mathematica является новым для меня)
Beta Decay

Вставьте функцию (например, в песочницу Вольфрама), а затем вставьте [<parameter>]после этого. С тем, parameterчтобы быть числом.
user202729

Можете ли вы добавить TIO или эквивалент?
Лохматый


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.

РЕДАКТИРОВАТЬ: -4 байта путем объединения двух циклов.


1

Рубин , 80 65 байт

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

Попробуйте онлайн!

Спасибо ГБ за -15 байтов.


Это не будет работать при п> 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 байт благодаря Shaggy

pU õìU ËeDâ f myDìU

Попробуйте онлайн!



Или 19 байтов с -xфлагом.
лохматый

вау О_о, я явно ужасен в игре в гольф
только ASCII

Пока у вас все хорошо :) Требуется время, чтобы освоить новый язык, разобраться во всех его особенностях, хитростях и причудах.
лохматый

@ Шагает, но когда вы используете новый язык так часто, как я, следует ожидать, что я буду ближе к оптимальному, чем 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 из-за того, что powerset генерирует пустой набор.

-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 #) , 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.