Duża cyfra ostatniej cyfry

12

Dla danej listy liczb znajdź ostatnią cyfrę Przykład:[x1,x2,x3,...,xn]x1x2x3xn

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

Ponieważ .3(42)=316=43046721

Ponieważ .4(32)=49=262144

Ponieważ .4(31)=43=64

Ponieważ .5(32)=59=1953125

Zasady:

To jest golf golfowy, więc wygrywa odpowiedź z najmniejszą liczbą bajtów.

Jeśli twój język ma ograniczenia wielkości całkowitych (np. 2321 ) n będzie wystarczająco małe, aby suma zmieściła się w liczbie całkowitej.

Dane wejściowe mogą mieć dowolną rozsądną formę (standardowe wejście, plik, parametr wiersza poleceń, liczba całkowita, ciąg itp.).

Dane wyjściowe mogą mieć dowolną rozsądną formę (standardowe wyjście, plik, graficzny element użytkownika, który wyświetla liczbę itp.).

Widziałem wojny wojenne.

Oszust
źródło
2
Mam jedno pytanie: W swoim poście mówisz tylko o numbers. Masz na myśli wyłącznie dodatnie liczby całkowite? Czuję, jak to było interpretowane.
Jonathan Frech,
1
Czy przyjęcie danych w odwrotnej kolejności jest uzasadnione? Czy dane wejściowe mogą wynosić zero?
NieDzejkob,
1
Myślę , że zamierzasz, aby limit był sumą warunków, a zatem procedury, które obliczają rzeczywistą sumę, a następnie modyfikacja powinna zawieść. Np. Dane wejściowe [999999,213412499,34532599,4125159,53539,54256439,353259,4314319,5325329,1242149,142219,1243219,14149,1242149,124419,999999999]są prawidłowe, a wynik powinien brzmieć 1Jeśli tak, należy to wyjaśnić w pytaniu, ponieważ masz głosowane odpowiedzi, które tego nie rozwiązują (wskazówka - poruszaj się modwewnątrz pętli). Być może dodaj kilka przykładów, które to wyjaśnią.
Neil Slater,
1
Właściwie wynik z mojego przykładu to 9. Schemat redukcji cyfr konieczny do wdrożenia tego jest o wiele bardziej interesujący niż rzeczywiste odpowiedzi, jakie przyniósł ten problem.
Neil Slater,
2
Drogi OP, potrzebujemy więcej przypadków testowych.
NieDzejkob,

Odpowiedzi:

15

JavaScript (ES7), 22 bajty

Ograniczony do .2)53-1

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

Wypróbuj online!

Arnauld
źródło
2
Co do licha, dlaczego to działa ?!
Caleb Jay
@ komali_2: **jest operatorem potęgowania JavaScript. Reszta jest dość prosta.
Kudłaty
2
@ komali_2 a.join`**` jest równoważne a.join(['**'])i ['**']wymuszane '**'przez joinmetodę.
Arnauld
1
Myślę, że OP zamierza ograniczyć sumę wartości, w którym to przypadku nie rozwiązuje to postawionych problemów.
Neil Slater,
1
@AJFaraday% 10 na końcu. Podczas dzielenia dowolnej liczby przez 10, pozostała część (moduł) będzie zawsze ostatnią cyfrą, więc n % 10zwróci ostatnią cyfręn
Skidsdev
13

R , 25 bajtów

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

Wypróbuj online!

ngm
źródło
Nie jestem pewien, co ludzie tak bardzo lubią w tej odpowiedzi.
ngm
1
Osobiście lubię Reducebyć wykorzystywany.
JayCe,
9

HP 49G RPL, 36,5 bajtów

Uruchom go w trybie APPROX (ale wejdź do programu w trybie DOKŁADNY). Pobiera dane wejściowe na stosie z pierwszym elementem najgłębiej na stosie, jako liczby całkowite lub rzeczywiste.

WHILE DEPTH 1 - REPEAT ^ END 10 MOD

Prosto wykładniczy na stosie, jak w rozwiązaniu Sophii, aż pozostała jedna wartość, a następnie bierze mod 10, aby uzyskać ostatnią cyfrę.

Powodem, dla którego używam APPROX do obliczeń jest to, że 0,0 ^ 0,0 = 1 (gdy oba są rzeczywiste), ale 0 ^ 0 =? (gdy oba są liczbami całkowitymi). APPROX zmusza wszystkie liczby całkowite do wartości rzeczywistych, więc wejście jest w porządku z jednym z nich. Jednak używam EXACT, aby wejść do programu, ponieważ 10 (liczba całkowita) jest przechowywana cyfra po cyfrze i ma 6,5 ​​bajta, ale 10,0 (rzeczywista) jest przechowywana jako pełna liczba rzeczywista i ma 10,5 bajtów. Unikam także używania funkcji RPL zmniejszającej (zwanej STREAM), ponieważ wprowadza ona dodatkowy obiekt programu, który ma 10 bajtów narzutu. Mam już jeden i nie chcę drugiego.

Ograniczona do dokładności rzeczywistego HP 49G (12 cyfr dziesiętnych)

-10 bajtów po pustej liście -> 1 wymaganie zostało usunięte.

-2 bajty, przyjmując dane wejściowe na stosie.

Jason
źródło
1
Hej, czy możesz wyjaśnić, w jaki sposób obliczana jest liczba bajtów? Ciekawe, jak ten język używa skórek .
JungHwan Min
1
@JungHwanMin HP 49G wykorzystuje 4-bitowy procesor i arytmetykę BCD, ponieważ jest to kalkulator. Wewnętrznie większość poleceń jest przekształcana w 2,5-bajtowe wskaźniki do procedur, które reprezentują, aby zaoszczędzić miejsce. Małe liczby (0–9) są również przekształcane w ten sposób.
Jason,
1
Procesor Saturn jest naprawdę fajny w pracy. Długi czas temu pisałem ten port BurgerTime (w zespole) dla HP 48G (X). Później został przeniesiony do 49G . Dobre wspomnienia!
Arnauld
7

dc , 17 15 bajtów

1[^z1<M]dsMxzA%

Wypróbuj online!

Pobiera dane wejściowe ze stosu, dane wyjściowe do stosu. Bardzo prosta implementacja - potęguje, aż na stosie pozostanie tylko jedna wartość i mod dla ostatniej cyfry.

Dzięki brhfl za oszczędność dwóch bajtów!

Sophia Lechner
źródło
2
Możesz zagrać w jeden bajt, zmieniając 10%na A%i jeszcze jeden, nie sprawdzając dwukrotnie głębokości stosu - po prostu umieść 1stos na szczycie przed wykonaniem od n ^ 1 == n:1[^z1<M]dsMxA%
brhfl
Dobre pomysły! Nie miałem pojęcia, że ​​dc pozwoli mi używać Aliterału, gdy jest ustawiony na dane dziesiętne. Dziękuję @brhfl!
Sophia Lechner,
1
@SophiaLechner Ta sztuczka działa dla wszystkich baz danych: codegolf.stackexchange.com/a/77728/11259
Digital Trauma
6

J , 5 bajtów

-3 bajty dzięki Cole!

10|^/

Wypróbuj online!

Galen Iwanow
źródło
Nie 10|^/działa?
cole
@cole Oczywiście to działa, dzięki!
Galen Iwanow
1
Wreszcie wyzwanie, w którym J pokonuje Jelly!
Jonasz
6

05AB1E , 4 bajty

.«mθ

Wypróbuj online!

Wyjaśnienie

.«     # fold
  m    # power
   θ   # take the last digit
Emigna
źródło
1
O ile mi wiadomo, w językach opartych na stos może przyjmować wejście jest obecny na stosie zamiast standardowego wejścia lub alternatyw, więc coś jak to powinno działać przez 4 bajty (alternatywnie, wystarczy umieścić Ew nagłówku).
Pan Xcoder,
Odpowiedni Meta .
Pan Xcoder,
1
Naprawiłem ten problem w ostatnim zatwierdzeniu do przyszłego użytku.
Adnan
@ Mr.Xcoder: Racja! Powinienem to pamiętać. Tak rzadko trzeba to robić z niejawnym wkładem. Dzięki :)
Emigna,
@ Mr.Xcoder Uh, nie jestem pewien, czy to właśnie tak naprawdę oznacza meta. Co to jest „funkcja” w 05AB1E? Myślę, że powinien to być po prostu ciąg, ponieważ można go przypisać do zmiennej i można go ewaluować .V. .«mθwygląda bardziej jak fragment kodu, ponieważ sam w sobie nie można przypisać go do zmiennej do późniejszego ponownego użycia. Cóż, Adnan naprawił teraz problem, ale eh.
Erik the Outgolfer
5

Pure Bash (tylko wbudowane - bez zewnętrznych narzędzi), 21

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

Dane wejściowe są podawane w wierszu poleceń jako lista oddzielona przecinkami.

Liczby całkowite Bash podlegają normalnym limitom liczb całkowitych ze znakiem dla wersji 64- i 32-bitowych.

Wypróbuj online!

Cyfrowa trauma
źródło
2
^jest bitowym XOR i dlatego wyjdziesz 5z przypadku testowego zamiast prawidłowego 1. Musisz dodać bajt, aby przełączyć się na**
Sophia Lechner,
@SophiaLechner Tak - oczywiście - dobry połów! Nie jestem pewien, jak to się ^wkradło - miałem **w poprzednich wersjach mojego cyklu deweloperskiego.
Cyfrowa trauma,
4

Python 2 i Python 3 , 30 bajtów

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

Wypróbuj online!

NOczekuje się, że dane wejściowe będą iterowalnymi obiektami nad ciągami znaków reprezentującymi literały liczbowe .

David Foerster
źródło
4

Rubin, 41 47 bajtów

Zwiększenie rozmiaru ze względu na obsługę dowolnych 0 w tablicy wejściowej, co wymaga dodatkowej uwagi. Dziękirewritten

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

Zostało to rozwiązane, jak sądzę, pierwotne zamierzone źródło, tj. Dla bardzo dużych potęgowań, które nie będą pasować do natywnych liczb całkowitych języka - ograniczenie polega na tym, że tablica będzie sumować 2**32-1, a nie że obliczenia przejściowe również są gwarantowane. Wydaje się, że to właśnie stanowi wyzwanie dla Code Wars. Chociaż natywne liczby całkowite Ruby mogą być dość duże, nie mogą sobie poradzić z poniższym przykładem przetworzonym naiwnie za pomocą% 10 na końcu

Na przykład

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

Wynik: 9

Neil Slater
źródło
Imponujący. Wydając 4 więcej bajtów, można też poradzić sobie ze znacznie wyższych wież zamienić n**(t%4+4)ze n**((t-1)%4+1)tak masz n**1zamiast n**5itp Kudos do obserwacji, że na każdym etapie 4 byłby dobry cykl.
przepisany
1
Występuje problem, jeśli sekwencja ma 0
przepisany
@rewritten: Dobre miejsce! Będę musiał o tym pomyśleć. Teoretycznie sekwencję należy zmusić do zakończenia 2 kroków przed pierwszym zerem.
Neil Slater,
Rzeczywiście, ale będzie to wymagało znacznie więcej kodu, dokładnie 6 dodatkowych bajtów: n<2?n:wcześniej n**.
przepisany
3

C # (.NET Core) , 84 bajtów

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

Wypróbuj online!

  • -7 bajtów dzięki @raznagul
digEmAll
źródło
Możesz zapisać niektóre bajty, usuwając nawiasy wokół ai łącząc warunek pętli z decrement ( for(var i=a.Lengt-1;i-->0;)). Ale using-statement musi być uwzględniony w liczbie bajtów.
raznagul
@raznagul: przepraszam, jestem całkiem nowy w golfie w C #, czy teraz jest już w porządku?
digEmAll
Nie ma problemu. Tak, teraz już dobrze.
raznagul
1
Możesz zapisać jeszcze 3 bajty, używając nowej zmiennej do przechowywania wyniku i usuwania większości dostępu do indeksu do tablicy: Wypróbuj online!
raznagul
@raznagul: świetnie!
digEmAll
3

C (gcc) , 56

  • Zaoszczędź 4 bajty dzięki @JonathanFrech

Funkcja rekurencyjna r()wywoływana z makra f- obowiązują normalne limity stosu.

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

Dane wejściowe podane jako tablica int zakończona zerem. Zakłada się, że żaden z x n nie jest równy zero.

Wypróbuj online!

Cyfrowa trauma
źródło
2
) r(-> )r(.
Jonathan Frech,
1
Ponadto, jeśli chcesz korzystać z UB, można golf r(int*n){return powdo R;r(int*n){R=pow.
Jonathan Frech,
3

Japt -h , 7 bajtów

OvUqp)ì

Wypróbuj online!

Wyjaśnienie:

OvUqp)ì
Ov   )    // Japt eval:
   q      //   Join
  U       //   Input with
    p     //   Power method
      ì   // Split into an array of numbers
-h        // Return the last number
Oliver
źródło
Dziwne, to by mi nie pasowało.
Kudłaty
6 bajtów
Shaggy
@Shaggy : P
Oliver
Ach, na miłość boską! : \ To się dzieje coraz częściej!
Kudłaty
3

Japt -h , 7 6 bajtów

Jeśli dane wejściowe można pobrać w odwrotnej kolejności, pierwszy znak można usunąć.

Ograniczony do 2**53-1.

Ôr!p ì

Spróbuj


Wyjaśnienie

Ô          :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
Kudłaty
źródło
Otrzymałem dokładnie tę samą odpowiedź bez flagi, więc na razie wygląda to na optymalny sposób.
Nit
@Nit: dopóki nie zostanie potwierdzone, możemy pobierać dane w odwrotnej kolejności :)
Kudłaty,
@Oliver Tak, ale nadal używasz flagi. Osobiście uważam, że liczba bajtów bez flag jest najdokładniejszym wynikiem punktacji.
Nit,
@Nit Czy flaga nie powinna dodawać 3 bajtów według meta konsensusu?
LegionMammal978
@ LegionMammal978, już nie .
Kudłaty
2

Excel VBA, 60 bajtów

Anonimowa funkcja bezpośredniego okna VBE, która pobiera dane wejściowe z zakresu [A1:XFD1]

s=1:For i=-[Count(1:1)]To-1:s=Cells(1,-i)^s:Next:?Right(s,1)
Taylor Scott
źródło
2

CJam , 14 bajtów

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

Powinien działać dla każdego wejścia, ponieważ CJam nie jest ograniczony do 64-bitowych liczb całkowitych

Wypróbuj online!

maxb
źródło
2

Python 3 , 55 bajtów

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

starsza wersja

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

PieCot
źródło
Czy to nie musi być p=lambda...prawda? Python nie radzi sobie z rekurencyjnymi anonimowymi lambdami, więc jeśli chcesz nazwać swoją funkcję, musi ona być częścią twojego rozwiązania, a nazywanie wlicza się do liczby bajtów dla wyzwań związanych z golfem.
mypetlion
2

Brain-Flak , 161 bajtów

Obejmuje +1 dla -r

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

Wypróbuj online!

Przykład [3, 4, 2]trwa dłużej niż 60 sekund, więc wykorzystuje łącze TIO [4, 3, 2].

-rMoże zostać usunięty, jeśli wejściowy może być wykonane w odwrotnej kolejności licząc od 160 bajtów.

# 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
źródło
2

Z80Golf , 36 bajtów

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

Wypróbuj online!

Uprząż testowa do pomiaru siły brutalnej

Pobiera dane wejściowe jako surowe bajty. Ograniczone do 2 ** 8-1.

Wyjaśnienie

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
źródło