Zwróć liczby całkowite z kwadratowymi cyframi

31

Wprowadzenie i zaliczenie

Wszyscy znamy i kochamy nasze niesamowite zasady sprawdzania, czy liczbę można podzielić przez 11 lub 3, co jest po prostu sprytną sumą nad cyframi liczby. Teraz to wyzwanie przenosi to na nowy poziom, wymagając obliczenia sumy cyfr, a następnie sprawdzenia, czy wynikiem jest idealny kwadrat całkowity, przy czym żadnej z tych operacji zwykle nie można wykonać bardzo krótko. Ponieważ ta właściwość jest również bardzo trudna do zauważenia, gdy patrzymy na liczbę, chcemy, aby zrobiono to dla całych list liczb, abyśmy mogli uratować ludzką pracę. To jest teraz twoje wyzwanie!

To było zadanie na moim uniwersyteckim kursie programowania funkcjonalnego. To zadanie jest teraz zamknięte i zostało omówione na zajęciach i mam pozwolenie mojego profesora na opublikowanie go tutaj (wyraźnie poprosiłem).

Specyfikacja

Wkład

Twoje dane wejściowe to lista liczb całkowitych nieujemnych, w dowolnym standardowym formacie We / Wy.
Możesz wybrać format listy w zależności od potrzeb

Wydajność

Dane wyjściowe to lista liczb całkowitych w dowolnym standardowym formacie we / wy.

Co robić?

Odfiltruj każdą liczbę całkowitą z listy wejściowej, dla której suma cyfr nie jest kwadratem (liczby całkowitej).
Kolejność elementów nie może zostać zmieniona, np. Jeśli otrzymasz [1,5,9], możesz nie wrócić[9,1]

Potencjalne narożne skrzynki

0 jest nieujemną liczbą całkowitą, a zatem prawidłowym wejściem, a 0 jest również prawidłowym pierwiastkiem całkowitym, np. 0 liczy się jako liczba całkowita w kwadracie.
Pusta lista to także prawidłowe dane wejściowe i wyjściowe.

Kto wygrywa?

To jest golf golfowy, więc wygrywa najkrótsza odpowiedź w bajtach!
Oczywiście obowiązują standardowe zasady.

Przypadki testowe

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

Przykład krok po kroku

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]
SEJPM
źródło
11
Ładne pierwsze wyzwanie i witamy na stronie!
DJMcMayhem
Na przyszłe wyzwania zwróć uwagę na piaskownicę . To miejsce, w którym stawiamy wyzwania, zanim umieścimy je na głównej stronie, aby mógł zostać sprawdzony i zapytać o ich zawartość, aby (miejmy nadzieję) zostali lepiej przyjęci na głównej. Nie znaczy to jednak, że jest to złe pytanie (naprawdę mi się podoba)
Blue
@muddyfish, przeczytałem o tym i zastanowiłem się nad opublikowaniem tam, ale postanowiłem tego nie robić, ponieważ byłem pewien, że nie ma nic, co mógłbym przegapić / zrobić strasznie źle tutaj :) Oczywiście, jeśli mam jakieś wątpliwości, może być coś Tęsknię, będę tam pisać.
SEJPM
12
Chociaż unikanie piaskownicy jest całkowicie w porządku, to gdybyś tam napisał, sugerowałbym, abyś podejmował wyzwanie tylko w testowaniu pojedynczej liczby całkowitej. Ciekawym zadaniem jest test, a owijanie go filtrem nie jest szczególnie interesujące. Wszystko, co wydaje się robić, to znacznie utrudnić wyzwanie w językach ezoterycznych, które nie mają tablic jako typów. Może to zabrzmieć nieco ostro, ale wciąż jest to doskonały pierwszy post. Po prostu stwierdzenie, że piaskownica istnieje, ponieważ bez względu na to, jak jesteś pewny, niczego nie przegapiłeś, coś przegapiłeś.
FryAmTheEggman
1
@FryAmTheEggman Mogę powiedzieć Mathematice, że umieszczenie tej funkcji na liście komplikuje sprawy w nieco nietrywialny sposób, więc nie jest to nudne.
LLlAMnYP

Odpowiedzi:

10

Pyke, 6 bajtów

#s,DBq

Wypróbuj tutaj!

#      - Filter list on truthiness:
 s     -    digital_root(^)
  ,    -   sqrt(^)
    Bq -  int(^) == ^
niebieski
źródło
5

Mathematica, 39 36 bajtów

Anonimowa funkcja:

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

LLlAMnYP zapisał bajt. Dziękuję Ci!

Martin Ender uratował jeszcze trzy, zastępując IntegerQje AtomQ. Sprytny! (Wynik będzie dokładny, więc zwraca wyrażenie złożone, tak Sqrt[5]jakby jego argument nie był kwadratem).

Lynn
źródło
Bajt, który należy zapisać ...Digits@#&zamiast...Digits[#]&
LLlAMnYP,
4

Galaretka, 8 7 bajtów

1 bajt dzięki @ Sp3000 .

DSƲðÐf

Zestaw testowy.

Wyjaśnienie

DSƲðÐf  Main monadic chain. Argument: z

     Ðf  Filter for truthiness:
D            convert to base 10
 S           sum
  Ʋ         is perfect square
Leaky Nun
źródło
4

Brachylog v2, 8 bajtów

{ẹ+√ℤ&}ˢ

Wypróbuj online!

Wyjaśnienie

{ẹ+√ℤ&}ˢ
{     }ˢ  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

Te &środki, które wyjście elementy są takie same jak te z listy wejściowej, ale będzie błędów, czy wejście bloku nie jest liczbą kwadratowy, więc otrzymujemy listę wejściowy z elementami z non-kwadrat sumy cyfr wyrzucić.

Zauważ, że na początku może się wydawać, że występuje tutaj problem niedokładności zmiennoprzecinkowej (niektóre bardzo duże liczby całkowite inne niż kwadratowe mają pierwiastki całkowite z powodu zaokrąglenia). Jednak Brachylog obsługuje arytmetykę bignum i faktycznie zachowuje to zachowanie w swojej implementacji : liczba, która jest idealnym kwadratem, będzie miała pierwiastek kwadratowy zgłoszony jako liczba całkowita, podczas gdy liczba, która nie jest kwadratem idealnym (ale wystarczająco blisko, aby jego pierwiastek kwadratowy jest całką), pierwiastek kwadratowy zostanie zgłoszony jako liczba zmiennoprzecinkowa o wartości całkowitej. Dogodnie zezwala tylko na poprzedni rodzaj wartości zwracanej, co powoduje brak potwierdzenia dla drugiej.

ais523
źródło
3

Pyth, 10 bajtów

fsI@sjT;2Q

Zestaw testowy.

Wyjaśnienie

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)
Leaky Nun
źródło
3

CJam, 14 bajtów

Dzięki @FryAmTheEggman za uratowanie jednego bajtu!

{{Ab:+mq_i=},}

Wypróbuj online!

Jest to nienazwany blok, który oczekuje na liście wejściowej stosu i pozostawia na nim listę filtrowaną.

Wyjaśnienie

{e # rozpocznij nowy blok
 Ab e # przelicz na bazę 10 -> podziel liczbę na cyfry
 : + e # suma cyfr
 mq e # pobierz pierwiastek kwadratowy
 _ e # zduplikuj wynik
 tzn. # przekonwertować na liczbę całkowitą
 = e # sprawdź, czy skonwertowany pierwiastek kwadratowy i pierwotny są równe
} e # koniec bloku
, e # filtruj listę wejściową
Denker
źródło
3

Haskell - 70 60 59 bajtów

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

Stosowanie:

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

Całkiem proste; oblicza sumę cyfr i sprawdza, czy floor (sqrt (y)) ^ 2 == y

Edycja: Ukradnij pomysł sprawdzenia listy kwadratów z C. Quilley

Demon
źródło
2
Ciekawe podejście Nie jestem pewien, czy odpowiedź f=jest wymagana.
Michael Klein,
3

05AB1E, 19 10 bajtów

vySOtDï->—

Wyjaśnienie

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

Wypróbuj online

Edycja: Zapisano 9 bajtów dzięki @Adnan

Emigna
źródło
Aby uzyskać sumę cyfr dla każdej z nich, możesz to zrobić vySOi od razu sprawdzić, czy jest kwadratowa, czy nie. Mam to do 5: tDï->. Istnieje również specjalne wbudowane narzędzie, które drukuje, ygdy jest równe 1, czyli ( ). Tak byłoby vySOtDï->—.
Adnan
@Adnan: Nie mogę uwierzyć, że zapomniałem o S. Nawet nie spojrzałem - ponieważ zadanie mówiło, że ma być wyprowadzane jako lista, ale widzę, że inne odpowiedzi robią to samo, więc zakładam, że jest OK.
Emigna
Tak, elementy oddzielone znakami nowej linii są domyślnie akceptowane, chyba że wyzwanie wyraźnie mówi, że nie.
Adnan
3

R , 57 55 bajtów

Użyj Filterna wektorze. Zakłada 32-bitowe liczby całkowite, więc maksymalnie 10 cyfr.

Przypadki narożne: zwraca NULLpusty wektor i numeric(0)wektor bez prawidłowych liczb. Oba mają długość zerową, więc powinno być do zaakceptowania.

-2 dzięki @Giuseppe

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

Wypróbuj online!

J.Doe
źródło
3

PowerShell , 64 54 bajtów

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

Wypróbuj online!

-10 bajtów dzięki mazzy

Pobiera dane wejściowe jako argumenty wiersza polecenia (patrz przykłady poniżej), które są przetwarzane w programie PowerShell do tablicy $args. Przesuwamy to do ?aliasu dla Where-Object(funkcje podobne do filter), aby wybrać nasze wyjście. Nasz wybór opiera się na wywołaniu .NET [math]::Sqrt()z cyfrową sumą liczby z liczbą całkowitą !(...%1). Liczby całkowite spowodują 0, które gdy noted staje się, Truegdy pierwiastki niecałkowite stają się False.

Jak wspomniano w innym miejscu, „zwracanie” pustej tablicy jest bez znaczenia, ponieważ jest konwertowane, $nullgdy tylko opuści zakres, więc dane wyjściowe dla pustego wejścia są niczym.

Przykłady

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
AdmBorkBork
źródło
1
$n%1sprawdza, czy tylko int$args|?{!([math]::Sqrt(([char[]]"$_"-join'+'|iex))%1)}
mazzy
2

Python 2, 76 bajtów

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

Wypróbuj tutaj!

Niektóre nadużycia eval, aby sprawdzić liczbę kwadratową, reszta jest dość nieefektywna.
Instrukcja eval ma wartość sum(map(int,n ))**.5==int(sum(map(int,n))**.5)

Denker
źródło
2

Oracle SQL 11.2, 213 bajtów

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

Bez golfa

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
Jeto
źródło
2

Brachylog , 26 bajtów

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

Przykład:

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

Wyjaśnienie

Jest to sytuacja, w której coś działa trochę zbyt dobrze ... ta ~^[X:2]część jest prawdziwa zarówno dla pozytywnych, jak i negatywnych X, więc aby uniknąć duplikatów, muszę to określić X > 0.

;.0Część jest tu z powodu błędu (enumerate nie działa na całkowitą 0).

  • Główny predykat

    :1f.                Find all values of Input which satisfy predicate 1
    
  • Predykat 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
    )
    
Fatalizować
źródło
2

Python 2, 53 bajty

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

Przetestuj na Ideone .

Dennis
źródło
1
Na f([1111111111111111])to wygląda repr(n)zawiera 'L'i int('L')rzuca ValueError. Czuję, że potrzebujesz str(n)tutaj?
Lynn,
2
Racja, to nie będzie działać dla długich int. Nie sądzę jednak, że różni się to od rozwiązania w języku z liczbami całkowitymi o stałej szerokości.
Dennis
2

J, 33 27 bajtów

6 bajtów dzięki @miles .

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

W tłumaczach internetowych invnie jest wprowadzany. Zmień to na ^:_1.

Stosowanie

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

Gdzie >>jest STDIN i <<STDOUT.

Nieco golfa

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)

Poprzednia 33-bajtowa wersja

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

Stosowanie

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

Gdzie >>jest STDIN i <<STDOUT.

Nieco golfa

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
Leaky Nun
źródło
1
Możesz użyć, f&.gaby zastosować g, fa następnie odwrotnie, gaby skrócić *:@<.@%:do <.&.%:zapisania 2 bajtów. Możesz go zmienić i użyć tylko parametru floor, aby uzyskać #~[:(=<.)@%:+/"1@(10&#.inv)27 bajtów gdzie invjest ^:_1i jest już zdefiniowane.
mile
2

Javascript 66 bajtów

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

Dzięki za SergioFC za oszczędność 7 bajtów

Bálint
źródło
Nie możesz po prostu użyć c+dzamiast c-+-d? Ponadto możesz użyć n%1==0do sprawdzenia, czy wynik jest liczbą całkowitą, więc może możesz zapisać niektóre bajty, używając b=>!(Math.sqrt((b+"").split``.reduce((c,d)=>c-+-d))%1)do filtrowania
sergioFC
@sergioFC Nie mogę zmienić - + - na +, ponieważ są łańcuchami
Bálint
2

Perl 5, 42 bajtów

41, plus 1 za -pezamiast-e

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

Wyjaśnienie:

  • -ppobiera każdą liczbę całkowitą wejściową w nowym wierszu i przypisuje $_do tego ciągu.
  • my$sinicjuje zmienną $sdo zera, na nowo dla każdej liczby całkowitej wejściowej.
  • map$s+=$_,/./gpobiera każdy znak numeryczny i dodaje go liczbowo $s. (Nowy wiersz staje się 0, gdy jest numerowany).
  • sqrt$s==~~sqrt$ssprawdza czy $sposiada nonintegral pierwiastkowania, a $_ x=marki $_w siebie lub pusty ciąg w zależności od tego testu.
  • -p odbitki $_

Dzięki Brad Gilbert b2gills za oszczędność trzech bajtów.

Również 41 plus 1:

my$s;s/./$s+=$&/ger;$_ x=sqrt$s==~~sqrt$s
  • s/./$s+=$&/gerdodaje każdy znak numeryczny do $s(a nowa linia to 0 jak wyżej)
msh210
źródło
2

JavaScript (Node.js) , 48 bajtów

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

Wypróbuj online!

Wyjaśnienie

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
Any3nymous użytkownik
źródło
1

MATL, 16 14 13 bajtów

"@tV!UsX^1\?x

Wypróbuj online!

Wyjaśnienie

        % 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
Suever
źródło
1

Julia - 38 bajtów

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

Łatwo jest zobaczyć, co to robi. digitskonwertuje liczbę na listę jej cyfr, w sumten sposób oblicza sumę cyfr, a następnie generuje liczbę całkowitą, jeśli liczba jest kwadratem, w przeciwnym razie będzie część ułamkowa. %1zwróci tylko część ułamkową, a jeśli jest zero ( ==0), filterpozostanie na liście, w przeciwnym razie zostanie odfiltrowana.

Użyty jako ![22228,4,113125,22345]

Glen O
źródło
1

Jolf, 8 bajtów

Wypróbuj tutaj!

ψxd!iUuH

Wyjaśnienie

ψxd!iUuH
ψxd       filter the input according to the input
      uH  digit sum of H (element)
     U    sqrt of
   !i     is an integer?
Conor O'Brien
źródło
1

MATLAB, 52 43 42 bajty

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

Tworzy anonimowa funkcja o nazwie ans, która może być wywołana z tablicy jako dane wejściowe: ans([22228,4,113125,22345]).

Demo online . Demo online jest w Octave, które nie działa dla pustych danych wejściowych, ale MATLAB działa.

Wyjaśnienie

Konwertujemy każdy element w tablicy wejściowej na podstawę 10, co da tablicę znaków 2D, w której każdy wiersz zawiera cyfry liczby w tablicy. Aby przekonwertować te znaki na liczby, odejmujemy 48 (ASCII dla '0'). Następnie sumujemy w poprzek rzędów, pobieramy pierwiastek kwadratowy i ustalamy, czy każda wartość jest kwadratem idealnym ~mod 1. Następnie używamy tej wartości logicznej do filtrowania tablicy wejściowej.

Suever
źródło
1

Clojure, 110 bajtów

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

Oblicza sumę cyfr liczbowych, a następnie odfiltrowuje te, dla których nie istnieje liczba, której kwadrat jest równy sumie.

Możesz zobaczyć wynik tutaj - https://ideone.com/ciKOje

Cliffroot
źródło
1

Perl 6 ,  38   35 bajtów

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

Test:

#! /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] => []
Brad Gilbert b2gills
źródło
1

C, 143 141 bajtów

  • zapisane 2 bajty, @ 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 spróbuj online

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
}
Khaled.K
źródło
1

Retina , 69

Ponieważ testowanie idealnych kwadratów w siatkówce. Można to zmodyfikować w celu uogólnionego obliczenia pierwiastka kwadratowego z liczby całkowitej .

. +
$ i a $ i
+ `\ b \ d
$ * b 


\nocleg ze śniadaniem
$ I:
+ `(\ bb +) :( bb \ 1)
1 USD 2 USD:
G` (: a | 0 $)
.*za

Dane wejściowe to lista rozdzielona znakiem nowej linii.

Wypróbuj online.

  • Etap 1 - powtórz liczbę w każdej linii i oddziel je za pomocą a
  • Etap 2 - zamień każdą cyfrę przed aunarną wyrażoną jako bs, oddzieloną spacjami
  • Etap 3 - usuń spacje - teraz każdy z nich reprezentuje sumę cyfr
  • Etap 4 i 5 - Wykorzystaj fakt, że idealne kwadraty można wyrazić 1 + 3 + 5 + 7 + ... Podziel odpowiednio jedno unary
  • Etap 6 - filtr grep to tylko te, które dokładnie dzielą się na powyższą formę
  • Etap 7 - odrzuć wszystkie oprócz oryginalnego numeru
Cyfrowa trauma
źródło
Miałem kilka pomysłów, jak to poprawić, ale ostatecznie przepisałem większość z nich. Niemniej jednak jest to dokładnie twój pomysł: zduplikuj dane wejściowe, rozwiń cyfry w pierwszej połowie, filtruj kwadraty w postaci sum liczb nieparzystych, odrzuć pierwszą połowę pozostałych linii. Sposób, w jaki grałem w te kroki, to %konfiguracja \Gi przekazywanie referencji. Zapraszam do wzięcia: retina.tryitonline.net/… :)
Martin Ender
1

Python, 50 bajtów

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

Jeśli n jest wprowadzoną listą liczb

Swadhikar C.
źródło
1
Witam i witam na stronie! Ponieważ są to zawody w kodzie golfowym , np. Kto potrafi napisać najkrótszy kod, wymagamy, aby wszystkie zgłoszenia były przynajmniej trochę golfa . Mamy listę wskazówek pyton golfa tutaj . Tuż nad moją głową, jednym z oczywistych usprawnień, które możesz zrobić, jest usunięcie wszystkich dodatkowych białych znaków i zmiana nazwy zmiennych na jedną literę. Możesz również wziąć dane wejściowe jako argumenty funkcji lub STDIN zamiast argumentów wiersza poleceń.
DJMcMayhem
Powinieneś także określić język i liczbę bajtów, które można policzyć na przykład tam .
nicael
1
Witamy w PPCG! Oprócz tego, co powiedzieli inni, należy pamiętać, że wszystkie rozwiązania muszą być pełnymi programami lub funkcjami wywoływalnymi . Do tej pory wszystkie twoje odpowiedzi były fragmentami, które zakładają, że dane wejściowe są przechowywane w jakiejś zmiennej i po prostu oceniają wynik, co niestety czyni je nieważnymi. Aby zapoznać się z akceptowalnymi metodami we / wy, zobacz ten meta post .
Martin Ender
1

K (oK) , 19 17 13 bajtów

Rozwiązanie:

(~1!%+/.:'$)#

Wypróbuj online!

Wyjaśnienie:

(~1!%+/.:'$)# / the solution
(          )# / apply function to list
          $   / convert to string
       .:'    / value (.:) each (')
     +/       / sum
    %         / square-root
  1!          / modulo 1
 ~            / not

Uwagi:

  • -2 bajty z inteligentniejszym sposobem identyfikowania kwadratów
  • -4 bajty dzięki ngn
streetster
źródło
1
wiesz o filter ( func#list) ?
ngn
Nie, bardzo miło!
streetster
1

MathGolf , 5 4 bajtów

gÅΣ°

Wypróbuj online!

Wyjaśnienie:

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

MathGolf jest wciąż w fazie rozwoju, więc zakładam, że wkrótce pojawi się domniemany wkład, aby zgolić ten pierwszy bajt. Tak!

Jo King
źródło
Gratuluję pierwszej odpowiedzi MathGolf nie przeze mnie! Omówiłem dorozumiany wkład z Emigną, a on dał mi kilka świetnych pomysłów. Nadchodzi, mam nadzieję, że wkrótce.
maks.