Dernier chiffre grand nombre

12

Pour une liste donnée de nombres trouvez le dernier chiffre de Exemple:x x x x n 3 2 1[x1,x2,x3,...,xn]x1x2x3xn

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

Parce que .3(42)=316=43046721

Parce que .4(32)=49=262144

Parce que .4(31)=43=64

Parce que .5(32)=59=1953125

Règles:

C'est le golf de code, donc la réponse avec le moins d'octets gagne.

Si votre langue a des limites sur la taille entière (ex. ) n sera suffisamment petit pour que la somme tienne dans l'entier.2321

L'entrée peut être de n'importe quelle forme raisonnable (stdin, fichier, paramètre de ligne de commande, entier, chaîne, etc.).

La sortie peut être de n'importe quelle forme raisonnable (stdout, fichier, élément utilisateur graphique qui affiche le nombre, etc.).

Vu sur les guerres de code.

Critiquer de façon cinglante
la source
2
Une question que j'ai: dans votre article, vous ne parlez que de l' numberart. Voulez-vous dire des entiers positifs exclusivement? C'est ainsi que je ressens comment cela a été interprété.
Jonathan Frech
1
Est-il raisonnable de prendre l'entrée en sens inverse? L'entrée peut-elle être nulle?
NieDzejkob
1
Je pense que vous avez l'intention que la limite soit sur la somme des termes, et donc les routines qui calculent la somme réelle, puis le mod devrait échouer. Par exemple, l'entrée [999999,213412499,34532599,4125159,53539,54256439,353259,4314319,5325329,1242149,142219,1243219,14149,1242149,124419,999999999]est valide et le résultat devrait être 1Si c'est le cas, cela doit être clarifié dans la question car vous avez voté des réponses qui ne résolvent pas cela (indice - déplacez l' modintérieur de la boucle). Ajoutez peut-être quelques exemples qui rendent cela clair.
Neil Slater
1
En fait, le résultat de mon exemple est 9. Le schéma de réduction des chiffres nécessaire pour le mettre en œuvre est beaucoup plus intéressant que les réponses réelles à ce problème.
Neil Slater
2
Cher OP, nous avons besoin de plus de cas de test.
NieDzejkob

Réponses:

15

JavaScript (ES7), 22 octets

Limité à .2531

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

Essayez-le en ligne!

Arnauld
la source
2
Que diable, pourquoi ça marche?!
Caleb Jay
@ komali_2: **est l'opérateur d'exponentiation de JavaScript. Le reste est assez simple.
Shaggy
2
@ komali_2 a.join`**` est équivalent a.join(['**'])et ['**']contraint '**'par la joinméthode.
Arnauld
1
Je pense que OP a l'intention de limiter la somme des valeurs, auquel cas cela ne résout pas les problèmes tels qu'ils se posent.
Neil Slater
1
@AJFaraday le% 10 à la fin. Lorsque vous divisez un nombre par 10, le reste (le module) sera toujours le dernier chiffre, donc n % 10retournera le dernier chiffre den
Skidsdev
13

R , 25 octets

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

Essayez-le en ligne!

ngm
la source
Je ne sais pas ce que les gens ont tant aimé de cette réponse.
ngm
1
Personnellement, j'aime bien Reduceêtre utilisé.
JayCe
9

HP 49G RPL, 36,5 octets

Exécutez-le en mode APPROX (mais entrez le programme en mode EXACT). Prend des entrées sur la pile avec le premier élément le plus profond de la pile, sous forme d'entiers ou de réels.

WHILE DEPTH 1 - REPEAT ^ END 10 MOD

Il expose simplement sur la pile comme dans la solution de Sophia jusqu'à ce qu'il reste une valeur, puis prend le mod 10 pour obtenir le dernier chiffre.

La raison pour laquelle j'utilise APPROX pour le calcul est parce que 0,0 ^ 0,0 = 1 (quand ils sont tous les deux réels), mais 0 ^ 0 =? (quand ils sont tous les deux des entiers). APPROX contraint tous les entiers en réels, donc l'entrée est correcte avec l'un ou l'autre. Cependant, j'utilise EXACT pour entrer dans le programme parce que 10 (entier) est stocké chiffre par chiffre, et est de 6,5 octets, mais 10,0 (réel) est stocké en tant que nombre réel complet et est de 10,5 octets. J'évite également d'utiliser la réduction de RPL (appelée STREAM) car elle introduit un objet programme supplémentaire, qui représente 10 octets de surcharge. J'en ai déjà un et je n'en veux pas d'autre.

Limité à la précision d'un HP 49G réel (12 chiffres décimaux)

-10 octets après la liste vide -> 1 exigence a été supprimée.

-2 octets en prenant l'entrée sur la pile.

Jason
la source
1
Hé, pourriez-vous expliquer comment le bytecount est calculé? Juste curieux de voir comment cette langue utilise des grignotages .
JungHwan Min
1
@JungHwanMin Le HP 49G utilise un processeur 4 bits et l'arithmétique BCD, car il s'agit d'une calculatrice. En interne, la plupart des commandes sont transformées en pointeurs de 2,5 octets vers les routines qu'elles représentent, pour économiser de l'espace. Les petits nombres (0-9) sont également transformés de cette manière.
Jason
1
Le processeur Saturn est en fait assez amusant à travailler. Il y a longtemps , j'ai écrit ce port de BurgerTime (en assemblage) pour le HP 48G (X). Il a ensuite été porté sur le 49G . Bons souvenirs!
Arnauld
7

dc , 17 15 octets

1[^z1<M]dsMxzA%

Essayez-le en ligne!

Prend des entrées de la pile, des sorties vers la pile. Implémentation très simple - exponentiates jusqu'à ce qu'il ne reste qu'une valeur sur la pile et mod pour le dernier chiffre.

Merci à brhfl pour avoir économisé deux octets!

Sophia Lechner
la source
2
Vous pouvez jouer au golf un octet en changeant 10%en A%, et un octet de plus en ne vérifiant pas la profondeur de la pile deux fois - il suffit de mettre un 1sommet de la pile avant d'exécuter depuis n ^ 1 == n:1[^z1<M]dsMxA%
brhfl
Bonnes idées! Je n'avais aucune idée que dc me laisserait utiliser Acomme littéral tout en étant réglé sur une entrée décimale. Merci @brhfl!
Sophia Lechner
1
@SophiaLechner Cette astuce fonctionne pour toutes les bases d'entrée: codegolf.stackexchange.com/a/77728/11259
Digital Trauma
6

J , 5 octets

-3 octets grâce à Cole!

10|^/

Essayez-le en ligne!

Galen Ivanov
la source
Ça 10|^/ne marche pas?
cole
@cole Bien sûr, cela fonctionne, merci!
Galen Ivanov
1
Enfin, un défi où J bat Jelly!
Jonah
6

05AB1E , 4 octets

.«mθ

Essayez-le en ligne!

Explication

.«     # fold
  m    # power
   θ   # take the last digit
Emigna
la source
1
Pour autant que je sache, les langages basés sur la pile peuvent supposer que l'entrée est présente sur la pile au lieu de STDIN ou d'alternatives, donc quelque chose comme ça devrait fonctionner pour 4 octets (alternativement, placez-le simplement Edans l'en-tête).
M. Xcoder
Méta pertinent .
M. Xcoder
1
J'ai résolu ce problème dans le dernier commit pour une utilisation future.
Adnan
@ Mr.Xcoder: C'est vrai! J'aurais dû m'en souvenir. Il est donc rarement nécessaire de le faire avec une entrée implicite. Merci :)
Emigna
@ Mr.Xcoder Euh, je ne sais pas si c'est ce que la méta signifie vraiment. Qu'est-ce qu'une "fonction" dans 05AB1E? Je pense que cela devrait simplement être une chaîne, car vous pouvez l'affecter à une variable, et peut être évalué avec .V. .«mθressemble plus à un extrait, car, en soi, vous ne pouvez pas l'affecter à une variable pour une réutilisation ultérieure. Eh bien, Adnan a maintenant résolu le problème, mais hein.
Erik the Outgolfer le
5

Pure Bash (intégrés uniquement - pas d'utilitaires externes), 21

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

L'entrée est donnée sur la ligne de commande sous la forme d'une liste séparée par des virgules.

Les entiers bash sont soumis à des limites entières signées normales pour les versions 64 et 32 ​​bits.

Essayez-le en ligne!

Traumatisme numérique
la source
2
^est XOR au niveau du bit, c'est pourquoi vous 5sortez du cas de test au lieu du correct 1. Vous devrez ajouter un octet pour basculer vers**
Sophia Lechner
@SophiaLechner Oui - bien sûr - bonne prise! Je ne sais pas comment cela ^s'est glissé - j'avais eu **dans les précédentes itérations de mon cycle de développement.
Digital Trauma
4

Python 2 et Python 3 , 30 octets

lambda N:eval('**'.join(N))%10

Essayez-le en ligne!

L'entrée Ndevrait être un objet itérable sur des représentations de chaînes de littéraux numériques .

David Foerster
la source
4

Rubis, 41 47 octets

Augmentation de la taille en raison de la gestion de tout 0 dans le tableau d'entrée, ce qui nécessite une attention supplémentaire. Grâce àrewritten

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

Cela est résolu car je pense que la source d'origine était destinée, c'est-à-dire pour les très grandes exponentiations qui ne rentreront pas dans les entiers natifs de la langue - la restriction est que le tableau résumera 2**32-1, et non que les calculs intermédiaires sont également garantis. En fait, cela semble être le but du défi sur Code Wars. Bien que les entiers natifs de Ruby puissent devenir assez gros, ils ne peuvent pas faire face à l'exemple ci-dessous traité naïvement avec un% 10 à la fin

Par exemple

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

Production: 9

Neil Slater
la source
Impressionnant. En dépensant 4 octets de plus, vous pouvez également faire face à des tours beaucoup plus hautes: remplacez-les n**(t%4+4)par n**((t-1)%4+1)ainsi vous obtenez n**1au lieu de n**5etc. Bravo pour l'observation qu'à tout stade 4 serait un bon cycle.
réécrit le
1
Il y a un problème si la séquence a 0s
réécrit le
@rewritten: Bon endroit! Je vais devoir y penser. En théorie, la séquence devrait être forcée de terminer 2 étapes avant le premier zéro.
Neil Slater
En effet, mais cela nécessitera beaucoup plus de code, exactement 6 octets de plus: n<2?n:avant n**.
réécrit le
3

C # (.NET Core) , 84 octets

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

Essayez-le en ligne!

  • -7 octets grâce à @raznagul
digEmAll
la source
Vous pouvez enregistrer quelques octets en supprimant les crochets autour aet en combinant la condition de boucle avec la décrémentation ( for(var i=a.Lengt-1;i-->0;)). Mais la usingdéclaration doit être incluse dans le nombre d'octets.
raznagul
@raznagul: désolé, je suis assez nouveau au code-golf en C #, est-ce que ça va maintenant?
digEmAll
Aucun problème. Oui ça va maintenant.
raznagul
1
Vous pouvez enregistrer 3 octets supplémentaires en utilisant une nouvelle variable pour conserver le résultat et supprimer la plupart des accès d'index au tableau: Essayez-le en ligne!
raznagul
@raznagul: super!
digEmAll
3

C (gcc) , 56

  • 4 octets enregistrés grâce à @JonathanFrech

Fonction récursive r()appelée depuis la macro f- les limites de pile normales s'appliquent.

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

Entrée donnée sous la forme d'un tableau int à terminaison zéro. Ceci sous l'hypothèse qu'aucun des x n n'est nul.

Essayez-le en ligne!

Traumatisme numérique
la source
2
) r(-> )r(.
Jonathan Frech
1
De plus, si vous voulez utiliser UB, vous pouvez jouer r(int*n){return powau golf R;r(int*n){R=pow.
Jonathan Frech
3

Julia 0,6 , 30 octets

firstdigitsx->foldl(^,x)

Essayez-le en ligne!

Il s'agit d'une fonction anon
∘ est l'opérateur de composition.
Il s'agit de plusieurs octets

Lyndon White
la source
3

Japt -h , 7 octets

OvUqp)ì

Essayez-le en ligne!

Explication:

OvUqp)ì
Ov   )    // Japt eval:
   q      //   Join
  U       //   Input with
    p     //   Power method
      ì   // Split into an array of numbers
-h        // Return the last number
Oliver
la source
Bizarre, ça ne marcherait pas pour moi.
Shaggy
6 octets
Shaggy
@Shaggy : P
Oliver
Ah, pour l'amour de Jaysis! : \ Cela se produit de plus en plus souvent!
Shaggy
3

Japt -h , 7 6 octets

Si l'entrée peut être prise dans l'ordre inverse, le premier caractère peut être supprimé.

Limité à 2**53-1.

Ôr!p ì

Essayez-le


Explication

Ô          :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
Hirsute
la source
J'ai obtenu la même réponse exacte sans le drapeau, donc cela semble être la meilleure façon pour l'instant.
Nit
@Nit: jusqu'à ce qu'il soit confirmé, nous pouvons prendre des informations en sens inverse :)
Shaggy
@Oliver Oui, mais vous utilisez toujours un drapeau. Personnellement, je pense que le nombre d'octets sans indicateur est le résultat de notation le plus précis.
Nit
@Nit Un indicateur ne devrait-il pas ajouter 3 octets par méta-consensus?
LegionMammal978
@ LegionMammal978, plus maintenant .
Shaggy
2

Excel VBA, 60 octets

Une fonction de fenêtre immédiate VBE anonyme qui prend l'entrée de la plage [A1:XFD1]

s=1:For i=-[Count(1:1)]To-1:s=Cells(1,-i)^s:Next:?Right(s,1)
Taylor Scott
la source
2

CJam , 14 octets

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

Devrait fonctionner pour n'importe quelle entrée, car CJam n'est pas limité aux entiers 64 bits

Essayez-le en ligne!

maxb
la source
2

Python 3 , 55 octets

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

Versions plus anciennes

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

PieCot
la source
Cela ne devrait-il pas être le cas p=lambda...? Python ne peut pas gérer les lambdas anonymes récursifs, donc si vous avez besoin que votre fonction soit nommée, elle doit faire partie de votre solution, et la dénomination compte pour votre nombre d'octets pour les défis de code-golf.
mypetlion
2

Brain-Flak , 161 octets

Comprend +1 pour -r

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

Essayez-le en ligne!

L'exemple [3, 4, 2]prend plus de 60 secondes, donc la liaison TIO utilise [4, 3, 2].

Le -rpeut être supprimé si l'entrée peut être prise dans l'ordre inverse pour un nombre d'octets de 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
({}((()()()()()){})(<>))<>{(({})){({}[()])<>}{}}{}<>([{}()]{})
Riley
la source
2

Z80Golf , 36 octets

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

Essayez-le en ligne!

Harnais de test de force brute

Prend l'entrée en octets bruts. Limité à 2 ** 8-1.

Explication

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
NieDzejkob
la source