Somma di somme modulo


34

Dato un numero intero n > 9, per ogni possibile inserimento tra le cifre in quel numero intero, inserire un'aggiunta+ e valutare. Quindi, prendi il numero originale modulo quei risultati. Stampa la somma totale di queste operazioni.

Un esempio con n = 47852:

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

Ingresso

Un singolo numero intero positivo in qualsiasi formato conveniente ,n > 9 .

Produzione

L'output intero singolo seguendo la tecnica di costruzione sopra.

Regole

  • Non devi preoccuparti di input più grandi del tipo predefinito della tua lingua.
  • È accettabile un programma completo o una funzione. Se una funzione, è possibile restituire l'output anziché stamparlo.
  • Sono vietate le scappatoie standard .
  • Si tratta di quindi si applicano tutte le normali regole del golf e vince il codice più breve (in byte).

Esempi

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

Risposte:



9

JavaScript, 43 47 byte

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

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

Accetta l'input come stringa.


Modificare:

+4 byte : zero iniziali in JavaScript converte il numero in ottale):


2
Quel frammento è piuttosto pulito, visto che si aggiorna in tempo reale in quel modo.
AdmBorkBork,

Puoi salvare un byte facendo (+'$&$''+$`)?
Neil,

@Neil. Nella prima iterazione $`è vuota e genererà un errore nel tentativo di valutare (13+)(come esempio).
Washington Guedes,

7

Brachylog , 20 byte

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

Provalo online!

Spiegazione

Questo implementa la formula data. L'unica cosa di cui dobbiamo fare attenzione è quando a 0è nel mezzo dell'input: in quel caso Brachylog diventa piuttosto eccentrico, ad esempio non accetterà che un elenco di numeri interi che iniziano con a 0possa essere concatenato in un numero intero ( che richiederebbe di ignorare il comando 0- questo è principalmente programmato in questo modo per evitare loop infiniti). Pertanto, per aggirare quel problema, convertiamo l'input in una stringa e poi riconvertiamo tutti gli input suddivisi in numeri interi.

                       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 byte

Modifiche:

  • Sbarazzato di s , -2 byte

golfed

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

Test

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


Se ti limiti a m<2**31allora puoi iniziare con x=1un salvataggio di un byte.
Neil,

6

Python 2, 45 byte

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

Utilizza l'aritmetica anziché le stringhe per dividere l'input nin parti n/ce n%c, che cricorre attraverso poteri di 10.


6

Gelatina , 12 byte

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

TryItOnline!

Come?

ŒṖṖ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 byte

Include +3 per -p

Risparmiato 8 byte grazie a Dada

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

5

C 77 + 4 = 81 byte

golfed

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

Si dovrebbe iniziare in modo r=0tale che se la funzione viene richiamata di nuovo il risultato è corretto. È da qualche parte in Meta, se usi variabili globali allora devi affrontare gli effetti collaterali di chiamare una funzione più di una volta.
Karl Napf,

@KarlNapf che bene?
Mukul Kumar,

C non consente i valori di funzione predefiniti, il codice non viene compilato. Puoi dichiarare rglobale ma all'interno della funzione come un'affermazione che puoi dire r=0;, vedi la mia risposta per esempio.
Karl Napf,

1
@KarlNapf il tuo ans è v2 del mio ans ... molto meglio grazie
Mukul Kumar il

5

Python 2, 68 64 68 byte

-4 byte grazie all'atlologo

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

* L'input è una stringa


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

1
Non riesce per gli input contenenti uno zero con uno 8o 9dopo e fornisce risposte errate per gli altri (come l'ultimo caso di test). I numeri che iniziano con uno zero sono ottali. repl.it/EmMm
mbomb007,

@ mbomb007 riparato
Rod

4

C, 59 byte

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

tè 10,100,1000,...e rappresenta il taglio nel grande numero. n/tè la parte destra e n%tla parte sinistra. Se tè maggiore del numero, è finito.

Ungolfed e utilizzo:

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 mio .... per favore aggiungi una spiegazione.
Mukul Kumar,

@MukulKumar va bene così?
Karl Napf,

sì, è carino.
Mukul Kumar,

3

Retina , 38 byte

Il conteggio dei byte presuppone la codifica ISO 8859-1.

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

1

Non esattamente efficiente ...

Provalo online! (La prima riga abilita una suite di test separata da avanzamento riga.)

Spiegazione

\B
,$';$_¶$`

Tra ogni coppia di caratteri, inseriamo una virgola, tutto davanti alla partita, un punto e virgola, l'intero input, un avanzamento riga e tutto dopo la partita. Per input 12345questo ci dà:

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

Vale a dire ogni possibile suddivisione dell'ingresso insieme a una coppia dell'ingresso. Tuttavia non abbiamo bisogno dell'ultima riga:

G-2`

Lo scartiamo.

\d+|,
$*

Questo sostituisce ogni numero e la virgola con la sua rappresentazione unaria. Poiché la virgola non è un numero, viene trattata come zero e rimossa semplicemente. Ciò aggiunge le due parti in ciascuna divisione.

(1+);\1*

Questo calcola il modulo rimuovendo tutte le copie del primo numero dal secondo numero.

1

Ecco, contiamo semplicemente quanti 1s rimangono nella stringa e lo stampiamo come risultato.


3

Pyth, 14 byte

s.e%QssMc`Q]k`

Un programma che accetta l'input di un numero intero e stampa il risultato.

Suite di test

Come funziona

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 byte

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

Allargato:

{                  # 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 byte

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

Questo utilizza la corrispondenza dei modelli nell'elenco delle cifre per estrarre tutte le loro partizioni in due parti. Ciascuna di tali partizioni in ae bviene quindi sostituita con

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

La cosa notevole è che somme di liste di lunghezza diversa rimangono non valutata, in modo ad esempio se aè 1,2ed bè3,4,5 quindi in primo luogo abbiamo sostituiamo questo con {1,2} + {3,4,5} + {}. L'ultimo termine è lì per garantire che rimanga ancora sottovalutato quando dividiamo uniformemente un numero pari di cifre. Ora l' Mapoperazione in Mathematica è sufficientemente generalizzata da funzionare con qualsiasi tipo di espressione, non solo con le liste. Quindi, se mappiamo FromDigitssu questa somma, trasformerà ciascuna di quelle liste in un numero. A quel punto, l'espressione è una somma di numeri interi, che ora viene valutata. Ciò consente di risparmiare un byte rispetto alla soluzione più convenzionale Tr[FromDigits/@{{a},{b}}]che converte prima le due liste e quindi riassume il risultato.


3

In realtà , 16 15 byte

Suggerimenti di golf benvenuti! Provalo online!

Modifica: -1 byte grazie al pellicano Teal.

;╗$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.

Se sposti ╜% all'interno della sezione funzioni non devi usare use e ti farà risparmiare 1 byte: D (; ╗ $ lr ╤╜d+╜%MΣ)
Pellicano

@Tealpelican Grazie per il suggerimento: D Fammi sapere se ti vengono in mente altri suggerimenti sul golf
Sherlock9

2

Rubino, 64 byte

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

Prende l'input come stringa


Sfortunatamente, Ruby interpreta i valori letterali interi che iniziano 0come ottali, il che significa che ciò non riesce per l'ultimo caso di test. Ecco una soluzione a 78 byte che risolve questo problema.
benj2240,

2

Befunge, 101 96 byte

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

Provalo online!

Spiegazione

&              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 byte

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

⎕IOdeve essere 1. Spiegazione (non sono bravo a spiegare, eventuali miglioramenti a questo sono molto ben accetti):

{+/⍵|⍨{(⍎⍵↑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

Ecco fatto.
Zacharý,

2

C #, 67 byte

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

Programma completo con metodo non risolto, spiegato e casi di test:

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 byte

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

Provalo online!

Spiegazione

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 byte

Modifica: è più breve in quanto dichiara una funzione anonima (fn[v](->> ...))e non utilizza ->>macro anche se era più facile da leggere e chiamare in quel modo.

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

Originale:

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

Genera una sequenza di 1, 10, 100, ... e accetta i primi 10 elementi (supponendo che i valori di input siano inferiori a 10 ^ 11), esegue il mapping ai moduli come specificato nelle specifiche e calcola la somma. I nomi di funzioni lunghe rendono questa soluzione piuttosto lunga ma almeno anche la versione golfata dovrebbe essere abbastanza facile da seguire.

Per prima cosa ho provato a destreggiarsi tra le corde, ma richiedeva tonnellate di scaldabagno.


1

Racchetta 134 byte

(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)))))))

test:

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

Produzione:

5842
1
6
2097
8331
505598476

Così tanti genitori stretti ...: D
AdmBorkBork

Non è così difficile come sembra.
anche il



0

Ruby 45 byte

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

Questa è una soluzione davvero accurata. È tecnicamente corretto, ma è super inefficiente. Sarebbe molto più efficiente scrivere q.to_s.size.times {...}. Usiamo q.times perché salva i caratteri e il numero extra di volte che passa attraverso il proc l'espressione si limita a zero.


Scusate! Questa è una soluzione a 45 byte scritta in ruby. Ho modificato il post per riflettere ciò.
Philip Weiss,

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




0

Japt , 11 10 byte

¬x@%OvUi+Y

Provalo


Spiegazione

               :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
Questo è stato contrassegnato come di bassa qualità: P
Christopher
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.