Jak kończy się kwadrat?

20

W Base-10 wszystkie idealne kwadraty kończą się cyframi 0 , 1 , 4 , 5 , 6 lub 9 .

W Base-16 wszystkie idealne kwadraty kończą się cyframi 0 , 1 , 4 lub 9 .

Nilknarf opisuje, dlaczego tak jest i jak to bardzo dobrze rozwiązać w tej odpowiedzi, ale dam również krótki opis tutaj:

Kwadratowa liczba Base-10, N , cyfra „jedynki” nie ma wpływu na to, co jest w cyfrze „dziesiątki” lub cyfra „setki” i tak dalej. Tylko cyfra „jedynki” w N wpływa na cyfrę „jedynki” w N 2 , więc łatwym (ale może nie najbardziej golfowym) sposobem znalezienia wszystkich możliwych ostatnich cyfr dla N 2 jest znalezienie n 2 mod 10 dla wszystkich 0 <= n < 10 . Każdy wynik jest możliwą ostatnią cyfrą. Dla Base-m można znaleźć n 2 mod m dla wszystkich 0 <= n < m .

Napisz program, który otrzyma wejście N , wypisuje wszystkie możliwe ostatnie cyfry idealnego kwadratu w Base-N (bez duplikatów). Możesz założyć, że N jest większe od 0 i że N jest wystarczająco małe, aby N 2 się nie przelał (jeśli możesz przetestować aż do N 2 , dam ci skończoną liczbę punktów brownie, ale wiedz, że kurs wymiany punktów brownie na punkty rzeczywiste wynosi nieskończoność do jednego).

Testy:

 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

to jest , więc obowiązują standardowe zasady!

(Jeśli uznasz to za zbyt łatwe lub chcesz uzyskać bardziej dogłębne pytanie na ten temat, rozważ to pytanie: Minimalne pokrycie zasad dla kwadratowego badania pozostałości kwadratowości ).

Lord Farquaad
źródło
1
Czy tablica wyjściowa musi zostać posortowana?
Kudłaty
@Shaggy Nope! Mego, powielanie jest niedozwolone. Teoretycznie N może być ogromny, więc duplikaty spowodują, że wynik będzie bardzo nieczytelny. Odpowiem na pytanie
Lord Farquaad,
Czy wyjście zestawu jest dopuszczalne?
całkowicieludzki 27.07.17
2
@totallyhuman Dlaczego to nie byłoby ważne? Zestawy są nieuporządkowanymi kolekcjami i nie można ich sortować , więc ...
Mr. Xcoder

Odpowiedzi:

8

Galaretka , 5 bajtów

R²%³Q

Wypróbuj online!

Wyjaśnienie

R²%³Q   Main link, argument: n

R       Range from 1 to n
 ²      Square each
  %³    Mod each by n
    Q   Deduplicate
Business Cat
źródło
19

Arkusze Google, 52 51 47 bajtów

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

Zaoszczędź 4 bajty dzięki Taylor Scott

Arkusze automatycznie dodają 4 nawiasy zamykające na końcu formuły.

Nie zwraca wyników w kolejności rosnącej, ale zwraca prawidłowe wyniki.

Results

Inżynier Toast
źródło
Święta krowa, człowiek, który jest zabójcą! Kto by pomyślał? +1
bearacuda13
1
To zdecydowanie moja ulubiona odpowiedź.
Lord Farquaad
@ LordFarquaad Jestem zaskoczony i zadowolony, że został tak dobrze przyjęty. Próbowałem więcej grać w golfa w Arkuszach i Excelu, chociaż - i częściowo dlatego - że mają tak ograniczone zasięgi. Doprowadziło to do wielu formuł tablicowych.
Engineer Toast
Powinieneś być w stanie usunąć kończące )s dla -4 bajtów
Taylor Scott
@TaylorScott Thanks! Ostatnio widziałem tę sztuczkę - prawdopodobnie na jednej z twoich odpowiedzi - i muszę pamiętać, aby zacząć z niej korzystać.
Engineer Toast,
6

05AB1E , 5 bajtów

Lns%ê

Wypróbuj online! lub jako pakiet testowy

L     # Range 1 .. input
 n    # Square each
  s%  # Mod by input
    ê # Uniquify (also sorts as a bonus)
Riley
źródło
Jak stu działa? Czy dane są powtarzane?
Luis Mendo
@LuisMendo sjest pop a,b; push b,a. Gdy polecenie próbuje wyskoczyć coś ze stosu i nic nie pozostało, używane jest następne wejście. Jeśli nie ma już żadnych danych wejściowych, używane jest ostatnie wejście ( oto przykład ). W tym przypadku mogłem użyć, ¹który wypycha pierwsze wejście, ale sdziała lepiej dla zestawu testowego.
Riley
Dzięki. Czy masz więcej informacji na temat kryterium, dla którego dane wejściowe są ponownie wykorzystywane? (jeśli powiedziano trzy dane wejściowe i próbujesz usunąć dwie wartości z pustego stosu)?
Luis Mendo
1
@LuisMendo Input jest używane w kolejności, aż skończy się, a następnie nadal używa ostatniego elementu. Można to sobie wyobrazić, jakby stos był uzupełniany kolejnymi wejściami i nieskończoną liczbą ostatniego elementu.
Riley
@LuisMendo Ln¹%êjest tutaj równoważne. s.
Magic Octopus Urn
6

Swift , 47 35 32 * bajtów

* -3 dzięki @Alexander.

Być może pierwszy raz w historii Szybkie więzi pokonały Pythona?

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

Wypróbuj online!


Wyjaśnienie

  • (0..<m).map{}- Iteruje przez zakres [0...m)i mapuje następujące wyniki:

  • $0*$0%m- Kwadrat każdej liczby całkowitej modulo podstawy m.

  • Set(...) - Usuwa duplikaty.

  • m in - Przypisuje bazę do zmiennej m

Pan Xcoder
źródło
Nazwa użytkownika jest sprawdzana ... poczekaj sekundę.
Rohan Jhunjhunwala
1
Bardziej, niż bije Python. To imponujące ! Myślałem, że nigdy nie zobaczę dnia, który się wydarzy.
Caleb Kleveter
@CalebKleveter Dzięki! Cieszę się, że zrobiłeś wrażenie :)
Mr. Xcoder
3

JavaScript (ES6), 52 bajty

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

Przypadki testowe


Wersja nierekurencyjna, 60 58 bajtów

Zaoszczędź 2 bajty dzięki @ThePirateBay

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

Przypadki testowe

Arnauld
źródło
m=>(a=[...Array(m).keys()]).filter(v=>a.some(n=>n*n%m==v))
@ThePirateBay Dobry połów. Dzięki.
Arnauld
3

Pyth, 6 bajtów

{%RQ*R

Wypróbuj online

Jak to działa

{%RQ*RdQ    implicit variables
       Q    autoinitialized to eval(input())
    *R      over [0, …, Q-1], map d ↦ d times
      d         d
 %R         map d ↦ d modulo
   Q            Q
{           deduplicate
Anders Kaseorg
źródło
3

Brachylog , 10 9 bajtów

>ℕ^₂;?%≜ᶠ

Wypróbuj online!

Wyjaśnienie

       ≜ᶠ       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]
Fatalizować
źródło
Chciałem zasugerować {>≜^₂;?%}ᵘjako alternatywę ... wtedy zdałem sobie sprawę, że są też liczby ujemne. > _ <
Erik the Outgolfer
1
@EriktheOutgolfer Po zatwierdzeniu do TIO mogę faktycznie zmniejszyć tę odpowiedź do 9 bajtów, używając .
Fatalize
OK ... jak by to działało, gdy są też liczby ujemne? Czy po prostu je zignoruje?
Erik the Outgolfer
@EriktheOutgolfer mod można zdefiniować jako pozostałą część podziału, która byłaby dodatnia (iloraz przyjmuje znak). EDYCJA: również kwadraty są dodatnie.
jaxad0127
@ jaxad0127 Nie sądzę, że tak jest w tym przypadku, ponieważ >nadal uwzględniają liczby ujemne afaik.
Erik the Outgolfer
3

Japt , 7 6 bajtów

Dz%UÃâ

Sprawdź to

1 bajt zapisany dzięki Oliverowi


Wyjaśnienie

Domniemane wprowadzenie liczby całkowitej U.

Ç   Ã

Utwórz tablicę liczb całkowitych od 0do U-1, włącznie i przekaż każdą funkcję.

²

Plac.

%U

Modulo U.

â

Pobierz wszystkie unikalne elementy z tablicy i niejawnie wyślij wynik.

Kudłaty
źródło
1
Nie sądzę, że zakres musi obejmować. Dz%UÃâwydaje się działać dobrze.
Oliver
2

Python 3 , 40 39 37 bajtów

-1 bajt dzięki Mr. Xcoder. -2 bajty dzięki Business Cat.

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

Wypróbuj online!

całkowicie ludzki
źródło
1
Nie można zastąpić n**2z n*n?
Pan Xcoder
Tak, zawsze o tym zapominaj. > <Dzięki!
całkowicie ludzki
2
Również range(m)wystarczy
Business Cat
1
Możesz użyć zestawów dla 34 bajtów
Mr. Xcoder
2

Właściwie 11 bajtów

;╗r⌠²╜@%⌡M╔

Wypróbuj online!

Wyjaśnienie:

;╗r⌠²╜@%⌡M╔
;╗           store a copy of m in register 0
  r          range(m)
   ⌠²╜@%⌡M   for n in range:
    ²          n**2
     ╜@%       mod m
          ╔  remove duplicates
Mego
źródło
2

CJam , 12 bajtów

{_,_.*\f%_&}

Anonimowy blok akceptujący numer i zwracający listę.

Wypróbuj online!

Wyjaśnienie

_,          Copy n and get the range [0 .. n-1]
  _.*       Multiply each element by itself (square each)
     \f%    Mod each by n
        _&  Deduplicate
Business Cat
źródło
Ładny! Miałem {:X{_*X%}%_&}dla 13 bajtów
Luis Mendo
2

Haskell , 45 bajtów

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

-4 bajty od Andersa Kaseorga

Wypróbuj online!

Mego
źródło
Niestety wersja bez punktów f m=nub$map((`mod`m).(^2))[0..m]jest tak samo długa, chyba że istnieje podstępna składnia pozwalająca pozbyć się dodatkowych nawiasów.
shooqie
2

MATL , 6 5 bajtów

-1 bajt dzięki @LuisMendo

:UG\u

Wypróbuj online!

Cinaski
źródło
Dzięki! Przejrzałem dokument w poszukiwaniu tej funkcji, ale nie byłem w stanie jej znaleźć.
Cinaski
BTW, ten interpreter stworzony przez Suever ma wyszukiwanie dokumentacji, może ci się przydać
Luis Mendo
1

Mathematica, 30 bajtów

Union@Table[Mod[i^2,#],{i,#}]&

Wypróbuj online!

J42161217
źródło
1

JavaScript (ES6), 48 bajtów

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 bajty, jeśli zwracanie Setzamiast tablicy jest dopuszczalne.

Neil
źródło
1

Scala , 32 lata 30 bajtów

Proste użycie łatwej końcówki z OP.

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

Wypróbuj online!

-2 bajty dzięki @MrXcoder, z priorytetów (nie ma potrzeby ()około *operacji)

Zastanawiasz się: czy jest to możliwe, aby pośrednio powiedzieć kompilatorowi, aby rozumiał takie rzeczy (0 to n-1)map(x=>x*x%n)toSet(bez konieczności import scala.language.postfixOps)?

V. Courtois
źródło
1
(0 to n-1).map(x=>x*x%n).toSetprzez 30 bajtów. Potęgowanie ma wyższy priorytet niż modulo.
Pan Xcoder
@ Mr.Xcoder ooh ~ dzięki :)
V. Courtois
0

Siatkówka oka , 70 bajtów

.+
$*

;$`¶$`
1(?=.*;(.*))|;1*
$1
(1+)(?=((.*¶)+\1)?$)

D`1*¶
^|1+
$.&

Wypróbuj online!Ostrzeżenie: Wolno przy dużych wejściach. Nieco szybsza 72-bajtowa wersja:

.+
$*

$'¶$';
1(?=.*;(.*))|;1*
$1
+s`^((1+)¶.*)\2
$1
^1+

D`1*¶
^|1+
$.&

Wypróbuj online!

Neil
źródło
0

Clojure, 40 bajtów

#(set(map(fn[x](mod(* x x)%))(range %)))
MattPutnam
źródło
0

Perl 6 , 19 bajtów

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

Sprawdź to

Rozszerzony:

{ # 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
}
Brad Gilbert b2gills
źródło
0

Pyth , 13 bajtów

VQ aY.^N2Q){Y

Wypróbuj online.

Kiepska próba wyjaśnienia:

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

Aby posortować dane wyjściowe, wstaw Spo dowolnej stronie pliku{

Myślę, że powinna istnieć krótsza droga ...

alleks
źródło
1
Tak, funkcjonalny styl Pyth jest zwykle bardziej zwięzły . mapjest twoim przyjacielem!
Anders Kaseorg,
0

PHP , 53 bajty

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

Zapętlaj od 0 do liczby wejściowej, korzystając ze n^2 mod basewzoru, aby zaznaczyć używane liczby. Przechodzi do tej pozycji w tablicy, sprawdzając, czy została zwiększona i wyprowadzając ją, jeśli nie. Następnie zwiększa ją, aby zduplikowane wartości nie zostały wydrukowane.

Wypróbuj online!

Xanderhall
źródło
0

8th , 138 131 bajtów

Kod

[] 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

Wyjaśnienie

[] - Utwórz tablicę wyjściową

swap dup >r - Zapisz dane wejściowe do późniejszego wykorzystania

( 2 ^ r@ n:mod a:push ) 1 rot loop - Oblicz kwadratowy koniec

rdrop - Czysty stos r

' n:cmp a:sort - Sortuj tablicę wyjściową

' n:cmp >r -1 a:@ swap ( tuck r@ w:exec ) a:filter rdrop nip - Pozbądź się kolejnych duplikatów z tablicy

SED (diagram efektu stosu) to:a -- a

Zastosowanie i przykład

: 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]
Dwór Chaosu
źródło