Letzte Ziffer große Nummer

12

Finden Sie für eine gegebene Liste der Nummern die letzte Ziffer von Beispiel: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   

Weil .3(42)=316=43046721

Weil .4(32)=49=262144

Weil 4(31)=43=64 .

Weil 5(32)=59=1953125 .

Regeln:

Dies ist Codegolf, daher gewinnt die Antwort mit den wenigsten Bytes.

Wenn in Ihrer Sprache die Ganzzahlgröße begrenzt ist (z. B. 2321 ), ist n so klein, dass die Summe in die Ganzzahl passt.

Die Eingabe kann in jeder vernünftigen Form erfolgen (stdin, Datei, Befehlszeilenparameter, Ganzzahl, Zeichenfolge usw.).

Die Ausgabe kann in jeder vernünftigen Form erfolgen (Standardausgabe, Datei, grafisches Benutzerelement, in dem die Nummer angezeigt wird usw.).

Sah auf Code-Kriege.

Scath
quelle
2
Eine Frage, die ich habe: In deinem Beitrag sprichst du nur über numbers. Meinen Sie ausschließlich positive ganze Zahlen? So habe ich das Gefühl, dass es interpretiert wurde.
Jonathan Frech
1
Ist es sinnvoll, die Eingabe in umgekehrter Reihenfolge vorzunehmen? Kann die Eingabe Null sein?
NieDzejkob
1
Ich denke, Sie beabsichtigen, dass die Grenze für die Summe der Terme gilt, und daher sollten Routinen, die die tatsächliche Summe berechnen und dann modifizieren, fehlschlagen. ZB ist die Eingabe [999999,213412499,34532599,4125159,53539,54256439,353259,4314319,5325329,1242149,142219,1243219,14149,1242149,124419,999999999]gültig und das Ergebnis sollte lauten. 1Wenn ja, muss dies in der Frage klarer formuliert werden, da Sie Antworten ausgewählt haben, die dies nicht lösen (Tipp - Bewegen Sie das modInnere der Schleife). Fügen Sie vielleicht einige Beispiele hinzu, die dies verdeutlichen.
Neil Slater
1
Eigentlich ist das Ergebnis aus meinem Beispiel 9. Das dazu notwendige Ziffernreduktionsschema ist viel interessanter als die tatsächlichen Antworten, die dieses Problem erhalten hat.
Neil Slater
2
Lieber OP, wir brauchen mehr Testfälle.
NieDzejkob

Antworten:

15

JavaScript (ES7), 22 Byte

Beschränkt auf .2531

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

Probieren Sie es online!

Arnauld
quelle
2
Was um alles in der Welt, warum funktioniert das ?!
Caleb Jay
@ komali_2: **ist der Potenzierungsoperator von JavaScript. Der Rest ist ziemlich unkompliziert.
Shaggy
2
@ komali_2 a.join`**` ist äquivalent zu a.join(['**'])und ['**']wird '**'von der joinMethode erzwungen .
Arnauld
1
Ich denke, dass OP beabsichtigt, die Summe der Werte zu begrenzen. In diesem Fall werden die gestellten Probleme nicht gelöst.
Neil Slater
1
@AJFaraday die% 10 am Ende. Wenn Sie eine Zahl durch 10 teilen, ist der Rest (der Modul) immer die letzte Ziffer, sodass n % 10die letzte Ziffer vonn
Skidsdev
13

R , 25 Bytes

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

Probieren Sie es online!

ngm
quelle
Ich bin nicht sicher, was den Leuten an dieser Antwort so gut gefallen hat.
ngm
1
Ich persönlich mag es, Reducewenn sie benutzt werden.
JayCe
9

HP 49G RPL, 36,5 Byte

Führen Sie es im APPROX-Modus aus (aber geben Sie das Programm im EXAKT-Modus ein). Übernimmt Eingaben auf dem Stapel, wobei das erste Element am tiefsten im Stapel liegt, als ganze oder reelle Zahlen.

WHILE DEPTH 1 - REPEAT ^ END 10 MOD

Es exponentiiert direkt auf dem Stapel wie in Sophias Lösung, bis ein Wert übrig ist, und benötigt dann Mod 10, um die letzte Ziffer zu erhalten.

Der Grund, warum ich APPROX für die Berechnung verwende, ist, dass 0.0 ^ 0.0 = 1 (wenn beide Real sind), aber 0 ^ 0 =? (wenn beide ganze Zahlen sind). APPROX erzwingt alle Ganzzahlen in reelle Zahlen, daher ist die Eingabe mit beiden in Ordnung. Ich benutze jedoch EXACT, um das Programm aufzurufen, da 10 (Ganzzahl) ziffernweise und 6,5 Byte gespeichert sind, 10.0 (Real) jedoch als vollständige reelle Zahl gespeichert ist und 10,5 Byte beträgt. Ich vermeide auch die Verwendung von RPL's Reduce (STREAM genannt), da es ein zusätzliches Programmobjekt einführt, das 10 Byte Overhead bedeutet. Ich habe bereits eine und will keine andere.

Beschränkt auf die Genauigkeit eines HP 49G real (12 Dezimalstellen)

-10 Byte nach leerer Liste -> 1 Anforderung wurde entfernt.

-2 Bytes durch Eingabe im Stack.

Jason
quelle
1
Hey, kannst du erklären, wie der bytecount berechnet wird? Nur neugierig, wie diese Sprache Knabbereien verwendet .
JungHwan Min
1
@JungHwanMin Der HP 49G verwendet einen 4-Bit-Prozessor und eine BCD-Arithmetik, da es sich um einen Taschenrechner handelt. Intern werden die meisten Befehle in 2,5-Byte-Zeiger auf die von ihnen dargestellten Routinen umgewandelt, um Platz zu sparen. Auch kleine Zahlen (0-9) werden auf diese Weise transformiert.
Jason
1
Die Arbeit mit dem Saturn-Prozessor macht wirklich Spaß. Vor langer Zeit habe ich diesen Port von BurgerTime (in Assembly) für den HP 48G (X) geschrieben. Es wurde später auf die 49G portiert . Gute Erinnerungen!
Arnauld
7

Gleichstrom , 17-15 Bytes

1[^z1<M]dsMxzA%

Probieren Sie es online!

Nimmt Eingaben vom Stapel auf und gibt sie an den Stapel aus. Sehr einfache Implementierung - Exponentiert, bis nur noch ein Wert auf dem Stack und Mod für die letzte Ziffer übrig ist.

Danke an brhfl für das Speichern von zwei Bytes!

Sophia Lechner
quelle
2
Sie können Golf spielen ein Byte durch Änderung 10%zu A%, und ein weiteres Byte nicht Stack - Tiefe zweimal überprüft - nur legen 1vor der Ausführung oben auf dem Stapel da n ^ 1 == n:1[^z1<M]dsMxA%
brhfl
Gute Ideen! Ich hatte keine Ahnung, dass DC mich Aals Literal verwenden lassen würde, während die Dezimaleingabe aktiviert ist. Vielen Dank @brhfl!
Sophia Lechner
1
@SophiaLechner Dieser Trick funktioniert für alle Eingabebasen: codegolf.stackexchange.com/a/77728/11259
Digitales Trauma
6

J , 5 Bytes

-3 bytes dank cole!

10|^/

Probieren Sie es online!

Galen Ivanov
quelle
Geht 10|^/nicht
Cole
@cole Natürlich funktioniert es, danke!
Galen Ivanov
1
Endlich eine Herausforderung, bei der J Jelly schlägt!
Jonah
6

05AB1E , 4 Bytes

.«mθ

Probieren Sie es online!

Erläuterung

.«     # fold
  m    # power
   θ   # take the last digit
Emigna
quelle
1
Soweit ich weiß, Stack-basierten Sprachen können davon ausgehen , die Eingabe auf dem Stapel anstelle von STDIN oder Alternativen vorhanden ist, so etwas wie dies sollte für 4 Bytes (alternativ nur Platz arbeitet Eim Header).
Mr. Xcoder
Relevante Meta .
Mr. Xcoder
1
Ich habe dieses Problem im letzten Commit für die zukünftige Verwendung behoben .
Adnan
@ Mr.Xcoder: Richtig! Daran hätte ich mich erinnern sollen. Muss also selten mit impliziten Eingaben sein. Danke :)
Emigna
@ Mr.Xcoder Ähm, ich bin mir nicht sicher, ob das Meta wirklich so ist. Was ist eine "Funktion" in 05AB1E? Ich denke, es sollte einfach ein String sein, da man ihn einer Variablen zuordnen und mit auswerten kann .V. .«mθSieht eher wie ein Snippet aus, da Sie es für sich genommen keiner Variablen zur späteren Wiederverwendung zuweisen können. Nun, Adnan hat das Problem behoben, aber wie?
Erik der Outgolfer
5

Pure Bash (nur integrierte - keine externen Dienstprogramme), 21

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

Die Eingabe wird in der Befehlszeile als durch Kommas getrennte Liste angegeben.

Bash-Ganzzahlen unterliegen für 64- und 32-Bit-Versionen den normalen Beschränkungen für Ganzzahlen mit Vorzeichen.

Probieren Sie es online!

Digitales Trauma
quelle
2
^ist bitweises XOR, weshalb Sie 5aus dem Testfall herauskommen und nicht aus dem richtigen 1. Sie müssen ein Byte hinzufügen, um zu wechseln**
Sophia Lechner
@SophiaLechner Ja - natürlich - guter Fang! ^Ich bin nicht sicher, wie sich das eingeschlichen hat - ich hatte **in früheren Iterationen meines Entwicklungszyklus.
Digital Trauma
4

Python 2 und Python 3 , 30 Bytes

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

Probieren Sie es online!

Es Nwird erwartet, dass die Eingabe ein iterierbares Objekt über Zeichenfolgendarstellungen von Zahlenliteralen ist .

David Foerster
quelle
4

Ruby, 41 47 Bytes

Größenzunahme aufgrund der Behandlung von 0 im Eingabearray, die zusätzliche Berücksichtigung erfordert. Dank anrewritten

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

Dies wird gelöst, da ich glaube, dass die ursprüngliche Quelle beabsichtigt ist, dh für sehr große Potenzierungen, die nicht in sprachgebundene Ganzzahlen passen - die Einschränkung ist, dass das Array summiert wird 2**32-1und nicht, dass die Zwischenberechnungen auch garantiert passen. Tatsächlich scheint dies der Punkt der Herausforderung bei Code Wars zu sein. Rubys native Ganzzahlen können zwar ziemlich groß werden, mit% 10 am Ende können sie das folgende Beispiel jedoch nicht naiv verarbeiten

Z.B

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

Ausgabe: 9

Neil Slater
quelle
Beeindruckend. Wenn Sie 4 weitere Bytes ausgeben, können Sie auch viel höhere Türme bewältigen: Ersetzen Sie n**(t%4+4)durch, n**((t-1)%4+1)sodass Sie n**1anstelle von n**5usw. ein Lob für die Beobachtung erhalten, dass in jedem Stadium 4 ein guter Zyklus wäre.
neu geschrieben
1
Es gibt ein Problem, wenn die Sequenz 0s hat
umgeschrieben
@rewritten: Guter Ort! Das muss ich mir noch überlegen. Theoretisch sollte die Sequenz gezwungen werden, 2 Schritte vor der ersten Null zu beenden.
Neil Slater
In der Tat, aber das wird viel mehr Code erfordern, genau 6 weitere Bytes: n<2?n:vorher n**.
umgeschrieben
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;}

Probieren Sie es online!

  • -7 Bytes dank @raznagul
digEmAll
quelle
Sie können einige Bytes sparen, indem Sie die Klammern entfernen aund die Schleifenbedingung mit decrement ( for(var i=a.Lengt-1;i-->0;)) kombinieren . Aber using-Anweisung muss in die Byteanzahl einbezogen werden.
Rasnagul
@raznagul: Entschuldigung, ich bin ziemlich neu in Code-Golf in C #, ist es jetzt in Ordnung?
digEmAll
Kein Problem. Ja, das ist jetzt in Ordnung.
Raznagul
1
Sie können 3 weitere Bytes einsparen, indem Sie eine neue Variable verwenden, um das Ergebnis zu speichern und den größten Teil des Indexzugriffs auf das Array zu entfernen: Probieren Sie es online aus!
Raznagul
@raznagul: großartig!
digEmAll
3

C (gcc) , 56

  • 4 Bytes dank @JonathanFrech gespeichert

Rekursive Funktion, r()die von Makro aufgerufen wird f- normale Stapelbegrenzungen gelten.

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

Eingabe als nullterminiertes int-Array. Dies unter der Annahme, dass keines der x n Null ist.

Probieren Sie es online!

Digitales Trauma
quelle
2
) r(-> )r(.
Jonathan Frech
1
Auch, wenn Sie wollen UB verwenden, können Sie Golf r(int*n){return powauf R;r(int*n){R=pow.
Jonathan Frech
3

Japt -h , 7 Bytes

OvUqp)ì

Probieren Sie es online!

Erläuterung:

OvUqp)ì
Ov   )    // Japt eval:
   q      //   Join
  U       //   Input with
    p     //   Power method
      ì   // Split into an array of numbers
-h        // Return the last number
Oliver
quelle
Komisch, das würde bei mir nicht funktionieren.
Shaggy
6 Bytes
Shaggy
@ Shaggy : P
Oliver
Ah, um Jaysis willen! : \ Das passiert immer öfter!
Shaggy
3

Japt -h , 7 6 Bytes

Wenn die Eingabe in umgekehrter Reihenfolge erfolgen kann, kann das erste Zeichen entfernt werden.

Beschränkt auf 2**53-1.

Ôr!p ì

Versuch es


Erläuterung

Ô          :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
Zottelig
quelle
Ich habe genau die gleiche Antwort ohne die Flagge erhalten, so dass dies vorerst der optimale Weg ist.
Nit
@Nit: bis es bestätigt ist, können wir Eingaben in umgekehrter Reihenfolge vornehmen :)
Shaggy
@Oliver Ja, aber du verwendest immer noch eine Flagge. Persönlich denke ich, dass die Byteanzahl ohne Flags das genaueste Bewertungsergebnis ist.
Nit
@Nit Sollte ein Flag nicht im Metakonsens 3 Bytes hinzufügen?
LegionMammal978
@ LegionMammal978, nicht mehr .
Shaggy
2

Excel VBA, 60 Bytes

Eine anonyme VBE-Direktfensterfunktion, die Eingaben aus dem Bereich entgegennimmt [A1:XFD1]

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

Python 3 , 55 Bytes

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

ältere Versionen

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

PieCot
quelle
Müsste das nicht sein p=lambda...? Python kann keine rekursiven anonymen Lambdas verarbeiten. Wenn Ihre Funktion also benannt werden muss, muss sie Teil Ihrer Lösung sein, und die Benennung wird für Code-Golf-Herausforderungen auf Ihre Byteanzahl angerechnet.
mypetlion
2

Brain-Flak , 161 Bytes

Beinhaltet +1 für -r

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

Probieren Sie es online!

Das Beispiel [3, 4, 2]dauert länger als 60 Sekunden, sodass die TIO-Verbindung verwendet wird [4, 3, 2].

Das -rkann entfernt werden, wenn die Eingabe für eine Byteanzahl von 160 in umgekehrter Reihenfolge erfolgen kann.

# 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
quelle
2

Z80Golf , 36 Bytes

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

Probieren Sie es online!

Brute-Force-Testgeschirr

Nimmt die Eingabe als Rohbytes. Beschränkt auf 2 ** 8-1.

Erläuterung

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
quelle