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!



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.


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.


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

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


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)


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!


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.


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


@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!


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!


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


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.

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


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

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

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

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

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!



@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

Mathematica, 77 bajtów

(s=IntegerDigits@#;t=Length@s;Tr[FromDigits/@Table[s~Take~i,{i,-t,t}]]+t#-#)&
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.