Як закінчується квадрат?


20

У Базі-10 всі ідеальні квадрати закінчуються на 0 , 1 , 4 , 5 , 6 або 9 .

У Base-16 усі ідеальні квадрати закінчуються на 0 , 1 , 4 або 9 .

Nilknarf описує , чому це і як вирішити цю проблему дуже добре в цьому відповіді, але я також дати опис коротко тут:

При квадраті числа Base-10, N , на цифру "ті" не впливає значення "десятки" або цифри "сотні" тощо. Тільки цифра "ті" в N впливає на цифру "ті" в N 2 , тому простий (але, можливо, не найголовніший) спосіб знайти всі можливі останні цифри для N 2 - знайти n 2 mod 10 для всіх 0 <= n < 10 . Кожен результат є можливою останньою цифрою. Для Base-m ви можете знайти n 2 mod m для всіх 0 <= n < m .

Напишіть програму, яка при введенні N виводить усі можливі останні цифри для ідеального квадрата в Base-N (без дублікатів). Ви можете припустити, що N більший за 0 , і що N достатньо малий, щоб N 2 не переповнюється (Якщо ви зможете протестувати до N 2 , я дам вам обмежену кількість очок брауні, але знайте, що обмінний курс окулярів до реальних точок - нескінченність до одиниці).

Тести:

 Input -> Output
 1     -> 0
 2     -> 0,1
 10    -> 0,1,5,6,4,9
 16    -> 0,1,4,9
 31    -> 0,1,2,4,5,7,8,9,10,14,16,18,19,20,25,28
 120   -> 0,1,4,9,16,24,25,36,40,49,60,64,76,81,84,96,100,105

це , тому застосовуються стандартні правила!

(Якщо вам це здається занадто простим, або ви хочете більш глибоке запитання по цій темі, врахуйте це питання: Мінімальне покриття підстав для квадратичного випробування залишків квадратності ).


1
Чи потрібно сортувати вихідний масив?
Shaggy

@Shaggy Nope! Мего, копіювання заборонено. Теоретично, N може бути величезним, тому дублікати зробили б результат нечитабельним. Я
додам

Чи прийнятний вихід набору?
повністюлюдський

2
@totallyhuman Чому це не було б дійсним? Набори - це не упорядковані колекції, і їх не слід сортувати , тому ...
Містер Xcoder

Відповіді:



19

Google Таблиці, 52 51 47 байт

=ArrayFormula(Join(",",Unique(Mod(Row(A:A)^2,A1

Збережено 4 байти завдяки Тейлору Скотту

Аркуші автоматично додадуть 4 кінцевих дужки в кінець формули.

Він не повертає результати у порядку зростання, але повертає правильні результати.

Results


Свята корова, чоловіче, що вбивчий вбивство! Хто б міг подумати? +1
bearacuda13

1
Це, безумовно, моя улюблена відповідь поки що.
Lord Farquaad

@LordFarquaad Я здивований і задоволений, що це було так добре прийнято. Я намагаюся більше займатися гольфом у Sheets та Excel, хоча, і частково тому, що вони мають такі обмежені дальності. Це призвело до безлічі формул масиву.
Інженер Тост

Ви повинні мати можливість скинути закінчення )s на 4 байти
Тейлор Скотт,

@TaylorScott Дякую! Я бачив цей трюк десь недавно - напевно, на одній із ваших відповідей - і потрібно пам’ятати, щоб почати його використовувати.
Інженер Тост

6

05AB1E , 5 байт

Lns%ê

Спробуйте в Інтернеті! або як тестовий набір

L     # Range 1 .. input
 n    # Square each
  s%  # Mod by input
    ê # Uniquify (also sorts as a bonus)

Як sтут працює? Чи введення повторюється?
Луїс Мендо

@LuisMendo sє pop a,b; push b,a. Коли команда намагається вискакувати щось із стека, і нічого не залишилося, використовується наступний вхід. Якщо більше немає вводу, використовується останній вхід ( ось приклад ). У цьому випадку я міг би скористатися тим, ¹що натискає перший вхід, але sкраще працює для тестового набору.
Райлі

Спасибі. Чи є у вас більше інформації щодо критерію, для якого введення використовується повторно? (якщо було сказано три входи, і ви намагаєтеся вивести два значення з порожнього стека)?
Луїс Мендо

1
@LuisMendo Input використовується для того, доки його не закінчиться, потім він продовжує використовувати останній елемент. Ви можете уявити це так, як стек був укладений з кожним входом у порядку і нескінченною кількістю останнього елемента.
Райлі

@LuisMendo Ln¹%êтут рівнозначний. s.
Magic Octopus Urn

6

Швидкий , 47 35 32 * байт

* -3 завдяки @Alexander.

Можливо, вперше в історії Швидкі зв'язки обіграли Python?

{m in Set((0..<m).map{$0*$0%m})}

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


Пояснення

  • (0..<m).map{}- Ітерація через діапазон [0...m)і відображення наступних результатів:

  • $0*$0%m- квадрат кожного цілого модуля основи m.

  • Set(...) - Вилучає дублікати.

  • m in - Призначає базу змінної m


Ім'я користувача перевіряється ... зачекайте секунду.
Rohan Jhunjhunwala

1
Більше, як це б'є Python. Це вражає ! Я думав, що ніколи не побачу день, коли це станеться.
Caleb Kleveter

@CalebKleveter Дякую! Я радий, що ви це вразили :)
Містер Xcoder


3

JavaScript (ES6), 52 байти

f=(m,k=m,x={})=>k?f(x[k*k%m]=m,k-1,x):Object.keys(x)

Тестові кейси


Нерекурсивна версія, 60 58 байт

Збережено 2 байти завдяки @ThePirateBay

m=>(a=[...Array(m).keys()]).filter(v=>a.some(n=>n*n%m==v))

Тестові кейси


Нерекурсивний 58 байт:m=>(a=[...Array(m).keys()]).filter(v=>a.some(n=>n*n%m==v))

@ThePirateBay Хороший улов. Спасибі.
Арнольд


3

Брахілог , 10 9 байт

>ℕ^₂;?%≜ᶠ

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

Пояснення

       ≜ᶠ       Find all numbers satisfying those constraints:
    ;?%           It must be the result of X mod Input where X…
  ^₂              …is a square…
>ℕ                …of an integer in [0, …, Input - 1]

Я збирався запропонувати {>≜^₂;?%}ᵘяк альтернативу ... тоді я зрозумів, що є і негативні числа. > _ <
Ерік Аутгольфер

1
@EriktheOutgolfer Після того, як комісія потрапила в TIO, я можу фактично зменшити цю відповідь на 9 байт, використовуючи .
Фаталізувати

Гаразд ... як би це працювало, коли є і негативні числа? Це просто їх ігнорувати чи щось таке?
Ерік Аутгольфер

@EriktheOutgolfer mod можна визначити як залишок поділу, який був би позитивним (коефіцієнт приймає знак). EDIT: також квадрати позитивні.
jaxad0127

@ jaxad0127 Я не думаю, що це так і є, оскільки >все-таки припадає на негативні числа afaik.
Ерік Аутгольфер

3

Japt , 7 6 байт

Dz%UÃâ

Перевірте це

1 байт збережено завдяки Оліверу


Пояснення

Неявне введення цілого числа U.

Ç   Ã

Створити масив цілих чисел від 0до U-1, включно і роз'їхатися , хоча функція.

²

Майдан.

%U

Модуло U.

â

Отримати всі унікальні елементи у масиві та неявно вивести результат.


1
Я не думаю, що діапазон не повинен включати. Dz%UÃâздається, працює добре.
Олівер

2

Python 3 , 40 39 37 байт

-1 байт завдяки спадару Xcoder. -2 байти завдяки Business Cat.

lambda m:[*{n*n%m for n in range(m)}]

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


1
Ви не можете замінити n**2їх n*n?
Містер Xcoder

Так, завжди забувай це. > <Дякую!
повністюлюдський

2
Також просто range(m)достатньо
Ділова кішка

1
Ви можете використовувати набори для 34 байт
Містер Xcoder



2

Haskell , 45 байт

import Data.List
f m=nub[n^2`mod`m|n<-[0..m]]

-4 байти від Anders Kaseorg

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


На жаль, без точкової версії f m=nub$map((`mod`m).(^2))[0..m]так само довго, якщо тільки не існує підлий синтаксис, щоб позбутися зайвих дужок.
shooqie




1

JavaScript (ES6), 48 байт

f=
n=>[...new Set([...Array(n)].map((_,i)=>i*i%n))]
<input type=number min=0 oninput=o.textContent=f(+this.value)><pre id=o>

43 байти, якщо повернення Setзамість масиву є прийнятним.


1

Scala , 32 30 байт

Просте використання легкого наконечника від OP.

(0 to n-1).map(x=>x*x%n).toSet

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

-2 байт завдяки @MrXcoder, з пріоритетами (немає необхідності ()навколо *операції)

Цікаво: чи можливо це неявно сказати компілятору зрозуміти такі речі, як (0 to n-1)map(x=>x*x%n)toSet(без цього import scala.language.postfixOps)?


1
(0 to n-1).map(x=>x*x%n).toSetза 30 байт. Експоненціація має більшу перевагу, ніж модуль.
Містер Xcoder

@ Mr.Xcoder ooh ~ спасибі :)
В. Куртуа




0

Perl 6 , 19 байт

{set (^$_)»²X%$_}

Перевірте це

Розширено:

{ # bare block lambda with implicit param 「$_」

  set        # turn the following into a Set (shorter than 「unique」)

      (
        ^$_  # a Range upto (and excluding) 「$_」
      )»²    # square each of them (possibly in parallel)

    X%       # cross modulus the squared values by

      $_     # the input
}

0

Pyth , 13 байт

VQ aY.^N2Q){Y

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

Зненацька спроба пояснити:

VQ               for N in [0 .. input-1]
                   blank space to supress implicit print inside the loop
     .^N2Q         N ^ 2 % input
   aY              append that to Y, which is initially an empty list
          )      end for
           {Y    deduplicate and implicit print

Щоб сортувати вихід, вставте а Sз будь-якої сторони{

Я думаю, що має бути коротший шлях ...


1
Так, функціональний стиль Pyth, як правило, набагато більш стислий . mapтвій друг!
Anders Kaseorg





0

PHP , 53 байти

for(;$i<$t=$argv[1];)$a[$z=$i++**2%$t]++?:print"$z
";

Проведіть цикл від 0 до вхідного номера, використовуючи n^2 mod baseформулу для позначення використаних чисел. Він переходить до цієї позиції в масиві, перевіряючи, чи він був збільшений, і виводить його, якщо він ні. Потім він збільшує його згодом, щоб повторювані значення не надрукувалися.

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


0

8-е , 138 131 байт

Код

[] swap dup >r ( 2 ^ r@ n:mod a:push ) 1 rot loop rdrop ' n:cmp a:sort ' n:cmp >r -1 a:@ swap ( tuck r@ w:exec ) a:filter rdrop nip

Пояснення

[] - Створення вихідного масиву

swap dup >r - Збережіть вхід для подальшого використання

( 2 ^ r@ n:mod a:push ) 1 rot loop - Обчислити квадратний кінець

rdrop - Очистіть r-стек

' n:cmp a:sort - Сортувати вихідний масив

' n:cmp >r -1 a:@ swap ( tuck r@ w:exec ) a:filter rdrop nip - Позбудьтеся послідовних дублікатів з масиву

SED (діаграма ефектів стека):a -- a

Використання та приклад

: f [] swap dup >r ( 2 n:^ r@ n:mod a:push ) 1 rot loop rdrop ' n:cmp a:sort ' n:cmp >r -1 a:@ swap ( tuck r@ w:exec ) a:filter rdrop nip ;

ok> 120 f .
[0,1,4,9,16,24,25,36,40,49,60,64,76,81,84,96,100,105]

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