Wyznacz liczbę na swój sposób

32

Ludzie powtarzają mi, że kwadrat liczby jest liczbą pomnożoną przez siebie. To oczywiście nieprawda. Prawidłowy sposób kwadratowania liczby polega na przekształceniu jej w kwadrat, umieszczając go na sobie kilka razy równą liczbie cyfr, które ma, a następnie odczytując wszystkie liczby z wynikowego kwadratu, zarówno poziomo (z tylko od lewej do prawej) i pionowo (tylko od góry do dołu), a następnie dodając je do siebie. Tak więc dla liczby 123 najpierw utworzysz kwadrat:

123
123
123

Następnie weź wszystkie wiersze i kolumny z kwadratu i dodaj je razem:

123+123+123+111+222+333

Co daje nam wynik 1035.

W przypadku liczb ujemnych układasz normalnie (pamiętaj, że liczysz tylko liczbę cyfr , więc znak ujemny nie jest uwzględniany w długości), a następnie odczytujesz liczby poziome normalnie (ze znakami ujemnymi), a następnie ignorujesz znaki ujemne dla liczby pionowe. Tak więc dla liczby -144otrzymujemy kwadrat:

-144
-144
-144

Co daje nam -144-144-144+111+444+444, co równa się567

W przypadku liczb zawierających tylko jedną cyfrę kwadrat jest zawsze równy podwojonej liczbie (odczytany raz poziomo i raz pionowo). Więc 4daje nam

4

Co daje nam 4+4, co równa się 8.

W przypadku liczb z częściami dziesiętnymi stos należy układać normalnie (pamiętaj, że tylko liczby są liczone przy liczbie stosów, a zatem przecinek dziesiętny nie jest liczony) i ignoruj ​​symbole dziesiętne podczas czytania liczb pionowych. Na przykład liczba 244.2daje nam

244.2
244.2
244.2
244.2

Co daje nam 244.2+244.2+244.2+244.2+2222+4444+4444+2222, co równa się 14308.8.

Liczby ułamkowe lub zespolone nie mogą być podniesione do kwadratu.

Twoje zadanie:

Mam dość ręcznego zwiększania liczby do siebie, więc postanowiłem zautomatyzować ten proces. Napisz do mnie program lub funkcję, która pobiera liczbę zmiennoprzecinkową lub łańcuch, w zależności od tego, co wolisz, jako dane wejściowe i zwraca wynik ułożenia kwadratu po mojej stronie.

Przykłady:

123    -> 1035
388    -> 3273
9999   -> 79992
0      -> 0
8      -> 16
-6     -> 0
-25    -> 27
-144   -> 567
123.45 -> 167282.25
244.2  -> 14308.8
2      -> 4
-0.45  -> 997.65
0.45   -> 1000.35

Punktacja:

Moje ręce są ciasne od wypisywania tych wszystkich kwadratów, a mój komputer nie obsługuje kopiowania / wklejania, więc wygrywa wpis z najmniejszą ilością kodu (z jakiegoś powodu w bajtach?)!

Gryphon - Przywróć Monikę
źródło
1
„123.45” i „244.2” nie są poprawne same w sobie, ponieważ komputer przechowuje liczbę w formacie binarnym. Zwykle nie stanowi to problemu, dopóki problem nie opiera się na reprezentacji dziesiętnej.
Leaky Nun
@LeakyNun, tak naprawdę nie wiem, co masz na myśli. Problem nie jest nierozwiązywalny (przynajmniej w pythonie), jestem całkiem pewien, że mógłbym to zrobić dość łatwo, chociaż w dużej liczbie bajtów. Wymagałoby to jednak pewnych manipulacji ciągami.
Gryphon - Przywróć Monikę
@Gryphon Więc musimy brać dane wejściowe jako ciąg?
Leaky Nun
3
@Gryphon To tam się nie udaje. 244.2nie jest liczbą zmiennoprzecinkową. Nie można go przekonwertować na ciąg "244.2".
Leaky Nun
3
@Gryphon Ale zachowania jak to sprawia, że bardzo niewygodne.
Leaky Nun

Odpowiedzi:

8

05AB1E , 7 bajtów

þSDg×+O

Wypróbuj online!

Wyjaśnienie

þSDg×+O Implicit input
þ       Keep digits
 S      Get chars
  D     Duplicate
   g    Length
    ×   Repeat string(s)
     +  Add (implicit input added to all elements)
      O Sum
Erik the Outgolfer
źródło
3
Ooo wyjaśnienie, kiedy możesz, proszę
Jonathan Allan
1
Chciałbym również zauważyć, że pojedyncze wiodące zero jest wymogiem na wejściu dla -1 <wejście <1 (tj. 0,45 i .45 to różne dane wejściowe, ale ta sama liczba, tylko pierwsza z nich jest dopuszczalna)
Jonathan Allan,
@JonathanAllan To ostatnie nie jest obsługiwane.
Erik the Outgolfer
@JonathanAllan Done.
Erik the Outgolfer
7

Galaretka ,  13  12 bajtów

fØDẋ€L$ŒV+VS

Łącze monadyczne przyjmujące listę znaków (dobrze uformowana liczba dziesiętna, dla której wymagane jest pojedyncze wiodące zero -1 <n <1 ) i zwraca liczbę.

Wypróbuj online!

14 bajtów do akceptowania i zwracania liczb (wejście ograniczone do +/- 10 -5 o ŒṘ):ŒṘfØDẋ€L$ŒV+⁸S .

W jaki sposób?

fØDẋ€L$ŒV+VS - Link: list of characters         e.g. "-0.45"
 ØD          - yield digit characters                "0123456789"
f            - filter keep                           "045"
      $      - last two links as a monad:
     L       -   length (number of digit characters) 3
   ẋ€        -   repeat list for €ach digit          ["000","444","555"]
       ŒV    - evaluate as Python code (vectorises)  [0,444,555]
          V  - evaluate (the input) as Jelly code    -0.45
         +   - addition (vectorises)                 [-0.45,443.55,554.55]
           S - sum                                   997.65
Jonathan Allan
źródło
Umm, można wymienić +€ze +w wersji 15-bajtowy dla -1.
Erik the Outgolfer
Już to zrobiłem, dziękuję!
Jonathan Allan
Umm nie w wersji 15-bajtowej. EDYCJA: 3 sekundy za wcześnie, jak sądzę ...
Erik Outgolfer
Właśnie zauważyłeś, że powiedziałeś wersję 15-bajtową - jeszcze raz dziękuję!
Jonathan Allan
6

Haskell, 59 56 bajtów

f s|l<-filter(>'.')s=0.0+sum(read<$>(s<$l)++[c<$l|c<-l])

Dane wejściowe są traktowane jako ciąg.

Wypróbuj online!

Jak to działa

l<-filter(>'.')s      -- let l be the string of all the numbers of the input string
f s   = 0.0 + sum     -- the result is the sum of (add 0.0 to fix the type to float)
   read<$>            -- turn every string of the following list into a number
   s<$l               -- length of l times the input string followed by
   [c<$l|c<-l]        -- length of l times c for each c in l   
nimi
źródło
5

Japt v2 , 16 bajtów

o\d
l
¬xpV +V*Ng

Przetestuj online!

Wyjaśnienie

o\d    First line: Set U to the result.
o      Keep only the chars in the input that are
 \d      digits. (literally /\d/g)

l    Second line: Set V to the result.
l    U.length

¬xpV +V*Ng    Last line: implicitly output the result.
¬             Split U into chars.
 x            Sum after
  pV            repeating each V times.
     +V*Ng    Add V * first input (the sum of the horizontals) to the result.
ETHprodukcje
źródło
4

C # (.NET Core), 150 141 133 bajtów

Zapisano 9 bajtów dzięki @TheLethalCoder
Zapisano kolejne 8 bajtów dzięki @TheLethalCoder

a=>{var c=(a+"").Replace(".","").Replace("-","");int i=0,l=c.Length;var r=a*l;for(;i<l;)r+=int.Parse(new string(c[i++],l));return r;}

Wypróbuj online!

Pobiera ciąg znaków jako dane wejściowe i zwraca liczbę „kwadratową” jako liczbę zmiennoprzecinkową.


Ten kod działa zgodnie z następującym algorytmem:

  1. Utwórz nowy ciąg z danych wejściowych, ale bez kropek dziesiętnych i symboli, abyśmy mogli uzyskać naszą długość i liczby dla kolumn z tego miejsca.

  2. Oblicz wejściowe czasy długości ciągu, który utworzyliśmy w punkcie 1.

  3. Dla każdej kolumny w naszym „kwadracie” utwórz nowy ciąg z numerem kolumny i długością wiersza i dodaj go do naszego wyniku.

Przykład:

Wkład: -135.5

  1. Jeśli zastąpimy kropki dziesiętne i symbole, otrzymamy ciąg znaków 1355, który ma długość 4.
  2. Czasy wejściowe: 4 -135.5 * 4 = -542.
  3. Teraz możemy tworzyć nowe ciągi dla każdej kolumny, analizować je i dodać je do naszej wyniku:
    1111, 3333, 5555, 5555.

Jeśli zsumujemy te liczby, otrzymamy 15012dokładnie to, co nasz program wyświetli.

Ian H.
źródło
1
Witamy na stronie i miłą pierwszą odpowiedź (w szczególności wyjaśnienia są mile widziane!)!
Dada
@Dada Dziękujemy! Nawet trudny jestem raczej niezadowolony z bajtów, które zdobyłem z takich rzeczy string.Replace(), ale myślę, że to jedyny sposób, w jaki działa!
Ian H.
Może być w stanie zapisać niektóre bajty poprzez ustawienie ii lzmiennoprzecinkowe.
TheLethalCoder
@TheLethalCoder Pomyśleliśmy o tym, niestety indeksowanie nie działa z liczbami zmiennoprzecinkowymi i .Lengthnie może być pośrednio konwertowane na zmiennoprzecinkowe.
Ian H.
1
a=>{var c=a.Replace(".","").Replace("-","");int i=0,l=c.Length;var r=float.Parse(a)*l;for(;i<l;)r+=int.Parse(new string(c[i++],l));return r;}141 bajtów. Może być w stanie zapisać, biorąc dane jako a floati rzutując na ciąg znaków, n+""ale nie zaznaczyłem.
TheLethalCoder
3

Brachylog , 23 bajty

{∋ịṫ}ᶠ⟨≡zl⟩j₎ᵐ;[?]zcịᵐ+

Wypróbuj online!

Brachylog nie pasuje do pływaków ...

Wyjaśnienie:

{∋ịṫ}ᶠ⟨≡zl⟩j₎ᵐ;[?]zcịᵐ+ Takes string (quoted) input, with '-' for the negative sign
     ᶠ                  Return all outputs (digit filter)
{   }                    Predicate (is digit?)
 ∋                        An element of ? (input)
  ị                       Convert to number (fails if '-' or '.')
   ṫ                      Convert back to string (needed later on)
      ⟨   ⟩             Fork
       ≡                 Identity
         l               Length
                        with
        z                Zip
             ᵐ          Map
            ₎            Subscript (optional argument)
           j              Juxtapose (repeat) (this is where we need strings)
              ;         Pair with literal
               [ ]       List
                ?         ?
                  z     Zip
                   c    Concatenate (concatenate elements)
                     ᵐ  Map
                    ị    Convert to number
                      + Add (sum elements)
Erik the Outgolfer
źródło
3

Łuska , 15 bajtów

§+ȯṁrfΛ±TṁrSR#±

Pobiera ciąg i zwraca liczbę. Wypróbuj online!

Wyjaśnienie

To trochę denerwujące, że wbudowana funkcja parsowania rpowoduje błędy analizy przy nieprawidłowych danych wejściowych zamiast zwracania wartości domyślnej, co oznacza, że ​​muszę jawnie odfiltrować kolumny, które nie są cyframi. Gdyby zwrócił 0 na zniekształconych danych wejściowych, mógłbym upuścić fΛ±i zapisać 3 bajty.

§+ȯṁrfΛ±TṁrSR#±  Implicit input, e.g. "-23"
             #±  Count of digits: 2
           SR    Repeat that many times: ["-23","-23"]
         ṁr      Read each row (parse as number) and take sum of results: -46
  ȯṁrfΛ±T        This part is also applied to the result of SR.
        T        Transpose: ["--","22","33"]
     fΛ±         Keep the rows that contain only digits: ["22","33"]
   ṁr            Parse each row as number and take sum: 55
§+               Add the two sums: 9
Zgarb
źródło
3

Python 3 , 95 94 87 85 84 bajtów

def f(i):l=[x for x in i if"/"<x];k=len(l);print(k*float(i)+sum(int(x*k)for x in l))

Pakiet testowy .

Python 3 , 78 bajtów

lambda x:sum(float(i*len(z))for z in[[i for i in str(x)if"/"<i]]for i in[x]+z)

Pakiet testowy.

Drugim podejściem jest port do Pythona 3 zainspirowany rozwiązaniem @ officialaimm.

Pan Xcoder
źródło
3

Python 2 , 81 74 bajtów

-7 bajtów dzięki @Mr. Xcoder :'/'<i

  • Pobiera liczbę całkowitą lub zmiennoprzecinkową, zwraca zmiennoprzecinkową.
lambda x:sum(float(i*len(z))for z in[[i for i in`x`if"/"<i]]for i in[x]+z)

Wypróbuj online!

Wyjaśnienie:

Powiedz 123.45jest podany jako dane wejściowe. [i for i in`x`if"/"<x]podaje listę liczb całkowitych strunowych ['1','2','3','4','5'](która również jest z). Teraz wykonujemy iterację, [x]+ztj. [123.45,'1','2','3','4','5']Mnożąc każdy element przez len(z), tutaj 5i konwertując każdy na zmiennoprzecinkowy (tak, aby łańcuchy również zamieniały się odpowiednio), uzyskując [617.25,11111.0,22222.0,33333.0,44444.0,55555.0]. Na koniec obliczamy sum(...)i otrzymujemy 167282.25.

Officialaimm
źródło
78 bajtów . Wymienić i.isdigit()z"/"<i<":"
Pan Xcoder
1
74 bajty . Można wymienić i.isdigit()ze "/"<iw rzeczywistości, ponieważ oba .i -posiadają kody ASCII niższe niż cyfry, ADN /jest między nimi
Pan Xcoder
Nie ma za co. Przeniesiłem go do Pythona 3 jako alternatywę dla mojej odpowiedzi
Mr. Xcoder,
3

JavaScript, 75 62 bajtów

a=>(b=a.match(/\d/g)).map(b=>a+=+b.repeat(c),a*=c=b.length)&&a

Wypróbuj online

-2 bajty dzięki Arnauld
-5 bajtów dzięki Shaggy (myślałem, że funkcja musi otrzymać liczbę, ale teraz widzę, że wiele innych odpowiedzi również otrzymuje ciąg znaków)


źródło
3

Perl 5 , 37 33 + 1 (-p) = 38 34 bajtów

$_*=@n=/\d/g;for$\(@n){$_+=$\x@n}

Wypróbuj online!

Użyłem kilku sztuczek z kodu Dom do golenia 4 bajtów

Wyjaśnił:

@n=/\d/g;    # extract digits from input
$_*=@n;      # multiply input by number of digits
for$\(@n){   # for each digit:
  $_+=       # add to the input
  $\x@n}     # this digit, repeated as many times as there were digits
             # taking advantage of Perl's ability to switch between strings
             # and numbers at any point
Xcali
źródło
Przyszedł z bardzo podobnym podejściem, ale udało się uzyskać kilka bajtów przy użyciu $ \ i wyjść z pętli: spróbuj online!
Dom Hastings,
Wykorzystałeś trochę inspiracji, by ogolić moją. Jaka jest konstrukcja „} {” na końcu twojego? Nie znam tego.
Xcali,
Tego nauczyłem się z tej strony, w zasadzie -ni -pdosłownie owijam while(){...}kod, więc }{się z niego wybieram. To się resetuje$_ ale jeśli użyjesz $\ jako zmiennej, nadal będzie drukowane, ponieważ $\ jest dołączane do każdego wydruku. Oznacza, że ​​możesz przechowywać numer lub coś w tym i ignorować $_. Nie jestem pewien, czy to było świetne wytłumaczenie, ale sprawdź Wskazówki dotyczące gry w gwincie Perla , jestem pewien, że wyjaśnię to lepiej! Cieszę się, że pomogłeś w osiągnięciu wyniku!
Dom Hastings,
2

Pyth , 21 lat 20 bajtów

K@jkUTQ+smv*lKdK*lKv

Zestaw testowy.

Stosuje zupełnie inne podejście niż odpowiedź @ EriktheOutgolfer , która pomogła mi w golfie 1 bajt na czacie, od 22 do 21.


Wyjaśnienie

K@jkUTQ+s.ev*lKbK*lKv

K @ jkUTQ - Filtruje cyfry i przypisuje je do zmiennej K.
         m - mapa. Iteracja cyfr za pomocą zmiennej d
           v - Oceń (konwertuj na float).
            * lKd - Mnoży każdą cyfrę ciągu przez długość K.
        s - Suma
       + - Suma
                 * lKvQ - Mnoży liczbę przez długość ciągu znaków
Pan Xcoder
źródło
2

Oktawa , 100 82 bajtów

Wielkie dzięki @TomCarpenter za nauczenie mnie, że zadania mają wartość zwrotną i oszczędzają 18bajty!

@(v)(n=nnz(s=strrep(num2str(abs(v)),'.','')-'0'))*v+sum(sum(s'*logspace(0,n-1,n)))

Wypróbuj online!

Niegolfowane / Wyjaśnienie

function f=g(v)
  s=strrep(num2str(abs(v)),'.','')-'0';  % number to vector of digits (ignore . and -)
  n=nnz(s);                              % length of that vector
  f=n*v+sum(sum(s'*logspace(0,n-1,n)))   % add the number n times and sum the columns of the square
end

Działa to w ten sposób, że w zasadzie musimy dodać liczbę nrazy, a następnie dodać sumę kolumn. Sumowanie s' * logspace(0,n-1,n)pozwala uzyskać sumę kolumn, na przykład jeśli v=-123.4ta macierz będzie:

[ 1     10    100   1000;
  2     20    200   2000;
  3     30    300   3000;
  4     40    400   4000 ]

Musimy to po prostu sumzrobić i gotowe.

ბიმო
źródło
1
Możesz zapisać 18 bajtów, zmieniając wszystko w anonimową funkcję @(v)(n=nnz(s=strrep(num2str(abs(v)),'.','')-'0'))*v+sum(sum(s'*logspace(0,n-1,n))). Wypróbuj online!
Tom Carpenter
1

Swift 4 , 139 134 bajtów

func f(s:String){let k=s.filter{"/"<$0};print(Float(s)!*Float(k.count)+k.map{Float(String(repeating:$0,count:k.count))!}.reduce(0,+))}

Pakiet testowy.


Wyjaśnienie

  • func f(s:String)- Definiuje funkcję fz jawnym parametrem String s.

  • let k=s.filter{"/"<$0}- Filtruje cyfry: Zauważyłem, że obie -i .mają mniejsze wartości ASCII niż wszystkie cyfry, i /są między ., -a 0. Dlatego właśnie sprawdziłem, czy "/"jest mniejszy niż obecny znak, jak to zrobiłem w mojej odpowiedzi w języku Python.

  • print(...) - Drukuje wynik.

  • Float(s)!*Float(k.count)- Konwertuje zarówno ciąg, jak i liczbę cyfr na zmiennoprzecinkowe i mnoży je (Swift nie zezwala na mnożenie zmiennoprzecinkowe i Int :()). Dodaje więc liczbęx razy, gdzie xjest liczba cyfr, które zawiera.

  • k.map{Int(String(repeating:$0,count:k.count))!- k.map{}mapy kz aktualną wartością $0. String(repeating:$0,count:k.count)pobiera każdą cyfrę, tworzy ciąg xidentycznych cyfr iFloat(...)! konwertuje ją na liczbę zmiennoprzecinkową.

  • .reduce(0,+) - Pobiera sumę powyższej listy.

  • I w końcu +sumuje oba wyniki.


Weźmy przykład!

Powiedz, że nasz ciąg jest "0.45". Po pierwsze, filtrujemy cyfry, więc zostajemy z 0, 4, 5. Mamy przekształcić "0.45"się unosić i pomnożyć przez liczbę cyfr: 0.45 * 3 = 1.35. Następnie bierzemy każdą cyfrę i przekształcić go w ciąg powtarzających tę cyfrę do momentu zakrycia szerokość placu (ilu cyfr istnieją) 0, 4, 5 -> 000, 444, 555. Podsumowując możemy tego 000 + 444 + 555 = 999. Następnie wystarczy dodać wyniki razem: 1.35 + 999 = 1000.35.

Pan Xcoder
źródło
1

C #, 139 137 bajtów

using System.Linq;n=>{var d=(n+"").Where(char.IsDigit);return d.Sum(i=>int.Parse(new string(i,d.Count())))+new int[d.Count()].Sum(_=>n);}

Zaoszczędzono 2 bajty dzięki @Ian H.

Wypróbuj online!

Wersja pełna / sformatowana:

namespace System.Linq
{
    class P
    {
        static void Main()
        {
            Func<double, double> f = n =>
            {
                var d = (n + "").Where(char.IsDigit);
                return d.Sum(i => int.Parse(new string(i, d.Count()))) + new int[d.Count()].Sum(_ => n);
            };

            Console.WriteLine(f(123));
            Console.WriteLine(f(-144));
            Console.WriteLine(f(4));
            Console.WriteLine(f(244.2));

            Console.ReadLine();
        }
    }
}
TheLethalCoder
źródło
Możesz zapisać 2 bajty na początku, używając var d=(n+ ...zamiast var d = (n ....
Ian H.
@IanH. Zapomniałem usunąć wszystkie spacje -_- To właśnie otrzymałem za odpowiedź podczas wykonywania połączenia z pomocą techniczną.
TheLethalCoder
1

Mathematica, 107 bajtów

(t=Length[s=#&@@RealDigits[#]//.{a___, 0}:>{a}];If[IntegerPart@#==0,t++];t#+Tr[FromDigits@Table[#,t]&/@s])&
J42161217
źródło
1

PHP, 78 88 +1 bajtów

for($e=preg_match_all("#\d#",$n=$argn);~$c=$n[$i++];)$s+=str_repeat($c,$e);echo$s+$n*$e;

Uruchom jako potok z -nR.

Może generować ostrzeżenia w PHP 7.1. Zmień za $c,$epomocą, $c>0?$c:0,$eaby naprawić.

Tytus
źródło
0

Python 3 , 68 70 73 77 bajtów

lambda n:sum(float(n)+int(_*sum(x>"/"for x in n))for _ in n if"/"<_)

Wypróbuj online!

Pętla nad każdym znakiem cyfrowym i powtarza go przez ogólną liczbę cyfr, zamienia to na liczbę całkowitą i dodaje to n. W ten sposób ndodawane są dczasy, pozioma część sumy, wraz z powtarzaniem cyfr, która jest częścią pionową. Pierwotnie używany, str.isdigitale >"/"dzięki innym w tym wątku zaoszczędził wiele bajtów. Zapisuje dwa bajty njako ciąg znaków, ale dane wyjściowe są bardziej chaotyczne.

lambda n:sum(n+int(_*sum(x>"/"for x in str(n)))for _ in str(n)if"/"<_)

Wypróbuj online!

C McAvoy
źródło