Numero grande dell'ultima cifra


12

Per una data lista di numero trova l'ultima cifra di x x x x n 3 2 1 Esempio:[x1,x2,x3,...,xn]x1x2x3xn

[3, 4, 2] == 1
[4, 3, 2] == 4
[4, 3, 1] == 4
[5, 3, 2] == 5   

Perché .3(42)=316=43046721

Perché .4(32)=49=262144

Perché .4(31)=43=64

Perché .5(32)=59=1953125

Regole:

Questo è il codice golf, quindi vince la risposta con il minor numero di byte.

Se la tua lingua ha dei limiti sulla dimensione dei numeri interi (es. ) n sarà abbastanza piccolo da contenere la somma nell'intero.2321

L'input può essere qualsiasi forma ragionevole (stdin, file, parametro della riga di comando, numero intero, stringa, ecc.).

L'output può essere qualsiasi forma ragionevole (stdout, file, elemento utente grafico che visualizza il numero, ecc.).

Ho visto guerre di codice.


2
Una domanda che ho: Nel tuo post parli solo di numbers. Intendi esclusivamente numeri positivi? Cioè sento come è stato interpretato.
Jonathan Frech,

1
Prendere l'input al contrario è ragionevole? L'ingresso può essere zero?
NieDzejkob,

1
Penso che tu intenda che il limite sia sulla somma dei termini, e quindi le routine che calcolano la somma effettiva quindi mod dovrebbe fallire. Ad esempio, l'input [999999,213412499,34532599,4125159,53539,54256439,353259,4314319,5325329,1242149,142219,1243219,14149,1242149,124419,999999999]è valido e il risultato dovrebbe essere 1In tal caso, questo deve essere reso più chiaro nella domanda poiché hai votato le risposte che non risolvono questo problema (suggerimento: sposta l' modinterno del loop). Forse aggiungi alcuni esempi che lo chiariscono.
Neil Slater,

1
In realtà il risultato del mio esempio è 9. Lo schema di riduzione delle cifre necessario per implementare questo è molto più interessante delle risposte reali che questo problema ha raccolto.
Neil Slater,

2
Caro PO, abbiamo bisogno di più casi di test.
NieDzejkob,

Risposte:


15

JavaScript (ES7), 22 byte

Limitato a .2531

a=>eval(a.join`**`)%10

Provalo online!


2
Cosa diavolo, perché funziona ?!
Caleb Jay,

@ komali_2: **è l'operatore esponenziale di JavaScript. Il resto è piuttosto semplice.
Shaggy,

2
@ komali_2 a.join`**` è equivalente a.join(['**'])ed ['**']è costretto '**'dal joinmetodo.
Arnauld,

1
Penso che OP intenda che il limite è sulla somma dei valori, nel qual caso ciò non risolve i problemi come posti.
Neil Slater,

1
@AJFaraday% 10 alla fine. Quando si divide un numero per 10, il resto (il modulo) sarà sempre l'ultima cifra, quindi n % 10restituirà l'ultima cifra din
Skidsdev

13

R , 25 byte

Reduce(`^`,scan(),,T)%%10

Provalo online!


Non sono sicuro di cosa le persone abbiano apprezzato così tanto di questa risposta.
ngm,

1
Personalmente mi piace vedere Reducein uso.
JayCe,


9

HP 49G RPL, 36,5 byte

Eseguilo in modalità APPROX (ma inserisci il programma in modalità EXACT). Prende input sullo stack con il primo elemento più profondo nello stack, come numeri interi o reali.

WHILE DEPTH 1 - REPEAT ^ END 10 MOD

Espone direttamente nello stack come nella soluzione di Sophia fino a quando rimane un valore, quindi prende la mod 10 per ottenere l'ultima cifra.

Il motivo per cui utilizzo APPROX per il calcolo è perché 0,0 ^ 0,0 = 1 (quando sono entrambi reali), ma 0 ^ 0 =? (quando sono entrambi numeri interi). APPROX costringe tutti i numeri interi a reali, quindi l'input va bene con entrambi. Tuttavia, utilizzo EXACT per accedere al programma perché 10 (numero intero) viene memorizzato cifra per cifra ed è 6,5 byte, ma 10,0 (reale) viene memorizzato come numero reale completo ed è 10,5 byte. Inoltre evito di utilizzare la riduzione di RPL (chiamata STREAM) perché introduce un oggetto programma aggiuntivo, che è 10 byte di sovraccarico. Ne ho già uno e non ne voglio un altro.

Limitato alla precisione di un HP 49G reale (12 cifre decimali)

-10 byte dopo elenco vuoto -> 1 requisito è stato rimosso.

-2 byte prendendo input in pila.


1
Ehi, potresti spiegare come viene calcolato il bytecount? Sono solo curioso di sapere come quel linguaggio usi i bocconcini .
JungHwan Min

1
@JungHwanMin L'HP 49G utilizza un processore a 4 bit e l'aritmetica BCD, poiché è una calcolatrice. Internamente la maggior parte dei comandi viene trasformata in puntatori da 2,5 byte alle routine che rappresentano, per risparmiare spazio. Anche i numeri piccoli (0-9) vengono trasformati in questo modo.
Jason,

1
Il processore Saturn è davvero divertente con cui lavorare. Un lungo tempo fa, ho scritto questa porta di BurgerTime (in assemblea) per la HP 48G (X). Successivamente è stato portato sul 49G . Bei ricordi!
Arnauld,

7

dc , 17 15 byte

1[^z1<M]dsMxzA%

Provalo online!

Prende input dallo stack, output allo stack. Implementazione molto semplice: esponenzia fino a quando non rimane un solo valore nello stack e mod per l'ultima cifra.

Grazie a brhfl per aver salvato due byte!


2
Puoi giocare a golf di un byte cambiando 10%in A%, e un altro byte non controllando due volte la profondità dello stack - basta metterlo in 1cima allo stack prima di eseguire dal n ^ 1 == n:1[^z1<M]dsMxA%
brhfl

Buone idee! Non avevo idea che DC mi avrebbe lasciato usare Acome valore letterale mentre impostato su input decimale. Grazie @brhfl!
Sophia Lechner,

1
@SophiaLechner Questo trucco funziona per tutte le basi di input: codegolf.stackexchange.com/a/77728/11259
Digital Trauma


6

05AB1E , 4 byte

.«mθ

Provalo online!

Spiegazione

.«     # fold
  m    # power
   θ   # take the last digit

1
Per quanto ne so, linguaggi basati su stack possono assumere è presente sulla pila anziché STDIN o alternative ingresso, in modo simile questo dovrebbe funzionare per 4 byte (in alternativa, è sufficiente posizionare Enell'intestazione).
Mr. Xcoder,


1
Ho risolto questo problema nell'ultimo commit per un utilizzo futuro.
Adnan,

@ Mr.Xcoder: giusto! Avrei dovuto ricordarmelo. Quindi raramente è necessario però con input implicito. Grazie :)
Emigna il

@ Mr.Xcoder Uh, non sono sicuro che sia questo il vero significato del meta. Che cos'è una "funzione" in 05AB1E? Penso che dovrebbe essere semplicemente una stringa, dal momento che è possibile assegnarla a una variabile e può essere valutata con .V. .«mθsembra più uno snippet, poiché, da solo, non è possibile assegnarlo a una variabile per un successivo riutilizzo. Bene, Adnan ora ha risolto il problema, ma eh.
Erik the Outgolfer,

5

Pure Bash (solo builtin - nessuna utility esterna), 21

echo $[${1//,/**}%10]

L'input viene fornito sulla riga di comando come un elenco separato da virgole.

I numeri interi di Bash sono soggetti ai normali limiti di numeri interi con segno per le versioni a 64 e 32 bit.

Provalo online!


2
^è XOR bit a bit, motivo per cui stai uscendo 5dal test case anziché dal corretto 1. Dovrai aggiungere un byte per passare a**
Sophia Lechner

@SophiaLechner Sì - certo - buona cattura! Non sono sicuro di come ^si sia insinuato - ho avuto **nelle precedenti iterazioni del mio ciclo di sviluppo.
Digital Trauma,



4

Rubino, 41 47 byte

Aumento delle dimensioni dovuto alla gestione di qualsiasi 0 nell'array di input, che necessita di ulteriore considerazione. Grazie arewritten

->a{a.reverse.inject{|t,n|n<2?n:n**(t%4+4)}%10}

Ciò è stato risolto poiché credo che l'origine originale intendesse, vale a dire esponenziazioni molto grandi che non rientrano negli interi nativi della lingua - la restrizione è che l'array si sommerà 2**32-1, non che anche i calcoli provvisori si adattino. In effetti, questo sembrerebbe essere il punto della sfida su Code Wars. Sebbene gli interi nativi di Ruby possano diventare piuttosto grandi, non possono far fronte all'esempio seguente elaborato ingenuamente con un% 10 alla fine

Per esempio

Ingresso: [999999,213412499,34532597,4125159,53539,54256439,353259,4314319,5325329,1242149,142219,1243219,14149,1242149,124419,999999999]

Produzione: 9


Degno di nota. Spendendo altri 4 byte, puoi anche far fronte a torri molto più alte: sostituiscile n**(t%4+4)con n**((t-1)%4+1)così ottieni n**1invece di n**5ecc. Complimenti per l'osservazione che in qualsiasi fase 4 sarebbe un buon ciclo.
riscritto l'

1
C'è un problema se la sequenza ha 0s
riscritto l'

@rewritten: buon posto! Ci dovrò pensare. In teoria la sequenza dovrebbe essere forzata a terminare 2 passaggi prima del primo zero.
Neil Slater,

Anzi, ma ciò richiederà molto più codice, esattamente altri 6 byte: n<2?n:prima n**.
riscritto il




3

C # (.NET Core) , 84 byte

a=>{int i=a.Length-1,j=a[i];for(;i-->0;)j=(int)System.Math.Pow(a[i],j);return j%10;}

Provalo online!

  • -7 byte grazie a @raznagul

È possibile salvare alcuni byte rimuovendo le parentesi quadre ae combinando la condizione del ciclo con il decremento ( for(var i=a.Lengt-1;i-->0;)). Ma using-statement deve essere incluso nel conteggio dei byte.
raznagul,

@raznagul: scusa, sono abbastanza nuovo nel code-golf in C #, va bene adesso?
digEmAll

Nessun problema. Sì, ora va bene.
raznagul,

1
Puoi salvare altri 3 byte usando una nuova variabile per contenere il risultato e rimuovere gran parte dell'accesso all'indice dell'array: provalo online!
raznagul,

@raznagul: fantastico!
digEmAll

3

C (gcc) , 56

  • Salvato 4 byte grazie a @JonathanFrech

Funzione ricorsiva r()chiamata da macro f- si applicano i limiti di stack normali.

R;r(int*n){R=pow(*n,n[1]?r(n+1):1);}
#define f(n)r(n)%10

Input fornito come array int con terminazione zero. Questo presuppone che nessuno degli x n sia zero.

Provalo online!


2
) r(-> )r(.
Jonathan Frech,

1
Inoltre, se si desidera utilizzare UB, è possibile giocare r(int*n){return powa golf R;r(int*n){R=pow.
Jonathan Frech,



3

Japt -h , 7 6 byte

Se l'input può essere preso in ordine inverso, il primo carattere può essere rimosso.

Limitato a 2**53-1.

Ôr!p ì

Provalo


Spiegazione

Ô          :Reverse the array
 r         :Reduce by
  !p       :  Raising the current element to the power of the current total, initially the first element
     ì     :Split to an array of digits
           :Implicitly output the last element

Ho ottenuto la stessa identica risposta senza la bandiera, quindi questo sembra il modo ottimale per ora.
Nit

@Nit: fino a quando non sarà confermato, possiamo inserire input al contrario :)
Shaggy,

@Oliver Sì, ma stai ancora usando una bandiera. Personalmente penso che il conteggio dei byte senza flag sia il risultato di punteggio più accurato.
Nit

@Nit Una bandiera non dovrebbe aggiungere 3 byte per meta consenso?
LegionMammal978,

@ LegionMammal978, non più .
Shaggy,



2

Excel VBA, 60 byte

Una funzione finestra immediata VBE anonima che accetta input dall'intervallo [A1:XFD1]

s=1:For i=-[Count(1:1)]To-1:s=Cells(1,-i)^s:Next:?Right(s,1)


2

CJam , 14 byte

q~_,({~#]}*~A%

Dovrebbe funzionare per qualsiasi input, poiché CJam non è limitato a numeri interi a 64 bit

Provalo online!


2

Python 3 , 55 byte

p=lambda l,i=-1:not l or f'{l[0]**int(p(l[1:],0))}'[i:] 

Versioni precedenti

p=lambda l,i=-1:len(l)and f'{l[0]**int(p(l[1:],0))}'[i:]or 1    (60 bytes)


Non dovrebbe essere p=lambda...? Python non è in grado di gestire lambda anonimi ricorsivi, quindi se hai bisogno che la tua funzione sia nominata, deve far parte della tua soluzione e il conteggio dei nomi per il conteggio dei byte per le sfide del code-golf.
mypetlion il


2

Brain-Flak , 161 byte

Include +1 per -r

([][()]){({}[()]<({}<(({}))>[()]){({}<(({})<({}<>)({<({}[()])><>({})<>}{}<><{}>)>)>[()])}{}{}>)}{}({}((()()()()()){})(<>))<>{(({})){({}[()])<>}{}}{}<>([{}()]{})

Provalo online!

L'esempio [3, 4, 2]richiede più di 60 secondi, quindi utilizza il collegamento TIO [4, 3, 2].

La -rpuò essere rimosso se ingresso può essere presa in senso inverso per un conteggio di byte di 160.

# Push stack size -1
([][()])

# While there are 2 numbers on the stack
{({}[()]<

    # Duplicate the second number on the stack (we're multiplying this number by itself)
    ({}<(({}))>[()])

    # For 0 .. TOS
    {({}<

        # Copy TOS
        (({})<

        # Multiple Top 2 numbers
        ({}<>)({<({}[()])><>({})<>}{}<><{}>)

        # Paste the old TOS
        >)

    # End for (and clean up a little)
    >[()])}{}{}

# End While (and clean up)
>)}{}

# Mod 10
({}((()()()()()){})(<>))<>{(({})){({}[()])<>}{}}{}<>([{}()]{})


2

Z80Golf , 36 byte

00000000: cd03 80f5 30fa f1f1 57f1 280d 4f41 15af  ....0...W.(.OA..
00000010: 8110 fd47 1520 f818 ef7a d60a 30fc c60a  ...G. ...z..0...
00000020: cd00 8076                                ...v

Provalo online!

Cablaggio di prova a forza bruta

Accetta input come byte non elaborati. Limitato a 2 ** 8-1.

Spiegazione

input:
    call $8003    ;      the input bytes
    push af       ; push                 on the stack
    jr nc, input  ;                                   until EOF
    pop af        ; the last byte is going to be pushed twice
    pop af
outer:
    ld d, a       ; d = exponentiation loop counter, aka the exponent
    pop af        ; pop the new base off the stack
    jr z, output  ; The flags are being pushed and popped together with the
                  ; accumulator. Since the Z flag starts as unset and no
                  ; instruction in the input loop modifies it, the Z flag is
                  ; going to be unset as long as there is input, so the jump
                  ; won't be taken. After input is depleted, a controlled stack
                  ; underflow will occur. Since SP starts at 0, the flags
                  ; register will be set to the $cd byte from the very beginning
                  ; of the program. The bit corresponding to the Z flag happens
                  ; to be set in that byte, so the main loop will stop executing
    ld c, a       ; C = current base
    ld b, c       ; B = partial product of the exponentiation loop
    dec d         ; if the exponent is 2, the loop should only execute once, so
                  ; decrement it to adjust that
pow:
    xor a         ; the multiplication loop sets A to B*C and zeroes B in the
mul:              ; process, since it's used as the loop counter
    add c         ; it's definitely not the fastest multiplication algorithm,
    djnz mul      ; but it is the smallest
    ld b, a       ; save the multiplication result as the partial product
    dec d         ; jump back to make the next iteration of either
    jr nz, pow    ; the exponentiation loop or the main loop, adjusting the
    jr outer      ; loop counter in the process
output:           ; after all input is processed, we jump here. We've prepared
    ld a, d       ; to use the result as the next exponent, so copy it back to A
mod:              ; simple modulo algorithm:
    sub 10        ;            subtract ten
    jr nc, mod    ; repeatedly              until you underflow,
    add 10        ; then undo the last subtraction by adding ten
    call $8000    ; output the result
    halt          ; and exit

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.