Відмовтеся від усіх квадратів, ви розділили мене


37

Визначення

  • Ідеальний квадрат представляє собою ціле число , яке може бути виражено як квадрат іншого цілого числа. Наприклад, 36ідеальний квадрат, оскільки 6^2 = 36.
  • Без квадратного числа - це ціле число, яке не ділиться жодним досконалим квадратом, за винятком на 1. Наприклад, 10це квадратне число. Однак 12це не квадратне число, тому що 12ділиться на 4і 4є ідеальним квадратом.

Завдання

nДавши додатне ціле число , виведіть найбільше квадратне вільне число, яке ділиться n.

Тестові шафи

n   output
1   1
2   2
3   3
4   2
5   5
6   6
7   7
8   2
9   3
10  10
11  11
12  6
13  13
14  14
15  15
16  2
17  17
18  6
19  19
20  10
21  21
22  22
23  23
24  6
25  5
26  26
27  3
28  14
29  29
30  30
31  31
32  2
33  33
34  34
35  35
36  6
37  37
38  38
39  39
40  10
41  41
42  42
43  43
44  22
45  15
46  46
47  47
48  6
49  7
50  10

Оцінка балів

Це . Найкоротша відповідь у байтах виграє.

Застосовуються стандартні лазівки .

Довідково


1
... і називається радикальним - так 1980-ті!
Джонатан Аллан

Тісно пов'язані , просто помножте два виходи. Редагувати: Неважливо, вона збігається лише на кубічні числа.
xnor

Відповіді:


45

05AB1E , 2 байти

fP

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

Як це працює

f   Implicitly take input and compute the integer's unique prime factors.
 P  Take the product.

26
> _> справді ... ??
HyperNeutrino

@HyperNeutrino так - якщо число не є квадратним, це тому, що деякі його основні коефіцієнти мають кратність.
Джонатан Аллан

@JonathanAllan Мене просто цікавить вбудований для унікальних основних факторів. Я б хотів, щоб у Джеллі був один із таких ...
HyperNeutrino

@HyperNeutrino Це 05AB1E, звикніть до цього. 05AB1E має кілька справжніх вбудованих елементів, які, очевидно, економить байти.
Ерік Атголфер

6
Виправлення, "збереження байтів", напевно, про це немає.
Draco18s

14

Брахілог , 3 байти

ḋd×

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

Дуже оригінальна відповідь ...

Пояснення

ḋ          Take the prime factors of the Input
 d         Remove duplicates
  ×        Multiply

1
Знову ж таки, Брахілог б'є Желі, бо двобайтний атом тут лише один байт. > :-P
HyperNeutrino

4
Желе з великою кількістю вбудованих часто сприймається як перевага; але більше вбудованих означає, що їм в середньому потрібні довші імена. Тож існують компроміси, які беруть участь у розробці мови для гольфу.

2
Я не намагаюся бути "тим хлопцем", і, можливо, я просто неправильно розумію підрахунок байтів, але хіба це не 6 байт? mothereff.in/byte-counter#ḋd ×
Людина капітана

5
@CaptainMan Brachylog використовує спеціальну кодову сторінку 256 символів, яку ви можете знайти тут .
Фаталізувати

14

JavaScript (ES6), 55 54 50 46 байт

Цитуючи OEIS :
a (n) - найменший дільник u з n, такий, що n ділить u ^ n

Оновлена ​​реалізація:
a (n) - найменший дільник u на n додатного цілого числа u такий, що n ділить u ^ n

let f =

n=>(g=(p,i=n)=>i--?g(p*p%n,i):p?g(++u):u)(u=1)

for(n = 1; n <= 50; n++) {
  console.log(n,f(n));
}


Гарний підхід до проблеми, особливо. враховуючи відсутність вбудованої факторизації
Riking

12

MATL , 6 4 байти

2 байти збережено за допомогою @LeakyNun

Yfup

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

Пояснення

Розглянемо вхід 48.

Yf   % Implicit input. Push prime factors with repetitions.  STACK: [2 2 2 2 3]
u    % Unique.                                               STACK: [2 3]
p    % Product of array. Implicit display.                   STACK: 6


@LeakyNun Хе, я збирався дописати це :-) Спасибі
Луїс Мендо


9

CJam , 8 байт

rimf_&:*

Чому кожна операція в цій програмі повинна складати 2 байти -_-

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

ri       e# Read int from input
  mf     e# Get the prime factors
    _&   e# Deduplicate
      :* e# Take the product of the list

Я не міг знайти спосіб дедуплікації. Приємно!
Луїс Мендо

@LuisMendo Я нещодавно це відкрив. Я завжди думав, що це мультисезонне перехрестя, але, мабуть, це просто звичайне встановлене перехрестя.
Ділова кішка

9

Сітківка , 36 30 28 байт

+`((^|\3)(^(1+?)|\3\4))+$
$3

Введення та вихід уніар .

Спробуйте в Інтернеті! (Включає колонтитул і колонтитул для десяткового <-> нерівномірного перетворення та запуску декількох тестових випадків одночасно.)

Пояснення

Ідея полягає у тому, щоб відповідати вхідному значенню як квадратний раз деякому фактору. Основний регулярний вираз для зіставлення квадрата використовує прямий посилання для відповідності сум послідовних непарних цілих чисел:

(^1|11\1)+$

Оскільки ми не хочемо відповідати ідеальним квадратам, але числа, які поділяються на квадрат, ми замінюємо його 1на саму зворотну відповідь:

(^(1+?)|\1\2\2)+$

Отже, зовнішня група 1буде використана n разів, де n 2 - найбільший квадрат, який ділить вхідні дані, а група 2зберігає фактор, що залишився. Ми хочемо - ділити ціле число на n, щоб видалити квадрат. Результат можна виразити як кількість повторень групової групи 1часу 2, але це зробити трохи непросто. Retina - х $*, ймовірно , скоро буде покращено , щоб взяти несімвольний маркер в його правий аргумент в цьому випадку ми могли б просто замінити це $#1$*$2, але поки не працює.

Натомість ми розкладаємо непарні числа по-різному. Повернемося до більш простого прикладу відповідності ідеальних квадратів (^1|11\1)+$. Замість того, щоб мати лічильник, \1який ініціалізується на 1 і збільшується на 2 на кожній ітерації, у нас буде два лічильника. Один ініціалізується на 0, а один ініціалізується на 1 , і обидва вони збільшуються на 1 на кожній ітерації. Отже, ми в основному розклали непарні числа 2n + 1 на (n) + (n + 1) . Перевага полягає в тому , що ми в кінцевому підсумку з п в одній з груп. У своєму найпростішому вигляді це виглядає так:

((^|1\2)(^1|1\3))+$

Там , де \2це п і \3є п + 1 . Тим НЕ менше, ми можемо зробити це трохи більш ефективно, помітивши , що п + 1 однієї ітерації дорівнює п наступної ітерації, так що ми можемо заощадити на 1тут:

((^|\3)(^1|1\3))+$

Тепер нам просто потрібно повернутися до використання початкового коефіцієнта, а не 1для введення даних, розділених ідеальним квадратом:

((^|\3)(^(1+?)|\3\4))+$

Тепер все, що нам потрібно зробити, це замінити всю цю річ $3 на кінець, який зберігає початковий коефіцієнт, менший за кількість кроків, який випадає з введення одного фактора квадрата.

Це робиться неодноразово +на початку програми для врахування входів, що містять більші потужності, ніж квадрати.


8

Октава, 27 байт

@(x)prod(unique(factor(x)))

Аналогічний підхід, як і інші відповіді. Різниця полягає в тому, що функції мають набагато довші назви. Я вважаю, що код пояснює себе справді: Бере prodукт uniqueпросте factorчисло числа.


Ви ніндзя ви мене до ~ 30 секунд :)
Kritixi Lithos


7

Мова Вольфрама, 29 28 байт

-1 Завдяки @Martin Ender ♦

Most[1##&@@FactorInteger@#]&

Пояснення:

           FactorInteger@#    (*Get prime factorization as {{a,b},{c,d}}*)
     1##&@@                   (*Multiply list elements together, to get the product of the factors and the product of their exponents*)
Most[                     ]&  (*Take the first element*)

2
Щойно зрозумів, що це в основному @ коментар ГрегаМартіна на відповідь Mathics, тільки менше гофрований ...
Скотт Мілнер

Не почувайтеся погано, у мене була ще менш гостра відповідьTimes@@(#&@@@FactorInteger@#)&
Іван Міллер

Mostзалишає це як список. Вам потрібно Firstотримати значення.
Ян Міллер

@IanMiller Я це розумію, але це менше байтів, щоб просто повернути список лише з одним елементом. Я припустив, що це нормально, оскільки це все-таки розумний вихід.
Скотт Мілнер

7

Пітон , 37 байт

f=lambda n,r=1:1>>r**n%n or-~f(n,r+1)

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

Найбільший квадратний дільник на nце найменше число rз усіма nосновними факторами. Ми можемо перевірити це як r**n%n==0, оскільки r**nробимо nкопії кожного основного коефіцієнта r, і ділимося nлише за умови, що представлений кожен з nосновних факторів.

1>>r**n%nЕквівалентно int(r**n%n==0). Якщо Trueможна використовувати вихід 1, це зробити на 2 байти коротше.

f=lambda n,r=1:r**n%n<1or-~f(n,r+1)

6

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

Times@@(Transpose@FactorInteger@#)[[1]]&

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


Times@@#&@@Transpose@FactorInteger@#&економить 3 байти ( #&@@це стандартний трюк, [[1]]і у таких випадках він часто може зберегти зайві байти в дужках).
Мартін Ендер

Ви також можете використовувати Threadзамість Transpose. У Mathematica також є 3-байтний оператор для Transpose, але я не знаю, чи підтримує Mathics це.
Мартін Ендер

6
#&@@(1##&@@FactorInteger@#)&уникає необхідності Transposeвзагалі. ( 1##&@@Тільки Times@@в маскуванні, яка прекрасно працює на впорядкованих пари , які забезпечуються FactorInteger, і '#&@@це First@в маскуванні.)
Грег Мартін

@GregMartin - це в основному ваше власне рішення, сміливо публікуйте його, якщо хочете.
Павло

Схоже, Скотт Мілнер все одно це отримав :)
Грег Мартін

5

Аліса , 4 байти

iDo@

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

Введення та вихід подаються як кодова точка символу (працює для всіх дійсних точок коду Unicode).

Пояснення

Ну, Аліса має вбудований Dмодуль, дефініція якого - "Подвійні прості фактори". Тобто до тих пір, поки значення ділиться на деяке p 2 для простого p , розділіть це значення на p . Це буває саме тією функцією, яка вимагається в цьому виклику. Решта - лише введення, вихід, завершення програми.

Причина, яку це додали до Аліси, насправді не має нічого спільного з цілою цілою послідовністю. Я намагався дотримуватися теми асоціації дільників з підрядками та простими факторами з символами. І мені була потрібна функція, яка поєднується з "подвійними символами" (що набагато корисніше загалом, тому що вона дозволяє вам трактувати рядки як набори, особливо якщо вони використовуються разом з різними операторами мультисети).


The sad part is, even with a builtin this isn't the shortest answer.
Rɪᴋᴇʀ

@Riker Well, that's because Alice isn't a golfing language so it needs explicit I/O and (since it's a 2D language) program termination.
Martin Ender

Yeah, still somewhat sad though.
Rɪᴋᴇʀ

@ConorO'Brien We just had this discussion elsewhere, and that's only valid if the stand-alone operator is an expression which evaluates to the function (which isn't the case here, since functions/operators aren't first-class values). codegolf.meta.stackexchange.com/a/7206/8478
Martin Ender

@ConorO'Brien sorry that was an exclusive "we".
Martin Ender





1

Pyth, 8 6 bytes

*F+1{P

*-2 bytes thanks to @LeakyNun

Would be 3 if Pyth had a built-in for products of lists...

Try it!

*F+1{P
      Q     # Implicit input
     P      # Prime factors of the input
    {       # Deduplicate
  +1        # Prepend 1 to the list (for the case Q==1)
*F          # Fold * over the list

You can use *F+1{P instead.
Leaky Nun

1

C, 65 50 bytes

Thanks to @Ørjan Johansen for removing the need for r. Thanks to this and some other dirty tricks I was able to squeeze 15 bytes off!

d;f(n){for(d=1;d++<n;)n%(d*d)||(n/=d--);return n;}

while is gone and replaced with || and index twiddling. <= should have been < all along.

<= turned to < by moving the increment to get n%(++d*d) (should be well defined due to operator precedence).


Original code:

d;r;f(n){for(r=d=1;d++<=n;)while(n%d<1)r*=r%d?d:1,n/=d;return r;}

I think you can shorten it by removing r and instead use while(n%(d*d)<1)n/=d;.
Ørjan Johansen

@ØrjanJohansen That seems right. I was thinking construction rather than reduction. I have some additional improvements to add, will update soon.
algmyr

++d*d is absolutely not well defined by the C standards - it's a classic case of explicitly undefined behavior. But we're going by implementations here, anyway.
Ørjan Johansen

Actually, shouldn't d++<n, which is well defined, still work? I think the old version went all the way to n+1 (harmlessly).
Ørjan Johansen

You're probably right about the undefined behavior. For some reason I thought that operator precedence would solve that. Most examples I've seen of UB uses same priority operators, but of course there is a data race here as well. You're also right about d++<n being correct, for some reason I didn't see that when I rewrote the code.
algmyr

0

Axiom, 89 bytes

f(x:PI):PI==(x=1=>1;g:=factor x;reduce(*,[nthFactor(g,i) for i in 1..numberOfFactors g]))

test and results

(38) -> [[i, f(i)] for i in 1..30 ]
   (38)
   [[1,1], [2,2], [3,3], [4,2], [5,5], [6,6], [7,7], [8,2], [9,3], [10,10],
    [11,11], [12,6], [13,13], [14,14], [15,15], [16,2], [17,17], [18,6],
    [19,19], [20,10], [21,21], [22,22], [23,23], [24,6], [25,5], [26,26],
    [27,3], [28,14], [29,29], [30,30]]

this is the one not use factor() function

g(x:PI):PI==(w:=sqrt(x);r:=i:=1;repeat(i:=i+1;i>w or x<2=>break;x rem i=0=>(r:=r*i;repeat(x rem i=0=>(x:=x quo i);break)));r)

but it is only 125 bytes


0

R, 52 bytes

`if`((n=scan())<2,1,prod(unique(c(1,gmp::factorize(n))))

reads n from stdin. Requires the gmp library to be installed (so TIO won't work). Uses the same approach as many of the above answers, but it crashes on an input of 1, because factorize(1) returns an empty vector of class bigz, which crashes unique, alas.


This outputs 12 when I input 12.
Flounderer

@Flounderer you are correct, I have updated the code.
Giuseppe



0

Pyt, 3 bytes

←ϼΠ

Explanation:

←                  Get input
 ϼ                 Get list of unique prime factors
  Π                Compute product of list
                   Implicit print
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.