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

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

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

Становится очень медленным для больших чисел.

Okx
источник
-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.
Кевин Круйссен,
3

Perl 6 , 86 84 77 байт

-2 байта благодаря Ramillies

->\n{n-1+grep {.Set==$_&&.reduce(* *n+*)%%.all},map {|[X] (1..^n)xx$_},2..^n}

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

Работает при n = 8 на TIO.

nwellnhof
источник
1
Я думаю, что вы можете сэкономить 2 байта, делая .allвместо all $_.
Ramillies
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)
Mego
источник
2

Mathematica, 82 79 76 байт

Count[Join@@Permutations/@Subsets@Range[#-1],x_/;x==x~FromDigits~#~GCD~x]-1&
user202729
источник
Как вы передаете номер в это? (извините, 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
Datboi
источник
Я уверен, что другой подход может сэкономить больше байтов, но в вашем текущем решении ε0KÙ}может быть 0м€Ùсохранение байта.
Кевин Круйссен
1

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

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

Злоупотребление $;ради удовольствия и выгоды. Тайм-ауты на входах> 8.

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

Grimmy
источник
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

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

ASCII-только
источник
20 байт ?
лохматый
Или 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!

Коннер Джонстон
источник
184 байт
овс
174 байт
овс
0

Haskell , 117 байт

f n=sum[1|x<-id=<<[mapM(\_->[1..n-1])[0..m]|m<-[0..n]],all(\y->[mod(sum(zipWith((*).(n^))[0..]x))y|c<-x,c==y]==[0])x]

Попробуйте онлайн! Работает на TIO до истечения n=7времени ожидания.

Laikoni
источник
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 без тайм-аута.

Xcali
источник
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.

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

Воплощение невежества
источник