Qual è il numero mancante (divisibilità per 9)


22

Sfida

Dato un numero intero divisibile per 9 e una cifra mancante, trova la cifra mancante.

La cifra mancante può essere rappresentata da qualsiasi carattere diverso dalle cifre da 0 a 9 purché sia ​​coerente.

Se la cifra mancante potrebbe essere 0 o 9, emettere qualcosa per indicarlo.

Supponiamo che l'utente sia abbastanza intelligente da mettere solo una cifra mancante e un numero ecc.

Casi test

Nei casi di test la cifra mancante è rappresentata da un punto interrogativo

123? -> 3
?999 -> 0 or 9
?0023 -> 4
000?1 -> 8

2
Possiamo produrre 0? Che dire di [0, 9] (array o elenco di 2 numeri)?
user202729

1
Supponendo che tu intenda invece di 0 o 9, penso che modificherò questo requisito in modo che sia un valore indicante che potrebbe essere uno dei due. Grazie!
NK1406,

3
È solo ?un possibile input?
xnor

2
È necessario supportare gli zeri iniziali?
mbomb007,

1
@ NK1406 Non consiglio di richiedere zero iniziali, posso vedere byte aggiuntivi necessari per supportarlo almeno per alcune lingue.
Erik the Outgolfer,

Risposte:



9

Alice , 12 byte

/o&
\i@/+R9%

Provalo online!

Emette 0se il risultato può essere 0 o 9.

Spiegazione

/   Switch to Ordinal mode.
i   Read all input as a string.
&   Fold the next operation over the characters of this strings.
/   Switch to Cardinal mode (not an operation).
+   Add. Implicitly converts each character to the integer value it represents
    and adds it to the top of the stack. The top of the stack is initially, implicitly
    zero. When the character is "?", it is simply discarded, which adds the top of
    the stack to another implicit zero beneath, so the "?" is effectively skipped.
R   Negate. Multiplies the sum by -1.
9%  Modulo 9. This gives the result.
\   Switch to Ordinal mode.
o   Implicitly convert the result to a string and print it.
@   Terminate the program.

È &possibile rimuovere, poiché la modalità cardinale interpreta l'input originale come al massimo 2 numeri interi.
Nitrodon il

6

JavaScript (ES6), 40 byte

Emette 9 se potrebbe essere 0 o 9.

f=_=>9-([..._].reduce((a,b)=>a+~~b,0)%9)

2
Benvenuti in PPCG! Bel primo post!
Rɪᴋᴇʀ

2
Non è necessario contare f=; le funzioni anonime sono perfettamente valide.
Shaggy,

Le parentesi più esterne non sono necessarie a causa della precedenza dell'operatore;)
Shieru Asakoto,

5

Japt, 7 byte

Ho provato alcune soluzioni, ma la più breve era simile alla maggior parte delle altre, tranne per il fatto che non è necessario sostituirla ?all'inizio.

Può assumere qualsiasi carattere non numerico come cifra mancante. Emette 0quando la soluzione può essere quella o 9.

¬x*J u9

Provalo


Spiegazione

Immissione implicita della stringa U. ¬si divide in una matrice di singoli caratteri, xriduce la matrice aggiungendo ignorando tutti gli elementi non numerici, *Jmoltiplica ogni elemento per -1 e u9ottiene il modulo positivo del risultato.


5

JavaScript (ES6), 18 byte

Si aspetta un +come cifra mancante. Restituisce 9per 0 o 9 .

s=>9-eval(9+s+9)%9

Casi test


4

05AB1E , 7 6 byte

Un'uscita di 0significa che il risultato potrebbe essere 0 o 9 .

þSO(9%

Provalo online! o come una suite di test

Spiegazione

þ        # remove non-digits from input
 S       # split to list of digits
  O      # sum list
   (     # negate
    9%   # mod by 9

4

Python 2 , 44 41 35 byte

-6 byte grazie a RiaD

lambda n:-sum(ord(c)-3for c in n)%9

Provalo online!

Utenti ]per cifre mancanti.
Emette 0se la cifra mancante potrebbe essere 0 o 9.


Hm, in tutti i casi di test l'ho provato in output 0per un caso ambiguo, il che ha senso da allora9%9 == 0
soffice

se si fa int (c) -> ord (c) - 3 che non è necessario se, se si sceglie di caratteri appropriato per il cattivo carattere
Riad

3

Pyth, 9 7 byte

%_s-Qd9

Utilizza lo spazio come delimitatore e restituisce 0 se il risultato potrebbe essere 0 o 9.

Provalo online

Spiegazione

%_s-Qd9
   -Qd   Remove the space from the input.
  s      Convert it to an integer.
%_    9  Negate mod 9.

3

Prolog (SWI) , 59 byte

0*[].
X*[H|T]:-between(0,9,H),U is mod(X+H,9),U*T.
+X:-0*X.

Provalo online!

Sì per la programmazione logica!

Spiegazione

Innanzitutto facciamo un predicato *, che vale quando applicato a zero e alla lista vuota. Il nostro predicato vale anche quando la parte anteriore dell'elenco è compresa tra 0 e 9 e quando aggiungiamo la cifra iniziale mod 9, il predicato vale.

Definiamo quindi +questo predicato 0come il primo argomento. Cioè vogliamo che la somma digitale sia un multiplo di 9.

Prolog fa tutto il duro lavoro di trovare soluzioni per noi.


3

Befunge-93 , 16 byte

1+!_#@3#.--9%~:#

Provalo online!

Una versione a una riga della risposta Befunge di James Holderness che riesce a radere via due byte. Questo essenzialmente comprime il codice su una riga, inverte la direzione e sfrutta il fatto che Befunge non salta alla fine della riga. Mi ha suggerito di pubblicare una risposta separata con una spiegazione. Il codice accetta un * che rappresenta la cifra mancante e genera un 9 per 0 o 9.

Come funziona

1+!_  3  --9% Initialises the pointer going right and initialises the digitsum with 3

1+!_         ~: Gets input and checks whether it is end of input (-1)

      3  - Subtract three from the input. 
           This turns the ASCII values of digits into their mod 9 equivalent ("0"(48)=>45(mod 9)=>0)

          -9% Subtract the value from the digitsum and mod it with 9
              This keeps the digitsum as a negative digit greater than -9
              Repeat this until the input ends

Now this is where it gets tricky.
At the end of input, the stack looks like this:
  -(Digitsum%9), Copy of EOF input (-1)
The pointer is moving left from the _
 +!_ Invert the -1 to get 0 and add it to the digitsum (does nothing but get rid of the -1)
1           %~ Adds 1 mod -1 (no input) = 0 to the stack
         --9 Subtracts 9 from 0, yielding -9 and subtracts that from the digitsum. 
             This makes the digitsum positive and equal to 9-(digitsum%9), our desired value
     @  . Finally, print and exit

* (Valore ASCII 42) è stato scelto come carattere mancante perché contrasta il valore iniziale del digit, 3.


Sono sorpreso che tu possa continuare a spremere byte da questo. Molto bene!
James Holderness,

2

LaTeX, molti byte ( 1000 628 614)

\RequirePackage{expl3}
\ExplSyntaxOn
\tl_new:N \l_divnine_input_tl
\int_new:N \l_divnine_sum_int
\def \getnum {
  \typein [ \l_divnine_input_tl ] { Input\space a\space number }
  \tl_map_function:NN \l_divnine_input_tl \divnine_sum:n
  \int_set:Nn \l_tmpa_int { 9 - \int_mod:nn { \l_divnine_sum_int } { 9 } }
  \typeout
    { The\space missing\space digit\space is:\space
      \int_use:N \l_tmpa_int
      \int_compare:nNnT { \l_tmpa_int } = { 0 } { \space or\space 9 }
    }
}
\cs_new:Nn \divnine_sum:n {
  \regex_match:nnT { \d } { #1 } { \int_add:Nn \l_divnine_sum_int { #1 } }
}
\ExplSyntaxOff
\getnum
\stop

LaTeX, illeggibile ( 348 334 byte)

\RequirePackage{expl3}\ExplSyntaxOn\int_new:N\1\tl_new:N\2\def\3{\typein[\2]{Input\space a\space number}\tl_map_function:NN\2\4\int_set:Nn\1{9-\int_mod:nn{\1}{9}}\typeout{The\space missing\space digit\space is:\space\int_use:N\1\int_compare:nNnT{\1}={0}{\space or\space9}}}\def\4#1{\regex_match:nnT{\d}{#1}{\int_add:Nn\1{#1}}}\3\stop

LaTeX, 132 byte

\RequirePackage{expl3}\typein[\1].\newcount\2{\ExplSyntaxOn\int_gset:Nn\2{9-\int_mod:nn\19}}\typeout{\the\2 \ifnum\2=9or 0\fi}\stop

In questo codice è consentito solo lo spazio come cifra sconosciuta.


2

J , 14 12 byte

-2 byte grazie a @BolceBussiere

9|9-[:+/"."0

Onestamente non so perché "."0interpreti ?come 0, ma lo fa sul mio interprete e su TIO, quindi non lo metterò in discussione. (Aggiornamento: vedere i commenti per una spiegazione del perché).

Questo approccio prende semplicemente la somma delle cifre, la nega sottraendo da 9 e la prende modulo 9.

Provalo online!


1
Non devi ravvivare prima di riassumere;)
Bolce Bussiere il

1
Inoltre, ". Non interpreta '?' come 0, lo interpreta come un elenco vuoto. Per adattarlo, J lo riempie di caratteri di riempimento, che in questo caso (una matrice numerica) è 0.
Bolce Bussiere,

2

Gelatina , 11 9 6 byte

|0SN%9

Spiegazione

|0     # Read input while removing non-digits (question marks) and removing leading zeros
  S    # Sum the digits
   N   # Negate
    %9 # Mod by 9

Un'uscita di 0 significa che il risultato potrebbe essere 0 o 9.

Provalo online!

Salvato 2 byte grazie a Mr. Xcoder . Quando si utilizza ogni Quick ( ) durante la valutazione, la divisione del numero in cifre era ridondante.

Salvato 3 byte grazie a Dennis . Può bit a bit OR l'input con 0 invece di analizzare manualmente l'input come numero rimuovendo zeri iniziali e non cifre.


9 byte . Benvenuti nel golf di Jelly!
Mr. Xcoder,

Questo non gestisce il caso in cui la risposta potrebbe essere 0 o 9. Inoltre, benvenuto a Jelly. Anch'io sono nuovo, ma finora è stato molto divertente.
dylnan,

@dylnan Risolto questo problema
Poke il

@Poke oh, non importa, non ho visto il requisito era stato cambiato
dylnan

|0funziona invece di fØDV€.
Dennis,


1

Befunge-93 (PyFunge) , 22 21 byte

Mi sono reso conto che non ho bisogno di usare ?per rappresentare la cifra assente, quindi ho usato uno che è un multiplo di 9 dopo aver sottratto 48: x
Questo mi ha permesso di giocare a golf off 3+, ma mi ha salvato solo 1 byte a causa della lunghezza del prima riga prima del condizionale :(


Una porta della mia risposta Befunge-98:
più 5 byte al fine di verificare se abbiamo raggiunto EOF,
più 1 byte a spingere 48 ( "0"vs '0),
1 byte di più per stampare la risposta con .@,
e 1 più byte, perché la seconda La linea ha uno spazio
per un totale di altri 8 byte.

~:0`!#|_"0"-+
 @.%9-<

Provalo online!

Emette 0se la cifra mancante potrebbe essere 0 o 9.

Questo funziona solo nell'interprete PyFunge per i motivi spiegati di seguito.

Spiegazione

Gran parte di questa spiegazione è copiata e incollata dalla mia spiegazione di Befunge-98 , poiché quel programma è molto simile a questo. spina spudorata

Nella prima riga del programma, sommiamo le cifre, inclusa la x, che viene trattata come un 72 a causa del suo valore ASCII. Tuttavia, la somma sarà la stessa una volta che abbiamo modificato 9, quindi questo è irrilevante.

~:0`!#|_"0"-+    THE FIRST LINE
~                Gets a character from input - If it is negative, we've reached EOF
 :0`!            Pushes 0 if the character is positive, 0 otherwise
     #|_         Goes to the next line if the value if 0
                     This also gets the negative value off the stack by using a |
        "0"-     Subtracts 48 to account for taking in ASCII values
            +    Adds this adjusted value to the sum

Se modifichiamo solo 9, verremmo lasciati con la cifra sbagliata, perché vogliamo 9 - (sum % 9). Tuttavia, possiamo fare di meglio 9\-, il che sottrarrebbe il resto da 9: se rendessimo la somma negativa prima di modificare di 9, otterremo un risultato positivo, equivalente a quello 9 - (sum % 9)di alcuni interpreti. Questo è ciò che ci impone di utilizzare gli interpreti PyFunge sia per Befunge 93 che per 98, poiché è l'unico su TIO a farlo. Gli altri ci danno un valore tra -8 e 8 invece di 0 e 8

 @.%9-<    THE SECOND LINE
      <    Redirects the IP onto this line
     -     Subtracts the sum from an implicit 0, making it negative
   %9      Mods the sum by 9
 @.        Prints the digit and exits

Bella risposta! Non ho mai pensato di usare un carattere personalizzato per la cifra mancante per evitare il controllo extra. Spero non ti dispiaccia che ho rubato quel trucco nella mia risposta aggiornata: volevo vedere se riuscissi a far funzionare lo stesso concetto nell'interprete di riferimento.
James Holderness,

1

Befunge-98 (PyFunge) , 15 13 byte

Mi sono reso conto che non ho bisogno di usare ?per rappresentare la cifra assente, quindi ho usato uno che è un multiplo di 9 dopo aver sottratto 48: x
Questo mi ha permesso di giocare a golf 3+.

#v~'0-+
q>-9%

Provalo online!

Usa una xcome cifra mancante, perché il suo valore ASCII è divisibile per 9 dopo aver sottratto 48 (ed è bello perché è comunemente usato come variabile in matematica).

Uscite tramite codice di uscita (perché qè un byte più corto di .@)
Uscite 0se la cifra mancante potrebbe essere 0 o 9.

Questo funziona solo nell'interprete PyFunge per i motivi spiegati di seguito.

Spiegazione

Nella prima riga del programma, sommiamo le cifre, incluso il x, che viene trattato come un 72 a causa del suo valore ASCII. Tuttavia, la somma sarà la stessa dopo che abbiamo modificato 9, quindi questo è irrilevante.

#v~'0-+    THE FIRST LINE
#v~        Pushes the next character from input, and goes to the second line on EOF
   '0-     Subtracts 48 to account for taking in ASCII values
      +    Adds this adjusted value to the sum

Se modifichiamo solo 9, verremmo lasciati con la cifra sbagliata, perché vogliamo 9 - (sum % 9). Tuttavia, possiamo fare di meglio 9\-, il che sottrarrebbe il resto da 9: se rendessimo la somma negativa prima di modificare di 9, otterremo un risultato positivo, equivalente a quello 9 - (sum % 9) di alcuni interpreti . Questo è ciò che ci impone di utilizzare gli interpreti PyFunge sia per Befunge 93 che per 98, poiché è l'unico su TIO a farlo. Gli altri ci danno un valore tra -8 e 8 invece di 0 e 8.

q>-9%    THE SECOND LINE
 >       Redirects the IP onto this line
  -      Subtracts the sum from an implicit 0, making it negative
   9%    Mods the sum by 9
q        Outputs via exit code, ending the program

1

Rubino , 22 byte

Usi '(qualsiasi carattere che ha una distanza 0che è divisibile per "0" lo farà, incluso 0se stesso).

Un output di 0indica 0o 9.

p -(gets.sum+6*~/$/)%9

Provalo online!

Spiegazione

p     # print after inspecting
  -(  # unary negative, for reversing result of modulus (a-b%a)
    gets.sum # ascii value of string
    + 6*~/$/ # add six for each size (in chars) of input, so "0" translates to 0
  )%9 # mod 9
      # find remainder after dividing 9
      # except it's inverted so it's remainder to add to divide 9

1

Rubino , 46 , 41 byte

-5 grazie a @Unihedron

->s{-s.chars.sum{|i|?<>i ? i.to_i : 0}%9}

Provalo online!


1. al charsposto di .split(//), 2. '<'può essere sostituito con?<
Unihedron il

Ho creato un programma più breve nello stesso strumento (Ruby) che è abbastanza diverso (si occupa di input e output) per essere la sua presentazione, lo puoi trovare qui: codegolf.stackexchange.com/a/151869/21830
Unihedron

@Unihedron grazie, non riesco a credere di essermi dimenticatochars
Tom Lazar il

1

Befunge-93, 28 27 19 18 byte

Il merito va a Mistah Figgins , la cui risposta di PyFunge mi ha mostrato che non hai bisogno di un controllo speciale per il carattere mancante della cifra, se ti sei appena assicurato che il valore ASCII fosse un multiplo di nove.

Ulteriori ringraziamenti a Jo King che ha dimostrato che non è necessario convertire completamente i caratteri nel loro equivalente numerico e potrebbe semplicemente sottrarre 3 per ottenere un valore relativo alla base 9 (ASCII 0meno 3 è 45, un multiplo di 9) .

3_v#`0:~--
%9_@.+9

Provalo online!

Perché questo funzioni, dovresti usare il carattere *per la cifra mancante (ce ne sono altri che potrebbero funzionare, ma è il più bello).

Emette 9se la cifra mancante potrebbe essere 0 o 9.

Spiegazione

3             Push 3 onto the stack.
 _            Since this is non-zero, drop the 3 and branch left.
3             Now executing right to left, push 3 again.
        --    Negate twice, leaving the value unchanged as our starting sum.

       ~      Now we start the main loop, reading a character from stdin.
    `0:       Duplicate and check if it's > 0, i.e. not end-of-stream.
 _ #          If so, continue to the left.
3        -    Subtract 3 to make the number relative to base 9.
        -     Then subtract it from the total, and repeat the loop.

  v           Once we reach the end of the input, we go down.
  _           Drop the EOF character from the stack and go left.
%9   +9       Mod the total with 9, and add 9.
   @.         Output the result and exit.

In sostanza stiamo calcolando la somma di tutte le cifre, più 45 per cifra (che alla fine verrà annullata quando modiamo con 9). Questa somma viene sottratta da 3 (il nostro totale iniziale) e un ulteriore 39 viene sottratto dalla cifra mancante (ASCII *meno tre). Ancora una volta che 3 meno 39 è un multiplo di 9, quindi viene annullato quando modiamo con 9.

Quindi alla fine stiamo calcolando la somma negativa di tutte le cifre, mod 9, più 9, cioè

9 - (digitsum % 9)

E questo ci dà la cifra mancante.


-1 byte se si sottrae 3 anziché 48. La maggior parte viene annullata dal bisogno di ottenere l'aggiunta 9 al modulo
Jo King,

@JoKing Grazie! Non ci avrei mai pensato. Peccato che abbiamo ancora bisogno del +9 ora, ma non riesco a vedere alcun modo per liberarmene.
James Holderness,

Gestito per rimuovere un altro byte comprimendolo fino a una riga! L'ho cambiato in% 9 del totale di ogni ciclo e poi riutilizza il 9-- sulla via del ritorno per aggiungere 9 al totale.
Jo King,

@JoKing So che sta risparmiando solo un altro byte, ma è geniale! Vale la pena pubblicarlo come nuova risposta. Avrai sicuramente il mio voto, se non altro.
James Holderness,

Inserito ! Riuscito a radere anche un ultimo byte! Penso che sia l'ultimo che posso fare
Jo King il


0

PowerShell , 40 byte

param($a)0..9|?{!(($a-replace'x',$_)%9)}

Provalo online! oppure Verifica tutti i casi di test

Accetta input come '123x'in $a. Costruisce una gamma 0di 9e usi Where-Object(qui abbreviato come |?) per tirare fuori quei numeri interi che corrispondono alla clausola. La clausola accetta $a, esegue una regex -replaceper sostituire la xcon la cifra corrente $_e ottiene la mod 9 con %9. Pertanto, se 9 si divide uniformemente, questo sarà zero. Prendiamo il booleano - non di ciò, che trasforma gli zeri in verità e tutto il resto in falso, in modo da soddisfare la clausola Where-Object. Tali risultati vengono lasciati in cantiere e l'output è implicito.



0

Retina , 35 34 25 byte

Se ?può essere 0 or 9, il risultato viene mostrato come 9.

.
$*
1{9}

^
9$*;
+`;1

.

Provalo online

Spiegazione

.       Sum of the digits in unary + 1
$*
1{9}    Modulo 9

^       Prepend 9 semicolons, for subtracting
9$*;
+`;1    Subtract from 9

.       Back to decimal

Credo che il \dpuò essere cambiato in giusto .e la seguente riga in $*.
Kritixi Lithos,

Ah giusto. Non l'avevo ancora rimosso ?quando l'ho scritto.
mbomb007,



@totallyhuman Ah, sì. Un altro residuo di una versione precedente.
mbomb007,


0

Tcl, 53 byte

puts [expr 9-([regsub -all (\\d)\\D? 0$argv +\\1])%9]

Come con altre risposte, questo viene abbreviato non dicendo esplicitamente "0 o 9".
Invece, un risultato di "9" significa 0 o 9.

Provalo online!

Spiegazione

Funziona abbastanza semplicemente. Impiega un'espressione regolare per:

  • dividere l'argomento in singole cifre
  • eliminare eventuali punti interrogativi non cifre
  • interlacciare le cifre con i segni più

Quindi valuta 9 - (sum_of_digits mod 9) per arrivare a un valore finale in 1..9, che quindi puts.

Lo 0 (in 0$argv) iniziale è richiesto nel caso in cui il punto interrogativo venga per primo nell'input; un segno più iniziale nella sequenza trasformata non è un problema expr.




0

Brainfuck , 50 byte

+>,[---[<-[<<]>[<+++++++++<]>>-],]-[<+>-----]<---.

Provalo online!

Stampa un 9 per 0 o 9. Il carattere mancante è rappresentato da:

Come funziona

Tape Format:
    0 Total Input 0

The total is represented as 9-digitSum%9

+>,[ Start loop with 1 as the total
    --- Subtract 3 from the inputted byte to make the value%9 equal to the digit
    [   While the input byte exists
      <-                 Decrement the total
      [<<]>[<+++++++++<] If the total is 0, reset it to 9
      >>-                Decrement the input byte
    ]
,] Continue loop until there is no input
-[<+>-----]<---. Add 48 to the total to convert the digit to the ascii value and output it

Il personaggio mancante deve essere un personaggio che ha una mod 9 di 4, +3 perché sottraggiamo 3 dalle cifre normali e +1 per l'inizializzazione del totale come 1.

Come nota a margine, c'è molta inefficienza nel codice per il bene del golf, poiché ogni cifra reimposterà il totale 5 volte ciascuno, anziché solo una volta a volte se ho sottratto 48 anziché 3.


0

> <> , 35 33 25 21 15 byte

Un'uscita di 0significa che il risultato potrebbe essere 0 o 9 .

0i:&0(?n&3--9%!

Provalo online!

6 byte salvati grazie a Jo King usando 'per rappresentare le cifre mancanti.


15 byte se si utilizza un 'personaggio anziché un?
Jo King il

0

Java 8, 36 34 byte

s->9-s.map(c->c>57?0:c-48).sum()%9

Restituisce 9quando entrambi 0e 9sono validi.

Spiegazione:

Provalo online.

s->                               // Method with IntStream parameter and int return-type
   9-                             //  Return 9, minus:
     s.map(c->c>57?0:c-48).sum()  //   The sum of the digits (ignoring the question mark)
     %9                           //   modulo-9
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.