Префиксная делимость
Вдохновение
Для целого положительного числа \$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]
Ответы
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)
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]
Попробуйте онлайн!
J , 42 37 байт
Рассчитывает числа.
0({:#~0=[:+/#\|])@|:i.@!10&#.\@A.1+i.
Попробуйте онлайн!
1+i.1… пi.@!…@A.все возможные перестановки 1… n10&#.\преобразовать каждый префикс перестановки в число0(…)@|:транспонировать матрицу и…#\|]1… n модифицирует префиксы, например1 2 3 | 1 12 1230=[:+/просуммировать результат; это 0?{:#~затем возьмите последний префикс перестановки (саму перестановку)
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
)
}
Уголь , 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
Попробуйте онлайн! Ссылка на подробную версию кода.
Язык Wolfram Language (Mathematica) , 78 байт
(f=FromDigits)/@Select[Permutations@Range[s=#],f@#[[;;k]]~Mod~k~Sum~{k,s}<1&]&
Попробуйте онлайн!
-8 байт от @att
Шелуха , 15 байт
mdföΛIṠz¦ŀmdḣPḣ
Попробуйте онлайн!
Почти то же, что и другой вопрос, за исключением параметров.
С (НКУ) -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на моем ноутбуке.
Желе , 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
Perl 5 , 64 байта
sub{grep"@_"==y///c,1,12,123,321,123654,321654,$x=38165472,$x.9}
Попробуйте онлайн!
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]
Попробуйте онлайн!
Язык 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]. Распечатывает результаты.
Excel, 64 байта
=CHOOSE(A1,1,12,"123,321",,,"123654,321654",,38165472,381654729)
Вход находится в A1. Жестко закодированный ответ короче, чем был бы расчет.