Równolegogram liczby

18

Teraz, gdy wiemy, jak prawidłowo wyrównać i trójkątować liczbę, nauczymy się, jak ją równoległobokować. Aby wykonać równoległobok liczby, najpierw układamy go jako równoległobok, układając go na sobie kilka razy równy liczbie cyfr, które ma, i dodając spacje, aby był równoległobokiem. Więc 123utworzy:

   123
  123
 123

Teraz bierzemy każdą liczbę poziomą i pionową i dodajemy ją 123+123+123+1+12+123+23+3, która jest równa 531, co jest równoległobokiem 123.

Twoje zadanie:

Napisz program lub funkcję, która po podaniu liczby jako wejścia zwraca równoległobok liczby.

Wejście:

Nieujemna liczba całkowita lub nieujemna liczba całkowita reprezentowana przez ciąg.

Wynik:

Równoległobok liczby całkowitej.

Przypadki testowe:

1234567 -> 10288049
123     -> 531
101     -> 417
12      -> 39

Punktacja:

To jest , najniższy wynik w bajtach wygrywa!

Gryphon - Przywróć Monikę
źródło
Sandbox Post
Gryphon - Przywróć Monikę
Dlaczego głosowanie negatywne?
Gryphon - Przywróć Monikę

Odpowiedzi:

9

MATL , 12 bajtów

tnEXyPY+c!Us

Dane wejściowe to ciąg znaków. Wypróbuj online!

Wyjaśnienie

Rozważ dane wejściowe '123'jako przykład.

Kod duplikuje input ( t) i buduje macierz tożsamości ( Xy) o wielkości dwukrotnie większej niż długość wejściowa ( nE):

1 0 0 0 0 0
0 1 0 0 0 0
0 0 1 0 0 0
0 0 0 1 0 0
0 0 0 0 1 0
0 0 0 0 0 1

następnie odwraca go do góry nogami ( P):

0 0 0 0 0 1
0 0 0 0 1 0
0 0 0 1 0 0
0 0 1 0 0 0
0 1 0 0 0 0
1 0 0 0 0 0

Łańcuch wejściowy, interpretowany jako kody ASCII cyfr, jest równoważny numerycznemu wektorowi wiersza

49 50 51

Pełnowymiarowy dwuwymiarowy splot ( Y+) powyższego wektora i macierzy daje

 0  0  0  0  0 49 50 51
 0  0  0  0 49 50 51  0
 0  0  0 49 50 51  0  0
 0  0 49 50 51  0  0  0
 0 49 50 51  0  0  0  0
49 50 51  0  0  0  0  0

Interpretacja tych liczb z powrotem jako kody ASCII ( c) daje następującą macierz znaków , przy czym char 0 jest reprezentowany jako spacja:

     123
    123 
   123  
  123   
 123    
123

Transpozycja ( !) przekształca to w

     1
    12
   123
  123 
 123  
123   
23    
3     

Interpretacja każdego wiersza jako liczby ( U) daje numeryczny wektor kolumny

  1
 12
123
123
123
123
 23
  3

i zsumowanie go ( s) daje wynik końcowy, 531.

Luis Mendo
źródło
1
Wyczuwam ... splot
Adnan
1
@Adnan Co jeszcze? :-D
Luis Mendo
6

Siatkówka , 22 bajty

.
$`;$&$';$_;
\d+
$*
1

Wypróbuj online! Link zawiera przypadki testowe. Objaśnienie: Pierwszy etap dzieli numer wejściowy na każdą cyfrę i obejmuje wszystkie wyłączne prefiksy i sufiksy włącznie, podając liczby pionowe, a także oryginalny numer wejściowy powtórzony dla każdej cyfry, podając liczby poziome. Pozostałe etapy po prostu sumują uzyskane liczby.

Neil
źródło
6

05AB1E ,  12 11  8 bajtów

Jestem pewien, że można dalej grać w golfa - porady mile widziane!

-1 bajt dzięki Erikowi Outgolferowi (unikaj zawijania, ale używając konkatenacji),
a następnie ...
-3 więcej bajtów dzięki Adnanowi (unikaj mnożenia przez długość-1 poprzez wektoryzację dodawania i odejmowanie danych wejściowych na końcu)

.s¹η++Oα

Wypróbuj online!

W jaki sposób?

.s¹η++Oα - implicit input, say i      e.g.  123
.s       - suffixes                         [3,23,123]
  ¹      - push i                           123
   η     - prefixes                         [1,12,123]
    +    - addition of top two              [4,35,246]
     +   - addition (vectorises)            [127,158,369]
      O  - sum                              654
       α - absolute difference abs(123-654) 531
         - implicit print
Jonathan Allan
źródło
Możesz użyć «do połączenia sufiksów i prefiksów:g<*¹.s¹η«O+
Erik the Outgolfer
1
.s¹η++Oαpowinien działać przez 8 bajtów
Adnan
Dzięki @EriktheOutgolfer te dwa opakowania wydawały mi się dziwne!
Jonathan Allan
@Adnan - to całkiem słodkie!
Jonathan Allan
@JonathanAllan „wskazówki mile widziane!” nie jestem pewien, czy coś jeszcze dostaniesz ...
Erik the Outgolfer
5

Haskell , 90 78 76 71 64 63 59 57 bajtów

g x=sum[x+div x(10^a)+mod x(10^a)|(a,_)<-zip[1..]$show x]

Wypróbuj online!

Post Rock Garf Hunter
źródło
g x=sum[x+div x a+mod x a|(a,_)<-zip((10^)<$>[1..])$show x].
nimi
g x=sum[x+div x(10^a)+mod x(10^a)|(a,_)<-zip[1..]$show x]jest jeszcze krótszy.
Lynn,
g x=sum[x+x`div`10^a+x`mod`10^a|(a,_)<-zip[1..]$show x].
Laikoni,
4

Łuska , 13 12 bajtów

ṁit§+SRL§+ḣṫ

Wypróbuj online!

Wyjaśnienie

              -- implicit input, say "123"
   §+         -- concatenate the results of the following two functions
     SR       --  ¹repeat the input n times, where n is the result of the next function
       L      --   length                                                  ["123","123"]
        §+   --  ²concatenate the results of the following two functions
          ḣ  --     prefixes                                              ["","1","12","123"]
           ṫ --     suffixes                                              ["123","23","3",""]
              -- inner concatenation                                      ["","1","13","123","123","23","3",""]
              -- outer concatenation                                      ["123","123","","1","13","123","123","23","3",""]
  t           -- all but the first element                                ["123","","1","13","123","123","23","3",""]
ṁ             -- map then sum
 i            --   convert to integer (where "" converts to 0)
H.PWiz
źródło
4

Neim , 7 bajtów

𝐱S𝐗𝔻𝔻𝐬𝕤

Strzec się. Zawiera węże:S𝐬𝕤

Wypróbuj online!

Okx
źródło
1
Uwaga. Zawiera węże:S𝐬𝕤 ” Lol ..𝐗𝔻
Kevin Cruijssen
4

Python 3 , 85 70 bajtów

f=lambda n,r=1,i=int:n[r:]and i(n[r:])+i(n[:r])+f(n,r+1)+i(n)or i(n)*2

Dla danych wejściowych 12345:

Podsumowuje wycinki danych wejściowych 1 + 2345 + 12345, 12 + 345 + 12345, 123 + 45 + 12345, 1234 + 5 + 12345, stosując indeksowanie ciągów do indeksu (r) = 1,2,3,4 przed rzutowaniem na liczbę całkowitą i dodaje do 12345 * 2

Specjalne podziękowania dla:

-14 Bajtów @Jonathan Allen

-1 bajt @ovs

Wypróbuj online!

Conner Johnston
źródło
TIO prowadzi do niewłaściwego kodu. (len(n)+1)można zagrać w golfa do -~len(n)( ~xis -1-x), a następnie można zaoszczędzić kolejny bajt za pomocą -i(n)*~len(n). Następnie możesz uczynić to wszystko anonimową funkcją: lambda n,i=int:sum(i(n[:r])+i(n[r:])for r in range(1,len(n)))-i(n)*~len(n)(74 bajty)
Jonathan Allan,
Jeszcze lepiej, aby ta funkcja była rekurencyjna dla 71 bajtów:f=lambda n,r=1,i=int:n[r:]and i(n[r:])+i(n[:r])+f(n,r+1)or-i(n)*~len(n)
Jonathan Allan,
Naprawiłem twój link tio.
Pan Xcoder,
3

Japt , 15 11 bajtów

-4 bajty dzięki @Shaggy.

¬£iYç
cUz)x

Pobiera dane wejściowe jako ciągi znaków.

Wypróbuj online!

Wyjaśnienie

£

Podziel tablicę wejściową na cyfry ( ¬) i zamapuj według ( £) następującej funkcji, gdzie Y jest indeksem.
["1", "2", "3"]

iYç

Wartość wejściowa (domyślna) ze Yspacjami ( ç) wstawionymi ( i) na początku. Jest to przypisane do U.
["123", " 123", " 123"]

cUz1)x

Połącz to ze sobą obrócone o 90 ° w prawo ( 1czas). Następnie sum ( x).
["123", " 123", " 123", " 1", " 12", "123", "23 ", "1 "]-> 531.

Justin Mariner
źródło
Dokładnie tak, jak próbowałem to zrobić, ale z jakiegoś powodu nie mogłem się do końca dostać - ładnie zrobione :) Oto 13-bajtowa wersja.
Kudłaty
11 bajtów
Kudłaty
@Shaggy Awesome, wiedziałem, że musi być krótszy sposób, aby wstawić spacje do każdej linii. Dzięki!
Justin Mariner,
3

Japt , 31 18 bajtów

-13 bajtów dzięki @ETHproductions

To podejście nie działa dobrze przy użyciu Japt. Rozwiązanie Justina jest znacznie lepsze.

[U*Ål U¬£tYÃUå+]xx

Wyjaśnienie:

[U*Ål U¬£tYÃUå+]xx
[              ]    // Create a new array
 U*Ål               // Push: Input * Input.slice(1).length()
                    // Push:
      U¬            //   Input, split into chars
        £tY         //   Map; At each char: .substr(Index)
            Uå+     // Push: Cumulative reduce Input; with addition
                xx  // Sum all the items, twice

Wypróbuj online!

Oliver
źródło
3
To wszystko, Ul 
dodaję
Hmm ... nie potrzebujesz żadnej z Ufunkcji, a środkowy element w tablicy może zostać skondensowany Uå+ x, co myślę, że sprowadza cię do 23 bajtów.
ETHprodukcje
@ETHproductions Dzięki! Znalazłem kolejny bajt, przestawiając elementy tablicy.
Oliver,
Czy możesz się zmienić mx xna xx? :-)
ETHproductions
@ETHproductions Na pewno mogę, dzięki jeszcze raz :)
Oliver,
2

Rubin , 61 55 + 1 = 56 bajtów

Używa -nflagi. Dane wejściowe ze STDIN.

p (1..~/$/).sum{|i|[$_[i,~/$/],$_[0,i],$_].sum &:to_i}

Wypróbuj online!

Wartość tuszu
źródło
W celu wprowadzenia 102033program drukuje, 728714gdy poprawna jest wartość 729702.
NIEEEE! Przeklinajcie OCTAL REPREZENTACJE! (problem polegał na naprawie brb 02033)
Value Ink
Przypuszczałem, że problemem są liczby ósemkowe, ale nie byłem pewien (a przy okazji nie znam ruby). Dzięki za wytłumaczenie :)
@ThePirateBay nie ma problemu; Pracowałem już nad krótszym, alternatywnym rozwiązaniem, które pobierało dane wejściowe z łańcucha, a nawet z potrzebnymi poprawkami i tak ostatecznie udało mi się zaoszczędzić bajty :)
Value Ink
2

JavaScript, 77 74 bajtów

Zaoszczędź 3 bajty dzięki Value Ink

f=a=>[...a+a].map((_,b)=>a-=-z.substr((b-=n)>0?b:0,b+n),a*=n=(z=a).length)|a

console.log(f('123'));
console.log(f('101'));
console.log(f('12'));
console.log(f('1234567'));
console.log(f('102033'));


źródło
1

Pyth , 20 19 bajtów

Moje obecne podejście do prefiksu (mam nadzieję, że golf dalej).

+*tlQsQssM+_M.__Q._

Pakiet testowy lub wypróbuj alternatywne podejście z tą samą liczbą bajtów .

Wyjaśnienie

+*tlQsQssM+_M.__Q._  - Full program that reads a String from STDIN, with implicit input.

  tlQ                - Length of the input - 1.
     sQ              - The input converted to an integer.
 *                   - Product of the above two elements. We will call this P.
                 ._  - Prefixes of the input.
          +          - Concatenated with:
           _M.__Q    - The prefixes of the reversed input, reversed.
        sM           - Convert each to an integer.
       s             - Sum.
+                    - Addition of the product P and the sum above.

Aby lepiej zrozumieć tę koncepcję, weźmy przykład "123" .

  • Najpierw otrzymujemy prefiksy wejścia. To są ['1', '12', '123'].

  • Następnie otrzymujemy prefiksy odwróconego wejścia, tj .: ['3', '32', '321'] i odwracamy każdy, stąd otrzymujemy ['3', '23', '123'].

  • Łączymy dwie listy i konwertujemy każdy element na liczbę całkowitą, więc otrzymujemy [3, 23, 123, 1, 12, 123] .

  • Po zsumowaniu listy wynik jest następujący 285 .

  • Produkt Pjest długością wejścia - 1 (tj2 ) Pomnożona przez jego całkowitą reprezentację ( 2 * 123 = 246).

  • Na koniec sumujemy dwa wyniki: 285 + 246stąd otrzymujemy 531, który jest poprawnym wynikiem.


Pyth , 20 bajtów

+*hlQsQsm+s>Qds<QdtU

Pakiet testowy.

Wyjaśnienie

Wyjaśnienie, które nastąpi po dalszym golfie. Na razie nie udało mi się zagrać w golfa (mam jednak pomysły).

+*hlQsQsm+s>Qds<QdtUQ  - Full program. Reads from STDIN. Q means input, and is implicit at the end.

  hlQ                  - Length of the input + 1.
     sQ                - The input converted to an integer.
 *                     - Multiply the above. We'll call the result P.
        m         tUQ  - Map over [1...length of the input)
          s>Qd         - input[currentItem:] casted to an integer.
              s<Qd     - input[:currentItem] casted to an integer.
         +             - Sum the above.
       s               - Sum the list.
+                      - Add the sum of the list and P.
Pan Xcoder
źródło
1

q / kdb +, 34 bajty

Rozwiązanie:

{sum"J"$((c#c),c-(!)2*c:(#)x)#\:x}

Przykłady:

q){sum"J"$((c#c),c-(!)2*c:(#)x)#\:x}"1234567"
10288049
q){sum"J"$((c#c),c-(!)2*c:(#)x)#\:x}"123"    
531
q){sum"J"$((c#c),c-(!)2*c:(#)x)#\:x}"101"    
417
q){sum"J"$((c#c),c-(!)2*c:(#)x)#\:x}"12"     
39

Wyjaśnienie:

{sum"J"$((c#c),c-til 2*c:count x)#\:x} / ungolfed
{                                    } / lambda function
                                    x  / implicit input
                                 #\:   / apply take (#) to each-left element with the right element
        (                       )      / the left element
                       c:count x       / count length and save in variable c
                     2*                / multiply by 2 (e.g. 6)
                 til                   / range, so 0 1 2 3 4 5
               c-                      / vector subtraction, so 3 2 1 0 -1 -2
         (   )                         / do this together
          c#c                          / 3 take 3, so 3 3 3
              ,                        / join, so 3 3 3 3 2 1 0 - 1 -2          
    "J"$                               / cast this "123", "123", "123" .. "23" to longs
 sum                                   / sum them up and return result
streetster
źródło
1

Swift 3 , 213 bajtów

func f(n:String){print((n.characters.count-1)*Int(n)!+(0..<n.characters.count).map{r in Int(n[n.index(n.startIndex,offsetBy:r)..<n.endIndex])!+Int(n[n.startIndex..<n.index(n.endIndex,offsetBy:-r)])!}.reduce(0,+))}

Nie można przetestować online, ponieważ działa wolno i upływa limit czasu. Możesz go wypróbować na Swift Playgrounds, jeśli chcesz go przetestować.

Przykładowy przebieg

Wejście:

f (n: „123”)
f (n: „101”)
f (n: „1234567”)

Wynik:

531
417
10288049
Pan Xcoder
źródło
1

Galaretka , 12 bajtów

LḶṚ⁶ẋ;€µ;ZVS

Wypróbuj online!

Pobiera dane wejściowe jako ciąg. Tworzy „równoległobok” jako macierz znaków, a następnie ocenia każdy wiersz i kolumnę, aby uzyskać sumę liczb.

Wyjaśnienie

LḶṚ⁶ẋ;€µ;ZVS  Input: string S
L             Length
 Ḷ            Lowered range - [0, 1, ..., len(S)-1]
  Ṛ           Reverse
   ⁶          The char ' ' (space)
    ẋ         Create that many characters of each in the range
     ;€       Prepend each to S
       µ      Begin a new monadic chain
        ;     Concatenate with
         Z    Transpose
          V   Eval each string
           S  Sum
mile
źródło
1

C (gcc) ,95 8481 bajtów (78 + -lmflaga kompilatora)

Cześć! To moje pierwsze zgłoszenie, mam nadzieję, że nie złamałem żadnej zasady.

g,o,l;f(char*s){l=atoi(s);while(s[o++])g+=l/pow(10,o)+atoi(s+o);return g+l*o;}

Wypróbuj online!

Bez golfa, bez ostrzeżeń:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int g,o,l;

int f(char *s){
  l = atoi(s);

  while(s[o++]) {
    g+=l/pow(10,o)+atoi(s+o);
  }

  return g+l*o;
}

int main(void){
  printf("%d\n",f("1234567"));
  return 0;
}
szkocki
źródło
Wygląda na to, że jestem ważny :)
Okx,
Hmm, -lmdo funkcji matematycznych potrzebne są tylko niektóre środowiska wykonawcze C, takie jak np glibc. Kompilacja np. Z MinGW (przy użyciu Microsoft msvcrt.dll), nie byłaby potrzebna. Więc nie jesteś pewien, czy trzeba go tutaj dodać? W każdym razie, jeśli go dodasz, utworzy 3 bajty;)
Felix Palmen
Niestety -lmjest potrzebny do pow()funkcji z gcc. Próbowałem pracować bez niego, ale nie mogłem znaleźć rozwiązania wykorzystującego mniej niż 6 bajtów (pow + flaga kompilatora). Nie mogłem znaleźć zasad dotyczących włączania flag do liczby bajtów i wiem, że zdałem sobie sprawę z fałszywego założenia, że -postać nie jest liczona. W tej chwili dodaję bajt +1.
scottinet,
-lmnie jest wymagane, gccale przez fakt, że glibcnie zawiera funkcji matematycznych w głównej bibliotece. msvcrt.dllrobi, więc kompilowanie w gccsystemie Windows z dziełami bez -lm. To dręczące i nie jestem do końca pewien, co mają do powiedzenia reguły w tym zakresie.
Felix Palmen
Dzięki za heads-upa :) Nie jestem w stanie wypróbować twojej propozycji i tio nie wydaje się również oferować takiej możliwości, niestety
scottinet
1

Java 8, 147 137 126 116 114 bajtów

n->{Integer l=(n+"").length(),r=n*l,i=0;for(;++i<l*2;)r+=l.valueOf((n+"").substring(i>l?i-l:0,i<l?i:l));return r;}

-13 bajtów (137 → 126 i 116 → 114) dzięki @ OlivierGrégoire .

Wyjaśnienie:

Wypróbuj tutaj.

n->{                          // Method with integer as parameter and return-type
  Integer l=(n+"").length(),  //  Length of the input integer
      r=n*l,                  //  Result-integer (starting at `n*l`)
      i=0;                    //  Index-integer (starting at 0)
  for(;++i<l*2;               //  Loop from 0 through two times `l` (exclusive)
    r+=                       //   Add to the result-integer sum:
       l.valueOf((n+"").substring(
                              //    Substring of input, converted to integer:
        i>l?                  //     If `i` is larger than `l`:
         i-l                  //      Substring starting at `i-l`
        :                     //     Else:
         0,                   //      Substring starting at 0
        i<l?                  //     If `i` is smaller than `l`:
         i                    //      Substring ending at `i` (exclusive)
        :                     //     Else:
         l)                   //      Substring ending at `l` (exclusive)
  );                          //  End of loop
  return r;                   //  Return resulting sum
}                             // End of method
Kevin Cruijssen
źródło
1
114 bajtów: n->{Integer l=(n+"").length(),s=n*l,i=0;for(;++i<l*2;)s+=l.valueOf((n+"").substring(l<i?i-l:0,i<l?i:l));return s;}. Jest to przesuwane okno z min-max, aby zmniejszyć liczbę połączeń z drogiminew Integer(....substring(...))
Olivier Grégoire
1
@ OlivierGrégoire Dzięki, a nawet może trochę skrócić, zmieniając Math.max(0,i-l)na 0>i-l?0:i-li Math.min(i,l)na i>l?l:i. Modyfikuję teraz. Ach, widzę, że zredagowałeś swój komentarz po skopiowaniu 126 bajtów odpowiedzi. ;)
Kevin Cruijssen
Tak, przepraszam za edycję, ale tego nie sprawdziłem;)
Olivier Grégoire,
1

R , 168 162 103 bajty

-6 bajtów, nie używając c ()

-59 bajtów dzięki @Giuseppe

function(n){k=nchar(n)
a=k*strtoi(n)
for(i in 1:k)for(j in i:k)a=a+(i==1|j==k)*strtoi(substr(n,i,j))
a}

Wypróbuj online!

Pobiera dane wejściowe jako ciąg.

Jestem absolutnie pewien, że należy wprowadzić ulepszenia, przede wszystkim w wykorzystaniu siły R ... ale w wyzwaniu polegającym na manipulowaniu strunami staram się zobaczyć, jak to zrobić.

Edycja: O wiele lepiej teraz, gdy nie powtarzam złego pomysłu!

Kryminalnie Wulgarne
źródło
1
103 bajty
Giuseppe,
@Giuseppe Ah dzięki! To było dużo zmarnowanego miejsca od kiedy wciąż używałem wejścia liczb całkowitych. Lubię sposób strtoi (substr ()), a sztuczka (a | b) jest znacznie mądrzejsza niż ja. Dzięki za ulepszenia! W tym momencie jest to prawie inna odpowiedź ...
CriminallyVulgar
Dzieje się tak, gdy dodaje się inne podejście! Sam nie mogłem rozgryźć pętli, ale myślę, że możesz być w stanie skonstruować wskaźnikisubstr jawnie zamiast zapętlania, co pozwoliłoby zaoszczędzić kilka bajtów.
Giuseppe,
0

Perl 5 , 53 + 1 (-n) = 54 bajtów

$r=$_*(@n=/./g);for$i(@n){$r+=$_+($t=(chop).$t)}say$r

Wypróbuj online!

Xcali
źródło
0

Mathematica, 77 bajtów

(s=IntegerDigits@#;t=Length@s;Tr[FromDigits/@Table[s~Take~i,{i,-t,t}]]+t#-#)&
J42161217
źródło