Префиксная делимость

Nov 02 2020

Вдохновение

Для целого положительного числа \$1 \le n \le 9\$, вывести все положительные \$n\$-цифровые целые числа \$i\$ для которых верно следующее:

  • Каждая цифра из \$1\$к \$n\$появляется ровно один раз в \$i\$. Следовательно, \$i\$цифры - это перестановка цифр из \$1\$к \$n\$.
  • \$i\$делится на \$n\$
  • Удаление крайней правой цифры из \$i\$дает другое целое число \$i_{\text{trunc}(1)}\$который делится на \$n-1\$
  • Удаление крайней правой цифры из \$i_{\text{trunc}(1)}\$дает другое целое число \$i_{\text{trunc}(2)}\$который делится на \$n-2\$
  • И так до тех пор, пока \$i_{\text{trunc}(n-1)}\$, который делится на 1.

Например, для \$n = 3\$, одно такое целое число \$321\$, как \$321\$делится на \$3\$, \$32\$автор \$2\$и \$3\$ Автор: 1.

Для \$n = 4, 5, 7\$, таких целых чисел нет. В этом случае, вы можете выводить ничего , что не могут быть спутаны с возможным выходом (например 0, []ничего, и т.д.). Для \$n = 3, 6\$, вы можете вывести два числа в любом формате, в котором два числа четко отделены друг от друга.

Это кодовый гольф, поэтому побеждает самый короткий код в байтах.

Если вы используете метод справочной таблицы, точки домового \${}^\dagger\$ присуждаются, если вы также включаете версию, которая рассчитывает правильный результат.

\${}^\dagger\$Очки Брауни могут быть или не быть в форме голоса за

Тестовые примеры

Эти случаи являются исчерпывающими, поэтому вы никогда не получите (или не должны будете обрабатывать) ввод, не включенный здесь.

n -> i
1 -> [1]
2 -> [12]
3 -> [123, 321]
4 -> []
5 -> []
6 -> [123654, 321654]
7 -> []
8 -> [38165472]
9 -> [381654729]

Ответы

5 ovs Nov 02 2020 at 19:28

05AB1E , 8 байт

LœJʒηāÖP

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

Прокомментировал :

L         # push [1..n]
 œ        # push all permutations
  J       # join each permutation into a number
   ʒ      # filter those numbers on:
    η     #   each prefix ...
      Ö   #   ... is divisible ...
     ā    #   ... by its index
       P  #   take the product (all)
5 xnor Nov 02 2020 at 21:12

Python 2 , 68 байт

lambda n:[`s`[:n]for s in 321654,381654729,123654][380712>>n*2&3::2]

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

Выводит список строк.


71 байт

lambda n:[0,1,12,[123,321],0,0,[123654,321654],0,38165472,381654729][n]

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

Просто скучный прямой код. Выводит одно число, или список из двух чисел, или 0, если нет вывода.

Ни один из других методов, которые я пробовал, не мог быть короче этого. Например, одна из идей состоит в том, чтобы генерировать числа как префиксы одного числа, генерируя подобное 123654/10**(6-i).

Метод объекта дает такую ​​же длину. К сожалению, мы не можем использовать гораздо более короткий вариант, .popпотому что он делает функцию недоступной для повторного использования, потому что она изменяет список при каждом вызове.

[0,1,12,[123,321],0,0,[123654,321654],0,38165472,381654729].__getitem__

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

Наложение самой длинной постоянной также дает такую ​​же длину:

lambda n,c=381654729:[0,1,12,[123,321],0,0,[123654,321654],0,c/10,c][n]

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

4 xash Nov 02 2020 at 18:43

J , 42 37 байт

Рассчитывает числа.

0({:#~0=[:+/#\|])@|:i.@!10&#.\@A.1+i.

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

  • 1+i. 1… п
  • i.@!…@A. все возможные перестановки 1… n
  • 10&#.\ преобразовать каждый префикс перестановки в число
  • 0(…)@|: транспонировать матрицу и…
  • #\|] 1… n модифицирует префиксы, например 1 2 3 | 1 12 123
  • 0=[:+/просуммировать результат; это 0?
  • {:#~ затем возьмите последний префикс перестановки (саму перестановку)
3 user Nov 02 2020 at 22:36

Scala, 81 80 байт

| =>1.to(|).mkString.permutations.filter{i=>1 to|forall(r=>i.take(r).toInt%r<1)}

Попробуй в Scastie

Пояснение:

| =>                          //n, the input
  1.to(|)                     //Range to n
    .mkString                 //Turn it into a string
    .permutations             //Get all permutations
    .filter{ i =>             //Filter them
      1 to | forall(r =>      //For every r from 1 to n
        i.take(r).toInt       //The number made from i's first r digits
          % r < 1             //Should be divisible by r
      )
    }
2 Neil Nov 02 2020 at 19:50

Уголь , 25 байт

NθΦEXχθIι⬤…·¹θ›№ιIλ﹪I…ιλλ

Попробуйте онлайн! Ссылка на подробную версию кода. Слишком медленно для n>5TIO. Пояснение:

Nθ

Вход n.

ΦEXχθIι

Перечислите все целые числа iдо 10ⁿ, чтобы ...

⬤…·¹θ

... для каждого целого числа lот 1до n...

›№ιIλ﹪I…ιλλ

l- это цифра, iа lпрефикс символа i- делится на l.

Чуть более быстрая 28-байтовая версия:

NθΦEX⊕θθ⍘ι⊕θ⬤…·¹θ›№ιIλ﹪I…ιλλ

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение: Создает цифры по основанию, n+1а не по основанию 10, что делает возможным завершение n=6по TIO.

Самая быстрая 29-байтовая версия с использованием сжатой таблицы поиска:

§⪪”)‴a3HSGS⸿Dπ¬Z⦄O<ε≔<πUθ8”0N

Попробуйте онлайн! Ссылка на подробную версию кода.

2 J42161217 Nov 02 2020 at 18:38

Язык Wolfram Language (Mathematica) , 78 байт

(f=FromDigits)/@Select[Permutations@Range[s=#],f@#[[;;k]]~Mod~k~Sum~{k,s}<1&]&

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

-8 байт от @att

2 Razetime Nov 03 2020 at 03:47

Шелуха , 15 байт

mdföΛIṠz¦ŀmdḣPḣ

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

Почти то же, что и другой вопрос, за исключением параметров.

2 Noodle9 Nov 02 2020 at 18:44

С (НКУ) -lm, 67 101 96 байт

Добавлено 34 байта, чтобы исправить ошибку, любезно указанную xnor . Сэкономлено
5 байт благодаря потолку !!!

f(n){write(1,"321654",n-3&&n-6?0:n);n=n<4?123/exp10(3-n):n>7?381654729/exp10(9-n):n-6?0:123654;}

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

Полное решение на основе поиска. Если есть два решения: одно выводит в stdout, а другое возвращает. Если есть только один ответ, он просто возвращается. Возврат \$0\$ если нет ответа.

Бонусный раунд для получения очков брауни

C (gcc) , 232 212 байт

Сэкономлено колоссальные 20 байт благодаря потолку !!!

p;m;j;char b[9],c[9];d;i;f(n){for(d=0,i=n;i;)d+=9*d+i--;for(sprintf(c,"%d",d);d/++i;)if(sprintf(b,"%d",i),qsort(b,n,1,L"\xf06be0f\xd02917beǃ"),!strcmp(b,c)){for(p=0,m=n,j=i;j;j/=10)p|=j%m--;p||printf("%d ",i);}}

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

Вычисляет правильные числа посредством вычислений и выводит их в stdout. Если нет ответа, ничего не выдает. Тайм-аут на TIO для \$n=9\$но делает их все 3m36.499sна моем ноутбуке.

2 JonathanAllan Nov 02 2020 at 18:44

Желе ,  11  10 байт

-1 спасибо caird coinheringaahing !

Это наивный метод, может быть и более лаконичный.

Œ!JḍḌƤẠƲƇḌ

Принимающая монадическая ссылка \$n\$что дает, 0если ничего не найдено, или список действительных чисел.

Попробуйте онлайн! Или посмотрите набор тестов .

Как?

Œ!JḍḌƤẠƲƇḌ - Link: n
Œ!         - all permutations of [1..n]
        Ƈ  - filter keep those (p for p in Œ!) for which:
       Ʋ   -   last four links as a monad f(p):
  J        -     range of length = [1..n]
     Ƥ     -     apply to prefixes (of p):
    Ḍ      -       un-decimal
   ḍ       -     divides? (vectorises)
      Ạ    -     all truthy?
         Ḍ - un-decimal
1 KjetilS. Nov 02 2020 at 20:41

Perl 5 , 64 байта

sub{grep"@_"==y///c,1,12,123,321,123654,321654,$x=38165472,$x.9}

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

1 Arnauld Nov 02 2020 at 22:55

JavaScript (V8) , 97 байт

Рекурсивная функция, которая вычисляет и печатает совпадающие целые числа.

f=(n,s='987654321'.slice(-n),d,p)=>p%d?0:s?[...s].map(v=>f(n,s.replace(v,''),-~d,[p]+v)):print(p)

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


JavaScript (ES6), 59 байт

Жесткое кодирование явно короче.

n=>[,1,12,[321,123],,,[321654,123654],,q=38165472,q+[9]][n]

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

att Nov 03 2020 at 02:48

Язык Wolfram Language (Mathematica) , 71 байт

f[s_:0,l_:0]=0!=##2&&l∣s&&If[l<#,##~f[10s+i,l+1]~i~Do~{i,#},Print@s]&

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

Звоните как f[][n]. Распечатывает результаты.

EngineerToast Nov 03 2020 at 13:32

Excel, 64 байта

=CHOOSE(A1,1,12,"123,321",,,"123654,321654",,38165472,381654729)

Вход находится в A1. Жестко закодированный ответ короче, чем был бы расчет.