Làm thế nào để kết thúc vuông?


20

Trong Base-10, tất cả các ô vuông hoàn hảo kết thúc bằng 0 , 1 , 4 , 5 , 6 hoặc 9 .

Trong Base-16, tất cả các ô vuông hoàn hảo kết thúc bằng 0 , 1 , 4 hoặc 9 .

Nilknarf mô tả lý do tại sao và đây là cách giải quyết vấn đề này rất tốt trong câu trả lời này , nhưng tôi cũng sẽ đưa ra một mô tả ngắn gọn ở đây:

Khi bình phương một số Base-10, N , chữ số "cái" không bị ảnh hưởng bởi những gì trong chữ số "hàng chục" hoặc chữ số "hàng trăm", v.v. Chỉ có chữ số "cái" trong N ảnh hưởng đến chữ số "cái" trong N 2 , vì vậy một cách dễ dàng (nhưng có thể không phải là gôn nhất) để tìm tất cả các chữ số cuối có thể có cho N 2 là tìm n 2 mod 10 cho tất cả 0 <= n < 10 . Mỗi kết quả là một chữ số cuối cùng có thể. Đối với Base-m, bạn có thể tìm thấy n 2 mod m cho tất cả 0 <= n < m .

Viết chương trình, khi được cung cấp N đầu vào , sẽ xuất tất cả các chữ số cuối cùng có thể cho một hình vuông hoàn hảo trong Base-N (không trùng lặp). Bạn có thể giả sử N lớn hơn 0N đủ nhỏ để N 2 không bị tràn (Nếu bạn có thể kiểm tra tất cả các cách lên đến N 2 , tôi sẽ cung cấp cho bạn một số điểm hữu hạn, nhưng hãy biết rằng tỷ giá hối đoái của điểm brownie với điểm thực là vô cùng với một).

Các xét nghiệm:

 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

Đây là , vì vậy các quy tắc tiêu chuẩn được áp dụng!

(Nếu bạn thấy điều này quá dễ, hoặc bạn muốn có một câu hỏi sâu hơn về chủ đề này, hãy xem xét câu hỏi này: Độ che phủ tối thiểu của các cơ sở để kiểm tra dư lượng bậc hai về độ vuông góc ).


1
Liệu mảng đầu ra cần phải được sắp xếp?
Shaggy

@Shaggy Không! Mego, Sao chép không được phép. Về mặt lý thuyết, N có thể rất lớn, do đó, các bản sao sẽ làm cho đầu ra khá khó đọc. Tôi sẽ trả lời câu hỏi
Lord Farquaad

Là xuất ra một bộ có thể chấp nhận?
hoàn toàn

2
@totallyhuman Tại sao nó không hợp lệ? Các bộ là các bộ sưu tập không có thứ tự và nó không được sắp xếp , vì vậy ...
Ông Xcoder

Câu trả lời:



19

Google Sheets, 52 51 47 byte

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

Đã lưu 4 byte nhờ Taylor Scott

Trang tính sẽ tự động thêm 4 dấu ngoặc đơn đóng vào cuối công thức.

Nó không trả về kết quả theo thứ tự tăng dần nhưng nó trả về kết quả đúng.

Các kết quả


Chúa ơi, con người là kẻ giết người điên cuồng! Ai sẽ nghĩ? +1
bearacuda13

1
Đây chắc chắn là câu trả lời yêu thích của tôi cho đến nay.
Lord Farquaad

@LordFarquaad Tôi ngạc nhiên và hài lòng vì điều này đã được đón nhận. Mặc dù tôi đã cố gắng chơi gôn nhiều hơn trong Sheets và Excel - và một phần vì - chúng có phạm vi hạn chế như vậy. Nó dẫn đến rất nhiều công thức mảng.
Kỹ sư Toast

Bạn sẽ có thể loại bỏ )s kết thúc cho -4 byte
Taylor Scott

@TaylorScott Cảm ơn! Tôi đã thấy mẹo đó ở đâu đó gần đây - có lẽ là một trong những câu trả lời của bạn - và cần nhớ để bắt đầu sử dụng nó.
Kỹ sư Toast

6

05AB1E , 5 byte

Lns%ê

Hãy thử trực tuyến! hoặc như một bộ thử nghiệm

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

Làm thế nào để slàm việc ở đây? Là đầu vào lặp đi lặp lại?
Luis Mendo

@LuisMendo spop a,b; push b,a. Khi một lệnh cố gắng bật một cái gì đó từ ngăn xếp và không có gì còn lại, đầu vào tiếp theo được sử dụng. Nếu không có thêm đầu vào nào thì đầu vào cuối cùng được sử dụng ( đây là một ví dụ ). Trong trường hợp này tôi có thể đã sử dụng ¹cái nào đẩy đầu vào đầu tiên, nhưng shoạt động tốt hơn cho bộ thử nghiệm.
Riley

Cảm ơn. Bạn có thêm thông tin liên quan đến tiêu chí mà đầu vào nào được sử dụng lại không? (nếu đã có ba đầu vào nói và bạn cố gắng bật hai giá trị từ một ngăn xếp trống)?
Luis Mendo

1
@LuisMendo Input được sử dụng theo thứ tự cho đến khi hết, sau đó nó tiếp tục sử dụng phần tử cuối cùng. Bạn có thể tưởng tượng nó giống như ngăn xếp được đệm với mỗi đầu vào theo thứ tự và vô số phần tử cuối cùng.
Riley

@LuisMendo Ln¹%êtương đương ở đây. s.
Bạch tuộc ma thuật Urn

6

Swift , 47 35 32 * byte

* -3 cảm ơn @Alexander.

Có thể lần đầu tiên trong lịch sử quan hệ Swift đánh bại Python?

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

Hãy thử trực tuyến!


Giải trình

  • (0..<m).map{}- Lặp lại qua phạm vi [0...m)và ánh xạ các kết quả sau:

  • $0*$0%m- Bình phương của mỗi số nguyên modulo cơ sở m.

  • Set(...) - Loại bỏ các bản sao.

  • m in - Gán cơ sở cho một biến m


Tên người dùng kiểm tra ... chờ một chút.
Rohan Jhunjhunwala

1
Giống như nó đánh bại Python. Đó là ấn tượng ! Tôi nghĩ rằng tôi sẽ không bao giờ thấy ngày đó sẽ xảy ra.
Caleb Kleveter

@CalebKleveter Cảm ơn! Tôi rất vui vì bạn thấy nó thật ấn tượng :)
Ông Xcoder


3

JavaScript (ES6), 52 byte

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

Các trường hợp thử nghiệm


Phiên bản không đệ quy, 60 58 byte

Đã lưu 2 byte nhờ @ThePirateBay

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

Các trường hợp thử nghiệm


58 byte không đệ quy:m=>(a=[...Array(m).keys()]).filter(v=>a.some(n=>n*n%m==v))

@ThePirateBay Bắt tốt. Cảm ơn.
Arnauld

3

Bình thường, 6 byte

{%RQ*R

Dùng thử trực tuyến

Làm thế nào nó hoạt động

{%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 byte

>ℕ^₂;?%≜ᶠ

Hãy thử trực tuyến!

Giải trình

       ≜ᶠ       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]

Tôi chuẩn bị đề nghị {>≜^₂;?%}ᵘthay thế ... sau đó tôi nhận ra cũng có những số âm. > _ <
Erik the Outgolfer

1
@EriktheOutgolfer Một khi một cam kết được kéo đến TIO, tôi thực sự có thể giảm câu trả lời này xuống còn 9 byte thực sự bằng cách sử dụng .
Gây tử vong vào

OK ... nó sẽ hoạt động như thế nào khi có cả số âm? Nó sẽ chỉ đơn giản là bỏ qua chúng hoặc một cái gì đó?
Erik the Outgolfer 27/07/17

@EriktheOutgolfer mod có thể được định nghĩa là phần còn lại của phép chia, sẽ là số dương (thương số có dấu). EDIT: cũng, hình vuông là tích cực.
jaxad0127

@ jaxad0127 Tôi không nghĩ đó là trường hợp ở đây, vì >vẫn sẽ chiếm số âm afaik.
Erik các Outgolfer

3

Japt , 7 6 byte

Dz%UÃâ

Kiểm tra nó

Lưu 1 byte nhờ Oliver


Giải trình

Đầu vào ngầm định của số nguyên U.

Ç   Ã

Tạo một mảng các số nguyên từ 0đến U-1, bao gồm và chuyển từng mặc dù một hàm.

²

Quảng trường.

%U

Modulo U.

â

Nhận tất cả các yếu tố duy nhất trong mảng và ngầm định kết quả.


1
Tôi không nghĩ rằng phạm vi cần phải được bao gồm. Dz%UÃâdường như chỉ hoạt động tốt
Oliver



2

CJam , 12 byte

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

Khối ẩn danh chấp nhận một số và trả về một danh sách.

Hãy thử trực tuyến!

Giải trình

_,          Copy n and get the range [0 .. n-1]
  _.*       Multiply each element by itself (square each)
     \f%    Mod each by n
        _&  Deduplicate

Tốt đẹp! Tôi đã có {:X{_*X%}%_&}13 byte
Luis Mendo

2

Haskell , 45 byte

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

-4 byte từ Anders Kaseorg

Hãy thử trực tuyến!


Đáng buồn f m=nub$map((`mod`m).(^2))[0..m]là phiên bản miễn phí chỉ dài như vậy, trừ khi có một cú pháp lén lút để loại bỏ dấu ngoặc đơn.
shooqie




1

JavaScript (ES6), 48 byte

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 byte nếu trả về một Setthay vì một mảng là chấp nhận được.


1

Scala , 32 30 byte

Sử dụng đơn giản các mẹo dễ dàng từ OP.

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

Hãy thử trực tuyến!

-2 byte nhờ @MrXcoder, với các ưu tiên (không cần ()* hoạt động xung quanh )

Tự hỏi: điều này có thể để ngầm nói với trình biên dịch để hiểu những thứ như (0 to n-1)map(x=>x*x%n)toSet(mà không phải import scala.language.postfixOps)?


1
(0 to n-1).map(x=>x*x%n).toSettrong 30 byte. Lũy thừa có độ ưu tiên cao hơn modulo.
Ông Xcoder

@ Mr.Xcoder ooh ~ cảm ơn :)
V. Courtois




0

Perl 6 , 19 byte

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

Kiểm tra nó

Mở rộng:

{ # 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

Bình thường , 13 byte

VQ aY.^N2Q){Y

Hãy thử trực tuyến.

Cố gắng giải thích:

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ắp xếp đầu ra, chèn một Sbên vào bất kỳ phía nào của{

Tôi nghĩ nên có một cách ngắn hơn ...


1
Vâng, phong cách chức năng của Pyth có xu hướng ngắn gọn hơn nhiều . maplà bạn của bạn!
Anders Kaseorg





0

PHP , 53 byte

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

Lặp lại từ 0 đến số đầu vào, sử dụng n^2 mod basecông thức để đánh dấu các số đã được sử dụng. Nó đi đến vị trí đó trong một mảng, kiểm tra xem nó có được tăng lên không và xuất ra nếu nó không có. Sau đó, nó sẽ tăng nó sau đó để các giá trị trùng lặp không được in.

Hãy thử trực tuyến!


0

8 , 138 131 byte

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

Giải trình

[] - Tạo mảng đầu ra

swap dup >r - Lưu đầu vào để sử dụng sau

( 2 ^ r@ n:mod a:push ) 1 rot loop - Tính đầu vuông

rdrop - Làm sạch ngăn xếp r

' n:cmp a:sort - Sắp xếp mảng đầu ra

' n:cmp >r -1 a:@ swap ( tuck r@ w:exec ) a:filter rdrop nip - Loại bỏ các bản sao liên tiếp từ mảng

SED (Sơ đồ hiệu ứng ngăn xếp) là:a -- a

Cách sử dụng và ví dụ

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.