Kwadrat a Number my Way

Gryphon 08/21/2017. 20 answers, 1.959 views
code-golf number

Ludzie powtarzają mi, że kwadrat liczby to liczba pomnożona przez siebie. Jest to oczywiście nieprawdziwe. Prawidłowy sposób wyrównywania liczby polega na uczynieniu go kwadratem, poprzez ułożenie go na sobie kilka razy równej liczbie cyfr, które ma, a następnie odczytanie wszystkich liczb z wynikowego kwadratu, zarówno w poziomie (z od lewej do prawej) i pionowo (tylko od góry do dołu), a następnie dodawanie ich razem. 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 się normalnie (pamiętaj, że liczysz tylko liczbę digits , więc znak ujemny nie jest uwzględniany w długości), a następnie normalnie odczytuj liczby poziome (ze znakami ujemnymi), a następnie zignoruj ​​znaki ujemne dla liczby pionowe. Tak więc dla liczby -144 otrzymujemy kwadrat:

-144
-144
-144 

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

W przypadku liczb z jedną cyfrą, kwadrat jest zawsze równy liczbie podwojonej (odczytany raz w poziomie i raz w pionie). Tak więc 4 daje nam

4 

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

Dla liczb z dziesiętnymi częściami, stosuj normalnie (pamiętaj, że tylko digits są liczone w liczbie razy, kiedy układasz liczbę, a zatem przecinek dziesiętny nie jest liczony) i ignorujesz symbole dziesiętne podczas odczytywania pionowych liczb. Na przykład daje nam numer 244.2

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 i złożone nie mogą być podniesione do kwadratu.

Twoje zadanie:

Mam dość ręcznej regulacji liczb kwadratowych, więc zdecydowałem się zautomatyzować proces. Napisz mi program lub funkcję, która pobiera float lub string, w zależności od woli, jako dane wejściowe i zwraca wynik z kwadratury na mój sposób.

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 zaczynają być ciasne od wypisywania wszystkich tych kwadratów, a mój komputer nie obsługuje kopiowania / wklejania, więc wpis z najmniejszą ilością kodu do wpisania (mierzony w bajtach z jakiegoś powodu?) Wygrywa!

5 Comments
Gryphon 07/29/2017
Zdaję sobie sprawę, że nie było to w piaskownicy przez bardzo długi czas (tylko nieco ponad dzień), ale miało już 7 przegranych, więc pomyślałem, że prawdopodobnie jest gotowy do wysłania.
1 Leaky Nun 07/29/2017
"123.45" i "244.2" nie są poprawne same w sobie, ponieważ komputer przechowuje numer w postaci binarnej. Zazwyczaj nie stanowi to problemu, dopóki problem nie zależy od reprezentacji dziesiętnej.
3 Leaky Nun 07/29/2017
@Gryphon Tutaj się nie udaje. 244.2 nie jest liczbą zmiennoprzecinkową. Nie można go przekonwertować na ciąg "244.2" .
2 Leaky Nun 07/29/2017
@Gryphon Jednak takie zachowania powodują, że jest to bardzo niewygodne.
7 Gryphon 07/29/2017
Dlaczego trzy zamykają głosy? Jeśli 11 osób może odpowiedzieć na to pytanie, myślę, że to chyba całkiem jasne!

20 Answers


Erik the Outgolfer 07/29/2017.

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 
4 comments
3 Jonathan Allan 07/29/2017
Ooo wyjaśnienia, kiedy możesz
1 Jonathan Allan 07/29/2017
Również chciałbym zauważyć, że pojedyncze wiodące zero jest wymaganiem na wejściu dla -1 <wejście <1 (tj. 0,45 i .45 są różnymi wejściami, ale ta sama liczba, tylko pierwsza jest dopuszczalna)
Erik the Outgolfer 07/29/2017
@ JonathanAllan To ostatnie nie jest obsługiwane w żaden sposób.
Erik the Outgolfer 07/29/2017
@ Jonathan Alll Done.

Jonathan Allan 07/29/2017.

Galaretka , 13 12 bajtów

fØDẋ€L$ŒV+VS 

Monadyczne łącze akceptujące listę znaków (dobrze uformowaną liczbę dziesiętną, pojedyncze wiodące zero jest wymaganiem dla -1 < n < 1 ) i zwracającą liczbę.

Try it online!

14 bajtów do akceptowania i zwracania liczb (wejście ograniczone przy +/-10-5 przez ŒṘ ): ŒṘ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 
4 comments
Erik the Outgolfer 07/29/2017
Umm, możesz zamienić +€ + w wersji 15 bajtów dla -1.
Jonathan Allan 07/29/2017
Już to zrobiłem, dzięki!
Erik the Outgolfer 07/29/2017
Umm nie w wersji 15-bajtowej. EDYTOWANIE: 3 sekundy za wcześnie Przypuszczam ...
Jonathan Allan 07/29/2017
Właśnie zauważyłem, że powiedziałeś 15 bajtową wersję - jeszcze raz dziękuję!

nimi 07/29/2017.

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 znaków.

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 

ETHproductions 07/29/2017.

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. 

Ian H. 07/31/2017.

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

Saved 9 bytes thanks to @TheLethalCoder
Zaoszczędzono 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 

Wypróbuj online!

Przyjmuje ciąg znaków jako dane wejściowe i wyprowadza liczbę "kwadratów" jako liczbę zmiennoprzecinkową.


Ten kod jest zgodny z następującym algorytmem:

  1. Utwórz nowy ciąg znaków z danych wejściowych, ale bez kropek dziesiętnych i symboli, abyśmy mogli pobrać z niego naszą długość i numery kolumn.

  2. Oblicz czasy wprowadzania długości łańcucha, 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:

Dane wejściowe: -135.5

  1. Jeśli zastąpimy przecinki dziesiętne i symbole otrzymamy ciąg 1355 , który ma długość 4 .
  2. Czasy wejściowe 4: -135.5 * 4 = -542 .
  3. Teraz tworzymy nowe ciągi dla każdej kolumny, parsujemy je i dodajemy do naszego wyniku:
    1111 , 3333 , 5555 , 5555 .

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

5 comments
1 Dada 07/31/2017
Witaj na stronie i miła pierwsza odpowiedź (szczególnie doceniane są wyjaśnienia!)!
Ian H. 07/31/2017
@Dada Dziękuję! Nawet ciężko jestem raczej niezadowolony przez bajty, które zdobyłem z takich rzeczy jak string.Replace() , ale myślę, że to jedyny sposób, w jaki działa!
TheLethalCoder 07/31/2017
Może być w stanie zapisać kilka bajtów, ustawiając i i l na pływające.
Ian H. 07/31/2017
@TheLethalCoder Pomyślałem o tym również, niestety indeksowanie nie działa z wartościami .Length , a .Length nie może być niejawnie przekształcana w .Length .
1 TheLethalCoder 07/31/2017
a=>{var c=a.Replace(".","").Replace("-","");int i=0,l=c.Length;var r=float.Parse(a)*l;for(;i 141 bajtów. Może być w stanie zapisać, biorąc wejście jako float i rzutowanie na ciąg n+"" ale nie sprawdziłem.

Erik the Outgolfer 07/29/2017.

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) 

Zgarb 07/29/2017.

Łuska , 15 bajtów

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

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

Wyjaśnienie

To trochę denerwujące, że wbudowana funkcja analizowania r daje błędy analizy błędnych danych wejściowych zamiast zwracania wartości domyślnej, co oznacza, że ​​muszę jawnie odfiltrować kolumny składające się z nie-cyfr. Jeśli zwrócono 0 na źle fΛ± wejściach, 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 

Mr. Xcoder 07/29/2017.

Python 3 , 95 94 87 85 84 bajty

 def f(i):l=[x for x in i if"/" 

Pakiet testowy .

Python 3 , 78 bajtów

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

Pakiet testowy.

Drugie podejście to port do Pythona 3 inspirowany rozwiązaniem @ officialaimm.


ThePirateBay 07/31/2017.

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 bytes thanks to Arnauld
-5 bytes thanks to Shaggy (chociaż funkcja musi otrzymać liczbę, ale teraz widzę, że wiele innych odpowiedzi również otrzymuje ciąg)


Xcali 08/05/2017.

Perl 5 , 37 33 + 1 (-p) = 38 34 bajty

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

Wypróbuj online!

Wykorzystał kilka sztuczek z kodu Dom, aby zgolić 4 bajty

Explained:

 @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 
3 comments
Dom Hastings 07/31/2017
Przyszedł z bardzo podobnym podejściem, ale udało się uzyskać kilka bajtów wyłączonych za pomocą $ \ i wyjście z pętli: spróbuj online!
Xcali 08/05/2017
Wykorzystałem kilka inspiracji, aby ogolić moją. Co jest konstruktem "} {" na końcu twojego? Nie znam tego.
Dom Hastings 08/05/2017
Z tej strony dowiedziałem się, że w zasadzie -n i -p dosłownie zawijam while(){...} wokół kodu, więc }{ wyłamuje się z tego. Odblokowuje $_ ale jeśli użyjesz $\ jako zmiennej, nadal będzie drukowane, ponieważ $\ jest dołączane do każdego wydruku. Oznacza, że ​​możesz zapisać numer lub coś w tym stylu i odrzucić $_ . Nie jestem pewien, czy to było świetne wyjaśnienie, ale sprawdź porady dotyczące gry w golfa w wątku Perla , jestem pewien, że wyjaśnię to lepiej! Cieszę się, że pomogłem ci w uzyskaniu wyniku!

Erik the Outgolfer 07/29/2017.

Galaretka , 17 bajtów

ŒṘfØDẋ€L©$ŒV;ẋ®$S 

Wypróbuj online!


Erik the Outgolfer 07/29/2017.

Pyth, 18 bajtów

s+RvQsM*RF_lB@jkUT 

Wypróbuj tutaj.


Mr. Xcoder 07/29/2017.

Pyth , 21 20 bajtów

K@jkUTQ+smv*lKdK*lKv 

Zestaw testów.

Używa zupełnie innego podejścia niż odpowiedź @ EriktheOutgolfer , która pomogła mi w 1 bajcie golfa 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 poprzez cyfry ze zmienną d             v - Oceń (przekonwertuj na zmienną).              * lKd - Mnoży każdą cyfrę ciągu przez długość K.          s - Suma         + - Suma                   * lKvQ - Powtarza liczbę przez długość ciągu cyfr 

officialaimm 07/30/2017.

Python 2 , 81 74 bajty

-7 bytes thanks to @Mr. Xcoder -7 bytes thanks to @Mr. Xcoder : '/'

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

Wypróbuj online!

Wyjaśnienie:

Powiedz 123.45 jest podane jako dane wejściowe. [i for i in`x`if"/" podaje listę uszeregowanych liczb całkowitych ['1','2','3','4','5'] (który również jest z ). Teraz przechodzimy przez [x]+z tj. [123.45,'1','2','3','4','5'] , mnożąc każdy element przez len(z) , tutaj 5 i zamieniając każdy na Float (tak, że struny również [617.25,11111.0,22222.0,33333.0,44444.0,55555.0] konwersji), dając [617.25,11111.0,22222.0,33333.0,44444.0,55555.0] . Na koniec obliczamy sum(...) i uzyskujemy 167282.25 .

4 comments
Mr. Xcoder 07/29/2017
78 bajtów . Zamień i.isdigit() "/"
1 Mr. Xcoder 07/29/2017
74 bajty . Możesz zastąpić i.isdigit() przez "/" , ponieważ oba . oraz - mają niższe kody ASCII niż cyfry, adn / jest pomiędzy nimi
officialaimm 07/29/2017
@ Mr.Xcoder Wielkie dzięki!
Mr. Xcoder 07/29/2017
Nie ma za co. Przeniosłem to do Pythona 3 jako alternatywy dla mojej odpowiedzi

Bruce Forte 07/30/2017.

Oktawa , 100 82 bajtów

Wielkie dzięki @TomCarpenter za nauczanie mnie, że przypisania mają wartość zwracaną i oszczędzają 18 bajtów!

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

Wypróbuj online!

Ungolfed / Explanation

 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 zasadniczo musimy dodać samą liczbę n razy, a następnie dodać sumę kolumn. s' * logspace(0,n-1,n) osiąga sumę kolumn, na przykład jeśli v=-123.4 ta macierz będzie:

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

Więc musimy to sum i skończymy.

1 comments
1 Tom Carpenter 07/30/2017
Możesz zaoszczędzić 18 bajtów, rozbijając wszystko na anonimową funkcję @(v)(n=nnz(s=strrep(num2str(abs(v)),'.','')-'0'))*v+sum(sum(‌​s'*logspace(0,n-1,n)‌​)) . Wypróbuj online!

Mr. Xcoder 07/30/2017.

Swift 4 , 139 134 bajty

 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ę f z jawnym parametrem String s .

  • let k=s.filter{"/"<$0} - Filtruje cyfry: Zauważyłem, że zarówno - jak i . mają mniejsze wartości ASCII niż wszystkie cyfry i / jest pomiędzy . , - i 0 . Dlatego właśnie sprawdziłem, czy "/" jest mniejsze niż obecny znak, tak jak to zrobiłem w odpowiedzi na pytanie Pythona.

  • print(...) - Drukuje wynik.

  • Float(s)!*Float(k.count) - Konwertuje zarówno String, jak i liczbę cyfr na Float i mnoży je (Swift nie pozwala na mnożenie Float i Int :()). Więc dodaje liczbę x razy, gdzie x to liczba cyfr, które zawiera.

  • k.mapNO maps over k with the current value $0 . - k.map{} odwzorowuje k przy bieżącej wartości $0 . String(repeating:$0,count:k.count) pobiera każdą cyfrę, tworzy Ciąg String(repeating:$0,count:k.count) z identycznych cyfr i Float(...)! zamienia go na liczbę zmiennoprzecinkową.

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

  • I na koniec + sumuje dwa wyniki.


Weźmy przykład!

Powiedzmy, że nasz ciąg to "0.45" . Po pierwsze, filtrujemy cyfry, więc pozostaje nam 0, 4, 5 . Konwertujemy "0.45" na Float i mnożymy przez liczbę cyfr: 0.45 * 3 = 1.35 . Następnie bierzemy każdą cyfrę i przekształcamy ją w Ciąg powtarzający tę cyfrę, aż wypełni się szerokość kwadratu (ile jest tam cyfr): 0, 4, 5 -> 000, 444, 555 . Sumujemy to, 000 + 444 + 555 = 999 . Następnie dodajemy razem wyniki: 1.35 + 999 = 1000.35 .


TheLethalCoder 07/31/2017.

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

Saved 2 bytes thanks to @Ian H.

Wypróbuj online!

Wersja pełna / sformatowana:

 namespace System.Linq
{
    class P
    {
        static void Main()
        {
            Func 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();
        }
    }
} 
2 comments
Ian H. 07/31/2017
Możesz zapisać 2 bajty na początku, używając var d=(n+ ... zamiast var d = (n ...
TheLethalCoder 07/31/2017
@IanH. Zapomniałem usunąć wszystkie spacje -_- To jest to, co otrzymuję za udzielanie odpowiedzi podczas wykonywania połączenia wsparcia.

Jenny_mathy 08/09/2017.

Mathematica, 107 bajtów

(t=Length[s=#&@@RealDigits[#]//.{a___, 0}:>{a}];If[IntegerPart@#==0,t++];t#+Tr[FromDigits@Table[#,t]&/@s])& 

Titus 08/11/2017.

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 dać ostrzeżenia w PHP 7.1. Powtórz $c,$e z $c>0?$c:0,$e aby naprawić.


C McAvoy 07/31/2017.

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żdą cyfrą i powtarza ją przez całkowitą liczbę cyfr, czyni ją liczbą całkowitą i dodaje ją do n . W ten sposób n dodaje się d razy, poziomą część sumy, wraz z powtarzaniem cyfr, które jest częścią pionową. Pierwotnie używany str.isdigit ale >"/" , dzięki innym w tym wątku, zapisał dużo bajtów. Zapisuje dwa bajty, przyjmując n jako ciąg, ale wynik jest bardziej zawiły.

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

Wypróbuj online!

Related questions

Hot questions

Language

Popular Tags