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 ).


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:



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


Ś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)

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


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


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

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]

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.


1
Nie sądzę, że zakres musi obejmować. Dz%UÃâwydaje się działać dobrze.
— Oliver


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

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

Ł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!


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




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.


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)?


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

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
}

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 ...


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!


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]

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.