Wydrukuj produkty częściowe

17

W długim pomnożeniu , po pomnożeniu liczb, pozostajesz z produktami częściowymi, w tym wyzwaniu otrzymasz te produkty częściowe.

Ponieważ długie mnożenie jest długie, aby zrekompensować kod, musi on być jak najkrótszy.

Przykłady

34, 53
102, 1700

48, 38 
384, 1440

361, 674
1444, 25270, 216600

0, 0
0

1, 8
8

Dane techniczne

  • Dane wejściowe / wyjściowe mogą być w dowolnym rozsądnym formacie, takim jak tablica, ciąg oddzielony przecinkami (lub dowolny inny separator inny niż cyfra), lista, argumenty funkcji itp.
  • Częściowe produkty muszą być w porządku rosnącym.
  • Jeśli jest to produkt częściowy 0, możesz wybrać, czy chcesz go wydrukować, czy nie.

To jest więc wygrywa najkrótszy kod w bajtach!

Downgoat
źródło
Zakładam, że liczby mogą być ciągami, prawda?
Mama Fun Roll
Ten przypadek testowy 0,0 znacznie utrudnia.
xnor
Jaki jest oczekiwany wynik 12, 102? Większość odpowiedzi wydaje się wracać 24, 0, 1200.
Dennis
@Dennis 24, 0, 1200jest w porządku.
Sprecyzuję

Odpowiedzi:

4

Galaretka, 10 bajtów

DU×µLR’⁵*×

Wypróbuj online!

Jak to działa

DU×µLR’⁵*×  Left argument: multiplier -- Right argument: multiplicant

D           Convert the multiplier to base 10 (array of digits).
 U          Reverse the array.
  ×         Multiply each digit by the multiplicant.
   µ        Begin a new, monadic chain. Argument: A(array of products)
    L       Get the length of A.
     R      Turn length l into [1, ..., l].
      ’     Decrement to yield [0, ..., l-1].
       ⁵*   Compute 10**i for each i in that range.
         ×  Hook; multiply the powers of ten by the corresponding elements of A.
Dennis
źródło
3
Domyślam się, że nazwa tego języka wynika z faktu, że sprawia, że ​​wszyscy czują się galaretowato.
geokavel
7

Pyth, 12 bajtów

.e**Qsb^Tk_w

Zestaw testowy

Oddziela wprowadzany znak nowej linii, np

361
674

Wyjaśnienie:

.e**Qsb^Tk_w
                Implicit: Q = eval(input()),T = 10
           w    Input the second number as a string.
          _     Reverse it.
.e              Enumerated map, where b is the character and k is the index.
     sb         Convert the character to an int.
   *Q           Multiply by Q.
  *    ^Tk      Multiply by T ^ k. (10 ^ index)
isaacg
źródło
4

JavaScript (ES7), 48 bajtów

(a,b)=>[...b+""].reverse().map((d,i)=>10**i*a*d)

ES6 (56 bajtów)

(a,b)=>[...b+""].reverse().map((d,i)=>a*d+"0".repeat(i))

Wyjaśnienie

Zwraca tablicę produktów częściowych jako liczby.

(a,b)=>
  [...b+""]    // convert the multiplier to an array of digits
  .reverse()   // reverse the digits of the multiplier so the output is in the right order
  .map((d,i)=> // for each digit d of the multiplier
    10**i      // get the power of ten of the digit
      *a*d     // raise the product of the digit to it
  )

Test

Testowe zastosowania Math.powzamiast tego, **aby działały w standardowych przeglądarkach.

użytkownik 81655
źródło
3

Lua, 72 68 bajtów

b=arg[2]:reverse()for i=1,#b do print(arg[1]*b:sub(i,i)*10^(i-1))end
Nikolai97
źródło
3

APL, 21 bajtów

{⍺×x×10*1-⍨⍳≢x←⊖⍎¨⍕⍵}

Jest to funkcja dynamiczna, która akceptuje liczby całkowite po lewej i prawej stronie i zwraca tablicę. Aby go wywołać, przypisz go do zmiennej.

Wyjaśnienie:

             x←⊖⍎¨⍕⍵} ⍝ Define x to be the reversed digits of the right input
     10*1-⍨⍳≢         ⍝ Generate all 10^(1-i) for i from 1 to the number of digits
{⍺×x×                 ⍝ Multiply the right input by the digits and the powers of 10
Alex A.
źródło
1
⍎¨⍕jest całkiem sprytny.
Dennis
2

05AB1E , 15 bajtów

Kod:

VDgUSXFTNmY**=\

Wyjaśnienie:

VDgUSXFTNmY**=\

V                 # Assign the input to Y
 D                # Duplicate of input, because the stack is empty
  g               # Pushes the length of the last item
   U              # Assign the length to X
    S             # Split the last item
     X            # Pushes X (length of the last item)
      F           # Creates a for loop: for N in range(0, X)
       TNm        # Pushes 10 ^ N
          Y       # Pushes Y (first input)
           *      # Multiplies the last two items
            *     # Multiplies the last two items
             =    # Output the last item
              \   # Discard the last item
Adnan
źródło
2

Pyth, 26 bajtów

DcGHKjHTFNJlK*G*@Kt-JN^TN

Definiuje funkcję ctaką, że akceptuje 2argumenty, a funkcja drukuje produkty częściowe.

DcGHKjHTFNJlK*G*@Kt-JN^TN
DCGH                      Define function c(G, H)
    KjHT                  Set K to the list of digits converting H to base 10
        FNJlK             Set J to the length of K and loop with variable N
                          (Implicit: print)
             *G*@Kt-JN    Calculates the partial product
                      ^TN Raising it to the appropriate power of 10
Element118
źródło
1

MATL , 18 bajtów

ij48-tn:1-P10w^**P

Kompilator (5.1.0) działa w Matlab w Octave.

Każda liczba jest wprowadzana w osobnym wierszu.

Przykład

>> matl ij48-tn:1-P10w^**P
> 361
> 674
1444  25270 216600

Wyjaśnienie

i           % input first number (say 361)
j           % input second number, interpreted as a string (say '674')
48-         % subtract '0' to obtain vector of figures (gives [6 7 4])
tn:1-P      % vector [n-1, ... 1, 0] where n is the number of figures (gives [2 1 0])
10w^        % 10 raised to that, element-wise (gives [100 10 1])
*           % multiply, element-wise (gives [600 70 4])
*           % multiply (gives 361*[600 70 4], or [216600 25270 1444])
P           % flip vector ([1444 25270 216600]). Implicitly display
Luis Mendo
źródło
1

Haskell, 60 57 54 bajtów

g x=zipWith(\b->(x*10^b*).read.pure)[0..].reverse.show

5 bajtów mniej (upuść .show), jeśli mogę wziąć drugą liczbę jako ciąg znaków.

Przykład użycia: g 361 674-> [1444,25270,216600].

Pomnóż każdą cyfrę rewersu yz xi skaluj z 10^igdzie i = 0,1,2,....

Edycja: Dzięki @Mauris za 3 bajty!

nimi
źródło
Możesz nawet zrobić (\b->(x*10^b*).read.pure).
Lynn
@Mauris: Nicea. Wielkie dzięki!
nimi
1

Julia, 50 49 bajtów

f(a,b)=[a*d*10^~-i for(i,d)=enumerate(digits(b))]

Jest to funkcja, która akceptuje dwie liczby całkowite i zwraca tablicę liczb całkowitych.

digitsZwraca tablicę cyfr liczbę całkowitą wejściowego w odwrotnej kolejności. Otrzymujemy indeks, pary wartości za pomocą enumeratei obliczamy iloczyny cząstkowe jako pierwsze razy razy cyfry razy 10 podniesione do potęgi wskaźnika cyfry - 1.

Oszczędność bajtu dzięki Dennisowi!

Alex A.
źródło
1

Python 2, 61

def p(a,b):
 j=0
 while b>0:
  print`b%10*a`+j*'0';b/=10;j+=1 
Willem
źródło
1

CJam, 19 17 bajtów

q~W%eef{~~A@#**}p

Pobiera dane wejściowe, przy czym pierwszy element jest liczbą całkowitą, a drugi ciągiem znaków (np 34 "53".). Sugestie są mile widziane, ponieważ jestem pewien, że mogą być krótsze. Dzięki Dennis za zaoszczędzenie dwóch bajtów.

Wypróbuj online.

Wyjaśnienie

q~    e# Get input and evaluate it, x and "y"
W%    e# Reverse y so it will be properly sorted
ee    e# Enumerate through y with each character and its index
f{    e# For each digit in y...
  ~~  e# Convert the digit to an integer on the stack
  A@# e# Take 10 to the power of y's index
  **  e# Multiply all three together to get the final result
}
p     e# Print the array
NinjaBearMonkey
źródło
1
~~A@#**oszczędza kilka bajtów.
Dennis
1

Haskell, 37 bajtów

a%0=[]
a%b=b`mod`10*a:(a*10)%div b 10

Bez rygoryzacji, tylko arytmetyka. Rekurencyjnie dołącza najmniejszy iloczyn częściowy do reszty, w której ostatnia cyfra bjest obcinana i mnożony jest 10. Pierwszeństwo operatora działa dobrze.

xnor
źródło
0

𝔼𝕊𝕄𝕚𝕟, 11 znaków / 23 bajty (niekonkurencyjny)

ᴙíⓢⓜî*$*Ⅹⁿ_

Try it here (Firefox only).

Znaleziono błąd podczas kodowania rozwiązania tego problemu ...

Wyjaśnienie

          // Implicit: î = input 1, í = input 2
ᴙíⓢ      // reverse í and split it into an array
ⓜî*$*Ⅹⁿ_ // multiply î by each individual digit in í and put in previous array
          // implicit output
Mama Fun Roll
źródło
0

Japt , 28 bajtów

I=[]Vs w m@IpApY+1 /A*U*X};I

Wyjaśnienie:

I=[]Vs w m@IpApY+1 /A*U*X};I
I=[]                         //that's simple, init an array I
    Vs                       //take the second input and convert to string
       w                     //reverse it and...
         m@              }   //...map through the chars; X is a char, Y is counter
           Ip............    //push the following value into I...
             ApY+1 /A*U*X    //10^(Y+1)/10*U*X, U is the first input
                           I //output the resulting array
Nicość
źródło
Ze względu na błąd interpretera należy użyć ApY+1 /10zamiast ApY, ponieważ Ap0(czyli 10 ^ 0) daje 100. Wydaje mi się, że jest to powód, dla którego można pozwolić na szybkie wyrównanie Ap, ale 0nie oznacza to „żadnych argumentów”. Plz fix, Eth.
nicael
0

Python 2, 42 bajty

f=lambda a,b:b*[0]and[b%10*a]+f(a*10,b/10)

Bez rygoryzacji, tylko arytmetyka. Rekurencyjnie dołącza najmniejszy iloczyn częściowy do reszty, w której ostatnia cyfra bjest obcięta i stosowany jest mnożnik 10.

xnor
źródło