Скільки розділів містять лише ідеальні квадрати?


16

Давши невід'ємне ціле число або список цифр, визначте, скільки способів може бути утворене число шляхом об'єднання квадратних чисел, які можуть мати нульові нулі.

Приклади

input -> output # explanation
164 -> 2 # [16, 4], [1, 64]
101 -> 2 # [1, 01], [1, 0, 1]
100 -> 3 # [100], [1, 00], [1, 0, 0]
1 -> 1 # [1]
0 -> 1 # [0]
164900 -> 9 # [1, 64, 9, 0, 0], [1, 64, 9, 00], [1, 64, 900], [16, 4, 900], [16, 4, 9, 0, 0], [16, 4, 9, 00], [16, 49, 0, 0], [16, 49, 00], [16, 4900]

Правила

  • Застосовуються стандартні лазівки
  • Це тому найкоротша відповідь у байтах виграє


Чи можемо ми взяти введення як список цифр?
повністюлюдський

чому 1 -> 1, але 0 -> 0?
Йона

@Jonah Typo ... xD
HyperNeutrino

1
@totallyhuman Звичайно.
HyperNeutrino

Відповіді:



7

Желе , 8 байт

ŒṖḌƲẠ€S

Монадічне посилання, що містить список цифр і повертає невід'ємне ціле число.

Спробуйте в Інтернеті! або перегляньте тестовий набір .

Як?

ŒṖḌƲẠ€S - Link: list of digits              e.g. [4,0,0,4]
ŒṖ       - all partitions                         [[4,0,0,4],[4,0,[0,4]],[4,[0,0],4],[4,[0,0,4]],[[4,0],0,4],[[4,0],[0,4]],[[4,0,0],4],[4,0,0,4]]
  Ḍ      - convert from decimal list (vectorises) [[4,0,0,4],[4,0,   4 ],[4,    0,4],[4,      4],[   40,0,4],[   40,    4],[    400,4],     4004]
   Ʋ    - is square? (vectorises)                [[1,1,1,1],[1,1,   1 ],[1,    1,1],[1,      1],[    0,1,1],[    0,    1],[      1,1],        0]
     Ạ€  - all truthy? for €ach                   [        1,          1,          1,          1           0,            0,          1,        0]
       S - sum                                    5

6

Хаскелл , 88 байт

f x=sum[0.5|y<-mapM(\c->[[c],c:" "])x,all((`elem`map(^2)[0..read x]).read).words$id=<<y]

Визначає функцію, fяка займає рядок і повертає поплавок. Дуже повільно. Спробуйте в Інтернеті!

Пояснення

Я використовую підказку Haskell для обчислення всіх розділів рядка з mapMта words. Фрагмент mapM(\c->[[c],c:" "])xзамінює кожен символ 'c'рядка xабо одноелементною рядком, "c"або двоелементною рядком "c ", і повертає список усіх можливих комбінацій. Якщо я візьму один з результатів, yз'єднаю його і закликаю wordsрезультат, він розділиться на пробіли, вставлені символом mapM. Таким чином я отримую всі розділи xна суміжні підрядки. Тоді я просто підраховую ті результати, де кожен елемент розділу є ідеальним квадратом (знаходячи його у списку [0,1,4,9,..,x^2]). Застереження полягає в тому, що кожний розділ рахується двічі, з проміжком і без нього, тому я беру суму0.5s замість 1s; саме тому типом результату є поплавок.

f x=                       -- Define f x as
 sum[0.5|                  -- the sum of 0.5 for
  y<-                      -- every y drawn from
  mapM(\c->[[c],c:" "])x,  -- this list (explained above)
                           -- (y is a list of one- and two-element strings)
  all(...)                 -- such that every element of
                 id=<<y]   -- concatenated y
          .words$          -- split at spaces satisfies this:
                           -- (the element is a string)
   (...).read              -- if we convert it to integer
    `elem`                 -- it is an element of
    map(^2)                -- the squares of
    [0..read x]            -- the numbers in this list.


4

Python 3 , 148 139 135 134 байт

10 байт завдяки Арнольду Палмеру.

def f(a):
 s=[a[:1]]
 for i in a[1:]:s=sum([[x+[i],x[:-1]+[x[-1]*10+i]]for x in s],[])
 return sum({n**.5%1for n in x}=={0}for x in s)

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


Я б ще раз перевірив це, але я вважаю, що це працює. 140 символів.
Арнольд Палмер

Я заграв і залишив пробіл між %1і for...
Арнольд Палмер

Заміна [[a[0]]]на [a[:1]]врятує байт
Арнольд Палмер

Разом ми перемогли Haskell.
Leaky Nun

Найкраще те, що частково це було завдяки наборам, якими я ніколи не користувався, поки ви вчора не опублікували мою відповідь про черепаху .
Арнольд Палмер

2

Математика, 141 байт

Count[FreeQ[IntegerQ/@Sqrt[FromDigits/@#],1<0]&/@(FoldPairList[TakeDrop,s,#]&/@Flatten[Permutations/@IntegerPartitions[Length[s=#]],1]),1>0]&


введення (перелік цифр)

[{1,6,4}]


Я думаю, що це дає неправильну відповідь за 1649 рік: я рахую три розділи, які складають квадрати (а саме {1,64,9}, {16,4,9}і {16,49}), але ваша функція повертається 4.
Не дерево

Крім того, я помітив, що ви використовували такі конструкції, як Table[(function of s[[i]]),{i,Length[s=(stuff)]}]кілька разів; Зазвичай ви можете пограти в гольф (function of #)&/@(stuff).
Не дерево

1
@Notatree ви абсолютно праві! Я вніс багато змін, дотримувався ваших інструкцій, і це працює як шарм! дякую
J42161217

2

Python 2 , 173 163 байт

lambda s:len([l for l in[''.join(sum(zip(s,[','*(n>>i&1)for i in range(len(s))]+['']),())).split(',')for n in range(2**~-len(s))]if {int(x)**.5%1for x in l}=={0}])

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

Редагувати: Збережено 10 байт завдяки ArnoldPalmer


1
Чи можете ви зберегти байт, використовуючи .5замість 0.5?
numbermaniac

Ти можеш. Ви також можете зберегти кілька байтів тим самим трюком, який я витягнув на пошті Leaky Nun's Python 3. Крім того, у вашій відповіді було не друковано кількість елементів, а самі елементи, тому я додав це. Якщо ви хочете зберегти отриманий результат, це мінус додаткові 5 байт. 163 байти
Арнольд Палмер

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