Trả về số nguyên với tổng số chữ số vuông


31

Giới thiệu và tín dụng

Tất cả chúng ta đều biết và yêu thích các quy tắc tuyệt vời của mình để kiểm tra xem một số có chia hết cho 11 hay 3 hay không, đây chỉ là một số tiền thông minh so với các chữ số của số đó. Bây giờ thử thách này đưa vấn đề này lên một cấp độ mới, bằng cách yêu cầu bạn tính tổng các chữ số và sau đó kiểm tra xem kết quả có phải là một số nguyên hoàn hảo hay không, các thao tác này thường không thể thực hiện được trong thời gian ngắn. Vì thuộc tính này cũng rất khó nhìn thấy khi nhìn vào một số, chúng tôi muốn điều này được thực hiện cho toàn bộ danh sách các số để chúng tôi có thể tiết kiệm công việc của con người. Vì vậy, đây là thách thức của bạn bây giờ!

Đây là một nhiệm vụ tại khóa học lập trình chức năng đại học của tôi. Nhiệm vụ này hiện đang đóng cửa và đã được thảo luận trong lớp và tôi được sự cho phép của giáo sư của tôi để đăng nó ở đây (tôi đã hỏi rõ ràng).

Đặc điểm kỹ thuật

Đầu vào

Đầu vào của bạn là danh sách các số nguyên không âm, ở bất kỳ định dạng I / O tiêu chuẩn nào.
Bạn có thể chọn định dạng danh sách vì ngôn ngữ của bạn cần

Đầu ra

Đầu ra là một danh sách các số nguyên, ở bất kỳ định dạng I / O tiêu chuẩn nào.

Phải làm sao

Lọc ra mọi số nguyên từ danh sách đầu vào mà tổng các chữ số không phải là một hình vuông (của một số nguyên).
Thứ tự của các yếu tố có thể không được thay đổi, ví dụ: nếu bạn nhận được, [1,5,9]bạn có thể không quay lại[9,1]

Trường hợp góc tiềm năng

0 số nguyên không âm và do đó, đầu vào hợp lệ và 0 cũng là một số nguyên hợp lệ, ví dụ 0 được tính là một số nguyên.
Danh sách trống là một đầu vào và đầu ra hợp lệ là tốt.

Ai thắng?

Đây là môn đánh gôn, vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng!
Quy tắc tiêu chuẩn áp dụng tất nhiên.

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

[1,4,9,16,25,1111] -> [1,4,9,1111]
[1431,2,0,22,999999999] -> [1431,0,22,999999999]
[22228,4,113125,22345] -> [22228,4,22345]
[] -> []
[421337,99,123456789,1133557799] -> []

Ví dụ từng bước

Example input: [1337,4444]
Handling first number:
Sum of the digits of 1337: 1+3+3+7=14
14 is not an integer square, thus will be dropped!
Handling second number:
Sum of the digits of 4444: 4+4+4+4=16
16 is an integer square because 4*4=16, can get into the output list!
Example output: [4444]

11
Thử thách đầu tiên tốt đẹp, và chào mừng đến với trang web!
DJMcMayhem

Đối với những thách thức trong tương lai lưu ý hộp cát . Đó là nơi chúng tôi đặt thử thách trước khi đưa chúng lên trang web chính để hey có thể được xem xét và nội dung của chúng được truy vấn để họ (hy vọng) sẽ nhận được thông tin tốt hơn trên trang chính. Không phải đây là một câu hỏi tồi (tôi thực sự rất thích nó)
Blue

@muddyfish, tôi đã đọc về điều này và xem xét đăng bài ở đó nhưng quyết định không làm điều đó, bởi vì tôi tự tin, rằng không có gì tôi có thể bỏ lỡ / làm sai lầm khủng khiếp ở đây :) Tất nhiên nếu tôi thậm chí có nghi ngờ gì đó có thể có gì đó Tôi nhớ tôi sẽ đăng ở đó.
SEJPM

12
Mặc dù việc tránh hộp cát là hoàn toàn tốt, nhưng nếu bạn đăng ở đó, tôi sẽ đề nghị bạn thực hiện thử thách chỉ về việc kiểm tra một số nguyên riêng lẻ. Nhiệm vụ thú vị là thử nghiệm, bao bọc nhiệm vụ đó bằng bộ lọc không đặc biệt thú vị. Tất cả dường như là làm cho thách thức trở nên khó khăn hơn đáng kể trong các ngôn ngữ bí truyền không có mảng như các loại. Điều đó có vẻ hơi khắc nghiệt, nhưng đây vẫn là một bài viết đầu tiên tuyệt vời. Chỉ cần nói rằng hộp cát ở đó bởi vì dù bạn có chắc chắn không bỏ lỡ điều gì, bạn đã bỏ lỡ điều gì đó.
FryAmTheEggman

1
@FryAmTheEggman Tôi có thể nói với Mathicala rằng làm cho chức năng này có thể liệt kê được làm phức tạp mọi thứ theo một cách không tầm thường, vì vậy nó không thực sự nhàm chán.
LLlAMnYP

Câu trả lời:



5

Toán học, 39 36 byte

Một chức năng ẩn danh:

Select[AtomQ@√Tr@IntegerDigits@#&]

LLlAMnYP đã lưu một byte. Cảm ơn bạn!

Martin Ender đã tiết kiệm thêm ba bằng cách thay thế IntegerQbằng AtomQ. Tài giỏi! (Kết quả của sẽ là chính xác, do đó, nó trả về một biểu thức ghép như Sqrt[5]nếu đối số của nó không phải là một hình vuông.)


Một byte được lưu ...Digits@#&thay vì...Digits[#]&
LLlAMnYP


4

Brachylog v2, 8 byte

{ẹ+√ℤ&}ˢ

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

Giải trình

{ẹ+√ℤ&}ˢ
{     }ˢ  Map the following operation over {the input}, discarding elements that error:
 ẹ         Split into a list of digits
  +        Sum that list
   √       Take its square root
    ℤ      Assert that the result is an integer
     &     Return to the original value

Điều &đó có nghĩa là đầu ra của các phần tử giống như các phần tử trong danh sách đầu vào, nhưng sẽ báo lỗi nếu đầu vào của khối không phải là số vuông, vì vậy chúng tôi nhận được danh sách đầu vào với các phần tử có tổng các chữ số không vuông.

Lưu ý rằng ban đầu có thể có một vấn đề không chính xác dấu phẩy động ở đây (một số số nguyên không vuông rất lớn có căn bậc hai nguyên do làm tròn). Tuy nhiên, Brachylog hỗ trợ số học bignum và thực tế hành vi này đã được thực hiện khi thực hiện : một số là một hình vuông hoàn hảo sẽ có căn bậc hai được báo cáo là một số nguyên, trong khi một số không phải là một hình vuông hoàn hảo (nhưng đủ gần căn bậc hai là tích phân) sẽ có căn bậc hai được báo cáo là số float với giá trị tích phân. Thuận tiện, chỉ cho phép loại giá trị trả về trước, đưa ra một xác nhận thất bại cho cái sau.


3

Bình thường, 10 byte

fsI@sjT;2Q

Bộ thử nghiệm.

Giải trình

fsI@sjT;2Q

f        Q  Filter for the following in Q(input):
     jT;        convert to base 10
    s           sum
   @    2       square-root
 sI             is integer (is invariant under flooring)

3

CJam, 14 byte

Cảm ơn @FryAmTheEggman vì đã tiết kiệm một byte!

{{Ab:+mq_i=},}

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

Đây là một khối chưa được đặt tên, dự kiến ​​danh sách đầu vào trên ngăn xếp và để lại danh sách được lọc trên đó.

Giải trình

{e # bắt đầu một khối mới
 Ab e # chuyển đổi sang cơ sở 10 -> chia số thành chữ số
 : + e # tổng các chữ số
 mq e # lấy căn bậc hai
 _ e # nhân đôi kết quả
 tức là # chuyển thành số nguyên
 = e # kiểm tra xem căn bậc hai đã chuyển đổi và căn gốc có bằng nhau không
} khối kết thúc e #
, e # lọc danh sách đầu vào

3

Haskell - 70 60 59 byte

f=filter(\x->elem(sum.map(read.pure).show$x)$map(^2)[0..x])

Sử dụng:

> f [0..100]
[0,1,4,9,10,13,18,22,27,31,36,40,45,54,63,72,79,81,88,90,97,100]

Khá đơn giản; tính tổng các chữ số và kiểm tra nếu sàn (sqrt (y)) ^ 2 == y

Chỉnh sửa: Lấy trộm ý tưởng kiểm tra danh sách các hình vuông từ C. Quilley


2
Cách tiếp cận thú vị. Tôi không chắc chắn f=là cần thiết cho câu trả lời này.
Michael Klein

3

05AB1E, 19 10 byte

vySOtDï->—

Giải trình

vy                     # for each int in list
  SO                   # digit sum
    tDï-               # difference between sqrt() and int(sqrt())
        >              # increase by 1 giving 1 (true) when equal
         —             # print current int in list if truthy

Dùng thử trực tuyến

Chỉnh sửa: Đã lưu 9 byte nhờ @Adnan


Để lấy tổng các chữ số cho mỗi chữ số, bạn có thể làm vySOvà kiểm tra ngay xem nó có vuông hay không. Tôi đã nhận được điều này đến 5 : tDï->. Ngoài ra còn có một nội dung đặc biệt in ra ykhi bằng 1, đó là ( ). Vì vậy, đó sẽ là vySOtDï->—.
Ad Nam

@Adnan: Tôi không thể tin rằng tôi đã quên S. Tôi thậm chí không nhìn vào - vì nhiệm vụ được cho là xuất ra dưới dạng danh sách, nhưng tôi thấy các câu trả lời khác đang làm như vậy nên tôi cho rằng nó ổn.
Emigna

Vâng, tôi nghĩ rằng các mục được phân tách bằng dòng mới được chấp nhận, trừ khi thách thức nói rõ ràng là không.
Ad Nam

3

R , 57 55 byte

Sử dụng Filtertrên vector. Giả sử số nguyên 32 bit nên tối đa 10 chữ số.

Các trường hợp góc: trả về NULLcho vectơ trống và numeric(0)cho một vectơ không có số hợp lệ. Cả hai đều có độ dài bằng 0 nên được chấp nhận.

-2 cảm ơn @Giuseppe

Filter(function(n)!sum(n%/%10^(0:10)%%10)^.5%%1,scan())

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


3

PowerShell , 64 54 byte

$args|?{!([math]::Sqrt(([char[]]"$_"-join'+'|iex))%1)}

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

-10 byte nhờ mazzy

Đưa đầu vào dưới dạng đối số dòng lệnh (xem ví dụ bên dưới), được xử lý trong PowerShell vào mảng $args. Chúng tôi đặt ?một bí danh cho Where-Object(các chức năng tương tự filter) để chọn đầu ra của chúng tôi. Lựa chọn của chúng tôi dựa trên cuộc gọi .NET [math]::Sqrt()của tổng số của số là một số nguyên với !(...%1). Số nguyên sẽ dẫn đến 0, khi noted trở thành Truetrong khi gốc không nguyên trở thành False.

Như đã đề cập ở nơi khác, "trả về" một mảng trống là vô nghĩa, vì nó được chuyển đổi $nullngay khi nó rời khỏi phạm vi, vì vậy đầu ra cho một đầu vào trống là không có gì.

Ví dụ

PS C:\Tools\Scripts\golfing> .\return-integers-with-square-digit-sums.ps1 1 4 9 16 25 1111
1
4
9
1111

PS C:\Tools\Scripts\golfing> .\return-integers-with-square-digit-sums.ps1 1431 2 0 22 999999999
1431
0
22
999999999

PS C:\Tools\Scripts\golfing> .\return-integers-with-square-digit-sums.ps1 22228 4 113125 22345
22228
4
22345

PS C:\Tools\Scripts\golfing> .\return-integers-with-square-digit-sums.ps1 

PS C:\Tools\Scripts\golfing> .\return-integers-with-square-digit-sums.ps1 1337 4444
4444

1
$n%1kiểm tra nếu chỉ int$args|?{!([math]::Sqrt(([char[]]"$_"-join'+'|iex))%1)}
mazzy

2

Python 2, 76 byte

lambda l:filter(lambda n:eval(("sum(map(int,`n`))**.5==int("*2)[:-6]+")"),l)

Hãy thử nó ở đây!

Một số lạm dụng eval để kiểm tra một số vuông, phần còn lại là khá lạ.
Các tuyên bố eval ước tính đến sum(map(int,n ))**.5==int(sum(map(int,n))**.5)


2

Oracle SQL 11.2, 213 byte

WITH v AS(SELECT a,SQRT(XMLQUERY(REGEXP_REPLACE(a,'(\d)','+\1')RETURNING CONTENT).GETNUMBERVAL())s FROM(SELECT TRIM(COLUMN_VALUE)a FROM XMLTABLE(('"'||REPLACE(:1,',','","')||'"'))))SELECT a FROM v WHERE s=CEIL(s);

Không chơi gôn

WITH v AS
(  
  SELECT a,SQRT(XMLQUERY( 
                   REGEXP_REPLACE(a,'(\d)','+\1')  -- Add a + in front of each digit 
                   RETURNING CONTENT
               ).GETNUMBERVAL())s                  -- Evaluate the expression generated by the added +
  FROM 
  (SELECT TRIM(COLUMN_VALUE)a FROM XMLTABLE(('"'||REPLACE(:1,',','","')||'"'))) -- Split string on ','
)
SELECT a FROM v WHERE s=CEIL(s) -- Is a square if square has no decimal part

2

Brachylog , 26 byte

:1f.
e.(:ef+~^[X:2]h>0;.0)

Thí dụ:

?- run_from_file('code.brachylog',[1431:2:0:22:999999999],Z).
Z = [1431, 0, 22, 999999999]

Giải trình

Đây là một tình huống mà một cái gì đó hoạt động quá tốt ... ~^[X:2]một phần là đúng cho cả tích cực và tiêu cực X, vì vậy để tránh trùng lặp, tôi phải xác định điều đó X > 0.

Một ;.0phần là do lỗi (liệt kê không hoạt động trên số nguyên 0).

  • Vị ngữ chính

    :1f.                Find all values of Input which satisfy predicate 1
    
  • Vị ngữ 1

    e.                  Unify output with an element of the input
    (
      :ef               Find all elements of Output (i.e. all digits)
         +              Sum the digits
          ~^[X:2]       True if that sum is the result of X², whatever X is
                 h>0    Impose that X > 0
    ;                   OR
      .0                True if Output is 0
    )
    

2

Python 2, 53 byte

lambda x:[n for n in x if sum(map(int,`n`))**.5%1==0]

Kiểm tra nó trên Ideone .


1
Đối với f([1111111111111111]), nó trông giống như repr(n)chứa một 'L'int('L')ném a ValueError. Tôi cảm thấy như bạn cần str(n)ở đây?
Lynn

2
Phải, nó sẽ không hoạt động trong thời gian dài. Tôi không nghĩ rằng nó khác với một giải pháp trong một ngôn ngữ với các số nguyên có chiều rộng cố định.
Dennis

2

J, 33 27 byte

6 byte nhờ @miles .

#~[:(=<.)@%:+/"1@(10&#.inv)

Trong phiên dịch trực tuyến, invkhông phải là bản năng. Thay đổi điều đó để ^:_1thay thế.

Sử dụng

>> f =: #~[:(=<.)@%:+/"1@(10&#.inv)
>> f 1 4 9 16 25 1111 0
<< 1 4 9 1111 0

Trong trường hợp >>là STDIN và <<là STDOUT.

Hơi vô dụng

to_base_10 =: 10&#.^:_1
sum        =: +/"1
sqrt       =: %:
floor      =: <.
itself     =: ]
equals     =: =
of         =: @
is_integer =: equals floor
test       =: is_integer of sqrt
copies_of  =: #
f =: copies_of~ [: test (sum of to_base_10)

Phiên bản 33 byte trước đó

(]=*:@<.@%:)@(+/"1@(10#.^:_1]))#]

Sử dụng

>> f =: (]=*:@<.@%:)@(+/"1@(10#.^:_1]))#]
>> f 1 4 9 16 25 1111 0
<< 1 4 9 1111 0

Trong trường hợp >>là STDIN và <<là STDOUT.

Hơi vô dụng

to_base_10 =: 10#.^:_1]
sum        =: +/"1
sqrt       =: %:
floor      =: <.
square     =: *:
itself     =: ]
equals     =: =
of         =: @
test       =: itself equals square of floor of sqrt
copies_of  =: #
f =: (test of (sum of to_base_10)) copies_of itself

1
Bạn có thể sử dụng f&.gđể áp dụng g, sau đó f, và sau đó nghịch đảo gđể rút ngắn *:@<.@%:để <.&.%:tiết kiệm 2 byte. Bạn có thể sắp xếp lại nó và chỉ sử dụng sàn để có được #~[:(=<.)@%:+/"1@(10&#.inv)27 byte nơi inv^:_1, và đã được xác định.
dặm

2

Javascript 66 byte

a=>a.filter(b=>(e=Math.sqrt((b+"").split``.reduce((c,d)=>c-+-d)))==(e|0))

Cảm ơn vì SergioFC đã lưu 7 byte


Bạn không thể sử dụng c+dthay vì c-+-d? Ngoài ra, bạn có thể sử dụng n%1==0để kiểm tra xem kết quả có phải là int hay không, vì vậy có lẽ bạn có thể lưu một số byte bằng cách sử dụng b=>!(Math.sqrt((b+"").split``.reduce((c,d)=>c-+-d))%1)để lọc
sergioFC

@sergioFC Tôi không thể thay đổi - + - thành +, vì chúng là chuỗi
Bálint

2

Perl 5, 42 byte

41, cộng 1 cho -pethay vì-e

my$s;map$s+=$_,/./g;$_ x=sqrt$s==~~sqrt$s

Giải trình:

  • -plấy từng số nguyên đầu vào trên một dòng mới và gán $_cho chuỗi đó.
  • my$skhởi tạo biến $sthành không có gì, một lần nữa cho mỗi số nguyên đầu vào.
  • map$s+=$_,/./glấy từng ký tự số và thêm số đó vào $s. (Dòng mới trở thành 0 khi được số hóa.)
  • sqrt$s==~~sqrt$skiểm tra xem $scó một căn bậc hai không phân nhánh hay không , và $_ x=tạo $_thành chính nó hay chuỗi rỗng tùy thuộc vào kiểm tra đó.
  • -p in $_

Cảm ơn Brad Gilbert b2gills đã lưu ba byte.

Ngoài ra 41 cộng 1:

my$s;s/./$s+=$&/ger;$_ x=sqrt$s==~~sqrt$s
  • s/./$s+=$&/gerthêm từng ký tự số vào $s(và dòng mới là 0 như trên)

2

JavaScript (Node.js) , 48 byte

a=>a.filter(b=>eval([...b+""].join`+`)**.5%1==0)

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

Giải trình

a =>                                  // lambda function taking one argument
    a.filter(                         // filter the list
        eval(                         // begin eval
            [...b+""]                 // convert number to array of digits 
                .join`+`              // join them with + sign
            )                         // close eval. we achieved sum of all digits of number
        **.5                          // square root of number
        %1==0                         // check for perfect square
    )                                 // end filter and return value

1

MATL, 16 14 13 byte

"@tV!UsX^1\?x

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

Giải trình

        % Implicitly grab input
"       % For each number in the input
  @t    % Get this element and duplicate
  V     % Convert to it's string representation
  !     % Transpose the string so each digit is on it's own row
  U     % Convert each row to a number (separates the digits)
  s     % Compute the sum of the digits
  X^    % Compute the square root
  1\    % mod with 1 to determine if the square root is an integer
  ?x    % If there is a remainder, then remove this element from the stack
        % Implicitly display the stack contents

1

Julia - 38 byte

!X=filter(i->√sum(digits(i))%1==0,X)

Thật dễ dàng để xem những gì nó làm. digitschuyển đổi một số thành một danh sách các chữ số của nó, sumdo đó tính tổng chữ số, sau đó sẽ tạo ra một số nguyên nếu số đó là một hình vuông, nếu không sẽ có một phần phân số. %1sẽ chỉ trả lại phần phân số và nếu nó bằng 0 ( ==0), filtersẽ giữ nó trong danh sách, nếu không nó sẽ bị lọc.

Được dùng như là ![22228,4,113125,22345]



1

MATLAB, 52 43 42 byte

@(x)x(~mod(sum(dec2base(x,10)'-48).^.5,1))

Tạo một hàm ẩn danh có tên anscó thể được gọi với một mảng là đầu vào : ans([22228,4,113125,22345]).

Demo trực tuyến . Bản demo trực tuyến trong Octave không hoạt động với đầu vào trống, nhưng MATLAB thì có.

Giải trình

Chúng tôi chuyển đổi từng phần tử trong mảng đầu vào thành cơ sở 10, nó sẽ mang lại một mảng ký tự 2D trong đó mỗi hàng chứa các chữ số của một số trong mảng. Để chuyển đổi các ký tự này thành số, chúng tôi trừ 48 (ASCII cho '0'). Sau đó, chúng tôi tổng hợp các hàng, lấy căn bậc hai và xác định xem mỗi giá trị có phải là một hình vuông hoàn hảo hay không ~mod 1. Sau đó chúng tôi sử dụng boolean này để lọc mảng đầu vào.


1

Clojure, 110 byte

(fn[t](filter(fn[x](let[a(reduce +(*(count(str x))-48)(map int(str x)))](some #(=(* % %)a)(range(inc a)))))t))

Tính tổng các chữ số và sau đó lọc ra những số không tồn tại một số có bình phương bằng tổng.

Bạn có thể xem kết quả tại đây - https://ideone.com/ciKOje


1

Perl 6 ,  38   35 byte

{.grep: {($/=sqrt [+] .comb)==$/.Int}}
{.grep: {($/=.comb.sum.sqrt)==$/.Int}}
{.grep: {($/=sqrt [+] .comb)==^$/}}
{.grep: {($/=.comb.sum.sqrt)==^$/}}

Kiểm tra:

#! /usr/bin/env perl6

use v6.c;
use Test;

my @tests = (
  [1,4,9,16,25,1111] => [1,4,9,1111],
  [1431,2,0,22,999999999] => [1431,0,22,999999999],
  [22228,4,113125,22345] => [22228,4,22345],
  [] => [],
  [421337,99,123456789,1133557799] => [],
);

plan +@tests;

my &sq-digit-sum = {.grep: {($/=sqrt [+] .comb)==^$/}}

for @tests -> $_ ( :key($input), :value($expected) ) {
  is sq-digit-sum($input), $expected, .gist
}
1..5
ok 1 - [1 4 9 16 25 1111] => [1 4 9 1111]
ok 2 - [1431 2 0 22 999999999] => [1431 0 22 999999999]
ok 3 - [22228 4 113125 22345] => [22228 4 22345]
ok 4 - [] => []
ok 5 - [421337 99 123456789 1133557799] => []

1

C, 143 141 byte

  • đã lưu 2 byte, @ user6188402
i;q(char*n){double m=0;while(*n)m+=*n++-48;m=sqrt(m)-(int)sqrt(m);return !m;}s(n,s)char**n;{i=-1;while(++i<s)if(q(n[i]))printf("%s\n",n[i]);}

Ungolfed thử trực tuyến

int q(char*n)
{
    double m=0;

    while(*n) // sum digits
        m+=*n++-48;

    // get the decimal part of its square root
    m=sqrt(m)-(int)sqrt(m);

    // true if decimal part is zero
    return !m;
}

// input is text, can be a file
void s(char**n, int s)
{
    int i=-1;

    while(++i<s) // for each number in input
        if(q(n[i])) // if is square
            printf("%s\n",n[i]); // output is terminal
}

1

Võng mạc , 69

Bởi vì thử nghiệm cho hình vuông hoàn hảo trong võng mạc. Điều này có thể được sửa đổi để tính toán căn bậc hai tổng quát .

. +
$ & $ &
+ `\ b \ d
$ * b 


\ bb
$ &:
+ `(\ bb +) :( bb \ 1)
$ 1 $ 2:
G` (: a | 0 $)
. * a

Đầu vào là một danh sách phân tách dòng mới.

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

  • Giai đoạn 1 - lặp lại số trên mỗi dòng và tách biệt với a
  • Giai đoạn 2 - chuyển đổi từng chữ số trước ký tự đại diện athành bs, được phân tách bằng dấu cách
  • Giai đoạn 3 - xóa khoảng trắng - mỗi đơn vị hiện đại diện cho tổng chữ số
  • Giai đoạn 4 và 5 - Sử dụng thực tế là các ô vuông hoàn hảo có thể được biểu thị 1 + 3 + 5 + 7 + .... Tách từng unary lên cho phù hợp
  • Giai đoạn 6 - bộ lọc grep chỉ là những bộ lọc phân chia chính xác thành mẫu ở trên
  • Giai đoạn 7 - loại bỏ tất cả trừ số ban đầu

Tôi đã có một vài ý tưởng làm thế nào để cải thiện điều này, nhưng cuối cùng lại viết lại hầu hết. Tuy nhiên, đây vẫn chính xác là ý tưởng của bạn: đầu vào trùng lặp, mở rộng các chữ số trong nửa đầu, lọc các ô vuông dưới dạng tổng của các số lẻ, loại bỏ nửa đầu của các dòng còn lại. Cách tôi đánh gôn các bước là thông qua %cấu hình \Gvà chuyển tiếp các tham chiếu. Hãy dùng nó: retina.tryitonline.net/ khăn :)
Martin Ender

1

Python, 50 byte

filter(lambda x:sum(map(int,str(x)))**0.5%1==0,in)

Nếu n là danh sách đầu vào của các số


1
Xin Chào và Chào Mừng đến với trang! Vì đây là một cuộc thi đánh gôn , ví dụ ai có thể viết mã ngắn nhất, chúng tôi yêu cầu tất cả các bài nộp phải ít nhất là được chơi gôn . Chúng tôi có một danh sách các mẹo chơi golf python ở đây . Ngay trên đỉnh đầu tôi, một cải tiến rõ ràng bạn có thể làm là xóa tất cả các khoảng trắng thừa và đổi tên các biến của bạn thành một chữ cái. Bạn cũng có thể lấy đầu vào làm đối số hàm hoặc STDIN thay vì đối số dòng lệnh.
DJMcMayhem

Bạn cũng nên chỉ định ngôn ngữ và số byte, có thể được tính, ví dụ, ở đó .
nicael

1
Chào mừng đến với PPCG! Ngoài những gì người khác nói, xin lưu ý rằng tất cả các giải pháp phải là chương trình đầy đủ hoặc chức năng có thể gọi được . Cho đến nay, tất cả các câu trả lời của bạn đều là đoạn trích giả định rằng đầu vào được lưu trữ trong một số biến và chỉ đánh giá kết quả, điều không may làm cho chúng không hợp lệ. Đối với các phương pháp I / O được chấp nhận, xem bài đăng meta này .
Martin Ender



1

MathGolf , 5 4 byte

gÅΣ°

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

Giải trình:

gÅ    Filter by the next two instructions
  Σ   The digit sum
   °  Is a perfect square?

MathGolf vẫn đang trong quá trình phát triển, vì vậy tôi cho rằng đầu vào ngầm sẽ sớm loại bỏ byte đầu tiên đó. Yay!


Xin chúc mừng câu trả lời đầu tiên của MathGolf không phải bởi tôi! Tôi đã thảo luận về đầu vào ngầm với Emigna, và anh ấy đã cho tôi một số ý tưởng tuyệt vời. Nó sẽ đến, hy vọng sẽ sớm thôi.
maxb
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.