Somme des sommes modulo


34

Étant donné un entier n > 9, pour chaque insertion possible entre les chiffres de cet entier, insérez une addition +et évaluez. Ensuite, prenez le nombre original modulo ces résultats. Affiche le total de ces opérations.

Un exemple avec n = 47852:

47852 % (4785+2) = 4769
47852 % (478+52) =  152
47852 % (47+852) =  205
47852 % (4+7852) =  716
                  -----
                   5842

Contribution

Un entier positif unique dans un format pratique , n > 9.

Sortie

La sortie entière unique suivant la technique de construction ci-dessus.

Règles

  • Vous n'avez pas à vous soucier d'une entrée plus grande que le type par défaut de votre langue.
  • Un programme complet ou une fonction sont acceptables. Si une fonction est utilisée, vous pouvez renvoyer la sortie plutôt que de l’imprimer.
  • Les échappatoires standard sont interdites.
  • Il s’agit du donc toutes les règles de golf habituelles s’appliquent et le code le plus court (en octets) gagne.

Exemples

47852 -> 5842
13 -> 1
111 -> 6
12345 -> 2097
54321 -> 8331
3729105472 -> 505598476

Réponses:



9

JavaScript, 43 47 octets

f=
n=>eval(n.replace(/./g,'+'+n+"%($`+ +'$&$'')"))

I.oninput=_=>O.value=f(I.value)
<input id=I>
<input id=O disabled>

Prend l'entrée sous forme de chaîne.


Modifier:

+4 octets : les zéros au début de JavaScript convertissent le nombre en octal):


2
Ce bout de code est plutôt chouette, car il est mis à jour en temps réel.
AdmBorkBork

Pouvez-vous économiser un octet en faisant (+'$&$''+$`)?
Neil

@ Neil. Dans la première itération $`est vide, et il va jeter une erreur en essayant d’évaluer (13+)(comme exemple).
Washington Guedes

7

Brachylog , 20 octets

:{$@~c#C:@$a+:?r%}f+

Essayez-le en ligne!

Explication

Ceci implémente la formule donnée. La seule chose à laquelle nous devons faire attention est quand a 0est au milieu de l'entrée: dans ce cas, Brachylog devient assez bizarre, par exemple, il n'acceptera pas qu'une liste d'entiers commençant par un 0puisse être concaténée en un entier ( ce qui nécessiterait d'ignorer le début 0- ceci est principalement programmé de cette façon pour éviter des boucles infinies). Par conséquent, pour contourner ce problème, nous convertissons l'entrée en une chaîne, puis nous reconvertissons toutes les entrées fractionnées en entiers.

                       Example Input: 47852

:{               }f    Find all outputs of that predicate: [716,205,152,4769]
  $@                     Integer to String: "47852"
    ~c#C                 #C is a list of two strings which when concatenated yield the Input
                           e.g. ["47","852"]. Leave choice points for all possibilities.
        :@$a             Apply String to integer: [47,852]
            +            Sum: 899
             :?r%        Input modulo that result: 205
                   +   Sum all elements of that list               

6

ES6 (Javascript), 42, 40 octets

EDITS:

  • S'est débarrassé de s , -2 octets

Golfé

M=(m,x=10)=>x<m&&m%(m%x+m/x|0)+M(m,x*10)

Tester

M=(m,x=10)=>x<m&&m%(m%x+m/x|0)+M(m,x*10);

[47852,13,111,12345,54321,3729105472].map(x=>console.log(M(x)));


Si vous vous limitez à cela, m<2**31vous pouvez commencer par x=1sauvegarder un octet.
Neil

6

Python 2, 45 octets

f=lambda n,c=10:n/c and n%(n/c+n%c)+f(n,c*10)

Utilise l'arithmétique plutôt que des chaînes pour diviser l'entrée nen parties n/cet n%cqui crevient par des puissances de 10.


6

Gelée , 12 octets

ŒṖṖLÐṂḌS€⁸%S

TryItOnline!

Comment?

ŒṖṖLÐṂḌS€⁸%S - Main link: n
ŒṖ           - partitions (implicitly treats the integer n as a list of digits)
  Ṗ          - pop - remove the last partition (the one with length one)
    ÐṂ       - keep those with minimal...
   L         - length (now we have all partitions of length 2)
      Ḍ      - undecimal (convert each entry back to an integer)
       S€    - sum each (add the pairs up)
         ⁸   - left argument, n
          %  - mod (vectorises)
           S - sum

5

Perl 35 32 27 octets

Comprend +3 pour -p

Économisé 8 octets grâce à Dada

$\+=$_%($`+$')while//g}{

5

C 77 + 4 = 81 octets

joué au golf

i,N,t,r,m;f(n){for(r=0,m=n;n;t=n%10,n/=10,N+=t*pow(10,i++),r+=m%(n+N));return r;}  

Ungolfed

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

i,N,t,r,m;

f(n)
{
    m=n;
    r=0;
    while(n)
    {
        t=n%10;
        n/=10;
        N+=t*pow(10,i++);
        r+=m%(n+N);
    }
    return r;
}

main()
{
    printf("%d",f(47852));
}

Vous devriez initier de r=0telle sorte que si la fonction est appelée à nouveau, le résultat est correct. C'est quelque part dans Meta, si vous utilisez des variables globales, vous devez faire face aux effets secondaires d'appeler une fonction plusieurs fois.
Karl Napf

@KarlNapf c'est bon?
Mukul Kumar

C n'autorise pas les valeurs de fonction par défaut, votre code ne compile pas. Vous pouvez déclarer rglobal, mais à l'intérieur de la fonction, vous pouvez dire r=0;, voir ma réponse par exemple.
Karl Napf

1
@KarlNapf your ans is v2 of my ans...far better thanks
Mukul Kumar

5

Python 2, 68 64 68 bytes

-4 bytes thanks to atlasologist

lambda x:sum(int(x)%(int(x[:i])+int(x[i:]))for i in range(1,len(x)))

*Input is a string


Save 4: lambda n:sum(int(n)%eval(n[:i]+'+'+n[i:])for i in range(len(n)))
atlasologist

1
Fails for inputs containing a zero with an 8 or 9 after it and gives wrong answers for others (like the last test case). Numbers starting with a zero are octal. repl.it/EmMm
mbomb007

@mbomb007 fixed
Rod

4

C, 59 bytes

t,s;f(n){s=0;t=10;while(t<n)s+=n%(n/t+n%t),t*=10;return s;}

t is 10,100,1000,... and represents the cut in the big number. n/t is the right part and n%t the left part. If t is bigger than the number, it is finished.

Ungolfed and usage:

t,s;
f(n){
 s=0;
 t=10;
 while(t<n)
  s += n % (n/t + n%t),
  t *= 10;
 return s;
}

main(){
 printf("%d\n",f(47852));
}

Ohhh my....please add an explanation.
Mukul Kumar

@MukulKumar okay like this?
Karl Napf

yeah that's nice.
Mukul Kumar

3

Retina, 38 bytes

Byte count assumes ISO 8859-1 encoding.

\B
,$';$_¶$`
G-2`
\d+|,
$*
(1+);\1*

1

Not exactly efficient...

Try it online! (The first line enables a linefeed-separated test suite.)

Explanation

\B
,$';$_¶$`

Between every pair of characters, we insert a comma, everything in front of the match, a semicolon, the entire input, a linefeed, and everything after the match. For input 12345 this gives us:

1,2345;12345
12,345;12345
123,45;12345
1234,5;12345
12345

I.e. every possible splitting of the input along with a pair of the input. We don't need that last line though so:

G-2`

We discard it.

\d+|,
$*

This replaces each number as well as the comma with its unary representation. Since the comma isn't a number, it's treated as zero and simply removed. This adds the two parts in each splitting.

(1+);\1*

This computes the modulo by removing all copies of the first number from the second number.

1

That's it, we simply count how many 1s are left in the string and print that as the result.


3

Pyth, 14 bytes

s.e%QssMc`Q]k`

A program that takes input of an integer and prints the result.

Test suite

How it works

s.e%QssMc`Q]k`   Program. Input: Q
s.e%QssMc`Q]k`Q  Implicit input fill
 .e          `Q  Map over str(Q) with k as 0-indexed index:
        c`Q]k     Split str(Q) into two parts at index k
      sM          Convert both elements to integers
     s            Sum
   %Q             Q % that
s                Sum
                 Implicitly print


3

Perl 6, 33 bytes

{sum $_ X%m:ex/^(.+)(.+)$/».sum}

Expanded:

{                  # bare block lambda with implicit parameter 「$_」

  sum

    $_             # the input

    X%             # cross modulus

    m :exhaustive /  # all possible ways to segment the input
      ^
      (.+)
      (.+)
      $
    /».sum         # sum the pairs
}

3

Mathematica, 75 bytes

Tr@ReplaceList[IntegerDigits@#,{a__,b__}:>Mod[#,FromDigits/@({a}+{b}+{})]]&

This uses pattern matching on the list of digits to extract all partitions of them into two parts. Each such partition into a and b is then replaced with

Mod[#,FromDigits/@({a}+{b}+{})]

The notable thing here is that sums of lists of unequal length remain unevaluated, so e.g. if a is 1,2 and b is 3,4,5 then we first replace this with {1,2} + {3,4,5} + {}. The last term is there to ensure that it still remains unevaluated when we evenly split an even number of digits. Now the Map operation in Mathematica is sufficiently generalised that it works with any kind of expression, not just lists. So if we map FromDigits over this sum, it will turn each of those lists back into a number. At that point, the expression is a sum of integers, which now gets evaluated. This saves a byte over the more conventional solution Tr[FromDigits/@{{a},{b}}] which converts the two lists first and then sums up the result.


3

Actually, 16 15 bytes

Golfing suggestions welcome! Try it online!

Edit: -1 byte thanks to Teal pelican.

;╗$lr`╤╜d+╜%`MΣ

Ungolfing

         Implicit input n.
;╗       Save a copy of n to register 0.
$l       Yield the number of digits the number has, len_digits.
r        Yield the range from 0 to len_digits - 1, inclusive.
`...`M   Map the following function over that range, with variable x.
  ╤        Yield 10**x.
  ╜        Push a copy of n from register 0.
  d        Push divmod(n, 10**x).
  +        Add the div to the mod.
  ╜        Push a copy of n from register 0.
  %        Vectorized modulo n % x, where x is a member of parition_sums.
         This function will yield a list of modulos.
Σ        Sum the results together.
         Implicit return.

If you move ╜% inside the functions section you don't need to use the ♀ and it'll save you 1 byte :D (;╗$lr╤╜d+╜%MΣ)
Teal pelican

@Tealpelican Thanks for the tip :D Let me know if you come up with any other golfing suggestions
Sherlock9

2

Ruby, 64 bytes

->s{s.size.times.reduce{|a,i|a+s.to_i%eval(s[0,i]+?++s[i..-1])}}

Takes the input as a string


Unfortunately, Ruby interprets integer literals beginning with 0 as octal, meaning this fails for the last test case. Here's a 78-byte solution addressing that.
benj2240

2

Befunge, 101 96 bytes

&10v
`#v_00p:::v>+%\00g1+:9
*v$v+55g00</|_\55+
\<$>>\1-:v ^<^!:-1 
+^+^*+55\_$%\00g55
.@>+++++++

Try it online!

Explanation

&              Read n from stdin.
100p           Initialise the current digit number to 1.

               -- The main loop starts here --

:::            Make several duplicates of n for later manipulation.

v+55g00<       Starting top right, and ending bottom right, this
>>\1-:v          routine calculates 10 to the power of the
^*+55\_$         current digit number.

%              The modulo of this number gives us the initial digits.
\              Swap another copy of n to the top of the stack.

_\55+*v        Starting bottom left and ending top left, this
^!:-1\<          is another calculation of 10 to the power of
00g55+^          the current digit number.

/              Dividing by this number gives us the remaining digits.
+              Add the two sets of digits together.
%              Calculate n modulo this sum.
\              Swap the result down the stack bringing n back to the top.

00g1+          Add 1 to the current digit number.
:9`#v_         Test if that is greater than 9.
00p            If not, save it and repeat the main loop.

               -- The main loop ends here --

$$             Clear the digit number and N from the stack.
++++++++       Sum all the values that were calculated.
.@             Output the result and exit.

2

APL, 29 bytes

{+/⍵|⍨{(⍎⍵↑R)+⍎⍵↓R}¨⍳⍴1↓R←⍕⍵}

⎕IO must be 1. Explanation (I'm not good at explaining, any imporvements to this are very welcome):

{+/⍵|⍨{(⍎⍵↑R)+⍎⍵↓R}¨⍳⍴1↓R←⍕⍵}
{                           } - Function (Monadic - 1 argument)
                           ⍵  - The argument to the function
                          ⍕   - As a string
                        R←    - Stored in R
                      1↓      - All except the first element
                    ⍳⍴        - 1 to the length
      {           }           - Another function
               ⍵↓R            - R without ⍵ (argument of inner function) leading digits
              ⍎               - As a number
             +                - Plus
       (    )                 - Grouping
         ⍵↑R                  - The first ⍵ digits of R
        ⍎                     - As a number
                   ¨          - Applied to each argument
   ⍵|⍨                        - That modulo ⍵ (outer function argument)
 +/                           - Sum

There, it's done.
Zacharý

2

C#, 67 bytes

n=>{long d=n,s=0,p=1;while(d>9)s+=n%((d/=10)+n%(p*=10));return s;};

Full program with ungolfed, explained method and test cases:

using System;

public class Program
{
    public static void Main()
    {
        Func<long,long> f=
        n=>
        {
            long d = n, // stores the initial number
                 r,         // remainder, stores the last digits
                 s = 0, // the sum which will be returned
                 p = 1; // used to extract the last digit(s) of the number through a modulo operation
            while ( d > 9 ) // while the number has more than 1 digit
            {
                d /= 10;    // divides the current number by 10 to remove its last digit
                p *= 10;    // multiplies this value by 10
                r = n % p;  // calculates the remainder, thus including the just removed digit
                s += n % (d + r);   // adds the curent modulo to the sum
            }
            return s;   // we return the sum
        };

        // test cases:
        Console.WriteLine(f(47852)); //5842
        Console.WriteLine(f(13));   // 1
        Console.WriteLine(f(111));  // 6
        Console.WriteLine(f(12345));    // 2097
        Console.WriteLine(f(54321));    // 8331
        Console.WriteLine(f(3729105472));   // 505598476
    }
}

2

Attache, 48 bytes

Sum@{N[_]%Sum@Map[N]=>SplitAt[_,1..#_-1]}@Digits

Try it online!

Explanation

Sum@{N[_]%Sum@Map[N]=>SplitAt[_,1..#_-1]}@Digits
                                          Digits    convert input to digits
    {                                   }@          call lambda with digits as argument
                      SplitAt[_,1..#_-1]            split digits at each partition
              Map[N]=>                              Map N to two-deep elements
          Sum@                                      Takes the sum of each sub array
     N[_]%                                          convert digits to int and vector mod
Sum@                                                sum the resultant array

1

Clojure, 91 81 bytes

Edit: this is shorter as it declares an anonymous function (fn[v](->> ...)) and not using ->> macro although it was easier to read and call that way.

(fn[v](apply +(map #(mod v(+(quot v %)(mod v %)))(take 10(iterate #(* 10 %)1)))))

Original:

(defn s[v](->> 1(iterate #(* 10 %))(take 10)(map #(mod v(+(quot v %)(mod v %))))(apply +)))

Generates a sequence of 1, 10, 100, ... and takes first 10 items (assuming input values are less than 10^11), maps to modulos as specified in specs and calculates the sum. Long function names makes this solution quite long but at least even the golfed version should be quite easy to follow.

First I tried juggling strings around but it required tons of boilerplate.


1

Racket 134 bytes

(let((s(number->string n))(h string->number)(g substring))(for/sum((i(range 1(string-length s))))(modulo n(+(h(g s 0 i))(h(g s i))))))

Ungolfed:

(define (f n)
  (let ((s (number->string n))
        (h string->number)
        (g substring))
    (for/sum ((i (range 1 (string-length s))))
      (modulo n (+ (h (g s 0 i)) (h (g s i)))))))

Testing:

(f 47852)
(f 13)
(f 111)
(f 12345)
(f 54321)
(f 3729105472)

Output:

5842
1
6
2097
8331
505598476

So many close parens ... :D
AdmBorkBork

It's not as difficult as it appears.
rnso



0

Ruby 45 Bytes

->q{t=0;q.times{|x|p=10**x;t+=q%(q/p+q%p)};t}

This is a really neat solution. It is technically correct, but it is super inefficient. It would be much more efficient to write q.to_s.size.times{...}. We use q.times because it saves characters, and the extra number of times it goes through the proc the expression just evaluates to zero.


Sorry! This is a 45 byte solution written in ruby. I've edited the post to reflect that.
Philip Weiss

46 byte runner-up: ->q{(0..q).reduce{|s,x|p=10**x;s+q%(q/p+q%p)}}
Philip Weiss




0

Japt, 11 10 bytes

¬x@%OvUi+Y

Try it


Explanation

               :Implicit input of string U
¬              :Split to an array of characters
  @            :Pass each character at index Y through a function
      Ui+Y     :  Insert a + in U at index Y
    Ov         :  Evaluate as Japt
   %           :  Modulo U by the above
 x             :Reduce by addition

1
This was marked as low quality :P
Christopher
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.