Chữ số cuối số lớn


12

Cho một danh sách số đã cho tìm chữ số cuối cùng của x x x ... x n 3 2 1 Ví dụ:[x1,x2,x3,...,xn]x1x2x3xn

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

.3(42)=316=43046721

.4(32)=49=262144

.4(31)=43=64

.5(32)=59=1953125

Quy tắc:

Đây là mã golf, vì vậy câu trả lời có ít byte nhất sẽ thắng.

Nếu ngôn ngữ của bạn có giới hạn về kích thước số nguyên (ví dụ ) n sẽ đủ nhỏ để tổng sẽ khớp với số nguyên.2321

Đầu vào có thể là bất kỳ dạng hợp lý nào (stdin, tệp, tham số dòng lệnh, số nguyên, chuỗi, v.v.).

Đầu ra có thể là bất kỳ hình thức hợp lý nào (thiết bị xuất chuẩn, tệp, phần tử người dùng đồ họa hiển thị số, v.v.).

Cưa về cuộc chiến mã.


2
Một câu hỏi tôi có: Trong bài viết của bạn, bạn chỉ nói về numbers. Bạn có nghĩa là số nguyên tích cực độc quyền? Đó là tôi cảm thấy nó đã được giải thích như thế nào.
Jonathan Frech

1
Là lấy đầu vào ngược lại hợp lý? Đầu vào có thể bằng không?
NieDzejkob

1
Tôi nghĩ rằng bạn dự định giới hạn sẽ dựa trên tổng các điều khoản và do đó, các thói quen tính tổng tiền thực tế sau đó sửa đổi nên sẽ thất bại. Ví dụ: đầu vào [999999,213412499,34532599,4125159,53539,54256439,353259,4314319,5325329,1242149,142219,1243219,14149,1242149,124419,999999999]là hợp lệ và kết quả sẽ là 1Nếu vậy, điều này cần được làm rõ hơn trong câu hỏi vì bạn đã đưa ra các câu trả lời không giải quyết được điều này (gợi ý - di chuyển modbên trong vòng lặp). Có lẽ thêm một số ví dụ làm cho điều này rõ ràng.
Neil Slater

1
Thật ra kết quả từ ví dụ của tôi là 9. Lược đồ giảm chữ số cần thiết để thực hiện điều này thú vị hơn nhiều so với các câu trả lời thực tế mà vấn đề này đã thu được.
Neil Slater

2
OP thân mến, chúng tôi cần nhiều trường hợp thử nghiệm hơn.
NieDzejkob

Câu trả lời:


15

JavaScript (ES7), 22 byte

Giới hạn ở .2531

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

Hãy thử trực tuyến!


2
Cái quái gì, tại sao cái này hoạt động?!
Caleb Jay

@ komali_2: **là toán tử lũy thừa của JavaScript. Phần còn lại là khá đơn giản.
Shaggy

2
@ komali_2 a.join`**` tương đương a.join(['**'])['**']bị ép buộc '**'bởi joinphương thức.
Arnauld

1
Tôi nghĩ rằng OP dự định rằng giới hạn là trên tổng các giá trị, trong trường hợp này, điều này không giải quyết được các vấn đề như đã đặt ra.
Neil Slater

1
@AJFaraday% 10 ở cuối. Khi chia bất kỳ số nào cho 10, phần còn lại (mô đun) sẽ luôn là chữ số cuối cùng, do đó n % 10sẽ trả về chữ số cuối cùng củan
Skidsdev

13

R , 25 byte

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

Hãy thử trực tuyến!


Không chắc chắn những gì mọi người thích rất nhiều về câu trả lời này.
ngm

1
Cá nhân tôi muốn thấy Reduceđược sử dụng.
JayCe


9

HP 49G RPL, 36,5 byte

Chạy nó ở chế độ APPROX (nhưng nhập chương trình ở chế độ CHÍNH XÁC). Đưa đầu vào vào ngăn xếp với phần tử đầu tiên sâu nhất trong ngăn xếp, dưới dạng số nguyên hoặc số thực.

WHILE DEPTH 1 - REPEAT ^ END 10 MOD

Nó đơn giản lũy thừa theo cấp số nhân như trong giải pháp của Sophia cho đến khi còn một giá trị, sau đó lấy mod 10 để lấy chữ số cuối cùng.

Lý do tôi sử dụng APPROX để tính toán là vì 0,0 ^ 0,0 = 1 (khi cả hai đều là số thực), nhưng 0 ^ 0 =? (khi cả hai đều là số nguyên). APPROX ép buộc tất cả các số nguyên thành số thực, do đó, đầu vào cũng ổn với một trong hai. Tuy nhiên, tôi sử dụng EXACT để vào chương trình vì 10 (số nguyên) được lưu trữ theo từng chữ số và là 6,5 byte, nhưng 10.0 (thực) được lưu trữ dưới dạng một số thực đầy đủ và là 10,5 byte. Tôi cũng tránh sử dụng giảm RPL (được gọi là STREAM) vì nó giới thiệu một đối tượng chương trình bổ sung, có 10 byte trên không. Tôi đã có một cái và không muốn cái khác.

Giới hạn ở độ chính xác của HP 49G thực (12 chữ số thập phân)

-10 byte sau khi danh sách trống -> 1 yêu cầu đã bị xóa.

-2 byte bằng cách lấy đầu vào trên ngăn xếp.


1
Này, bạn có thể giải thích cách tính bằng cách tính không? Chỉ tò mò làm thế nào ngôn ngữ đó sử dụng nibble .
JungHwan Min

1
@JungHwanMin HP 49G sử dụng bộ xử lý 4 bit và số học BCD, vì đây là máy tính. Bên trong hầu hết các lệnh được chuyển đổi thành các con trỏ 2,5 byte theo các thói quen mà chúng đại diện, để tiết kiệm không gian. Số nhỏ (0-9) cũng được chuyển đổi theo cách này.
Jason

1
Bộ xử lý Saturn thực sự khá thú vị để làm việc. Một dài thời gian trước đây, tôi đã viết cổng này BurgerTime (trong lắp ráp) cho sản phẩm HP 48G (X). Sau đó nó đã được chuyển sang 49G . Những kỷ niệm đẹp!
Arnauld

7

dc , 17 15 byte

1[^z1<M]dsMxzA%

Hãy thử trực tuyến!

Lấy đầu vào từ ngăn xếp, đầu ra cho ngăn xếp. Việc thực hiện rất đơn giản - lũy thừa cho đến khi chỉ còn một giá trị trên ngăn xếp và mod cho chữ số cuối cùng.

Cảm ơn brhfl đã lưu hai byte!


2
Bạn có thể chơi một byte bằng cách thay đổi 10%thành A%và thêm một byte bằng cách không kiểm tra độ sâu của ngăn xếp hai lần - chỉ cần đặt một 1đỉnh trên ngăn xếp trước khi thực hiện kể từ n ^ 1 == n:1[^z1<M]dsMxA%
brhfl

Ý tưởng hay! Tôi không biết dc sẽ cho phép tôi sử dụng Anhư một chữ trong khi được đặt thành đầu vào thập phân. Cảm ơn bạn @brhfl!
Sophia Lechner

1
@SophiaLechner Thủ thuật này hoạt động cho tất cả các cơ sở đầu vào: codegolf.stackexchange.com/a/77728/11259
Chấn thương kỹ thuật số


6

05AB1E , 4 byte

.«mθ

Hãy thử trực tuyến!

Giải trình

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

1
Theo như tôi biết, các ngôn ngữ dựa trên ngăn xếp có thể giả sử đầu vào có mặt trên ngăn xếp thay vì STDIN hoặc các lựa chọn thay thế, vì vậy một cái gì đó như thế này sẽ hoạt động với 4 byte (thay vào đó, chỉ cần đặt Etrong tiêu đề).
Ông Xcoder


1
Tôi đã sửa vấn đề này trong cam kết mới nhất để sử dụng trong tương lai.
Ad Nam

@ Mr.Xcoder: Đúng vậy! Tôi nên nhớ điều đó. Vì vậy, hiếm khi cần mặc dù với đầu vào ngầm. Cảm ơn :)
Emigna

@ Mr.Xcoder Uh, tôi không chắc đó có phải ý nghĩa của meta không. "Chức năng" trong 05AB1E là gì? Tôi nghĩ nó chỉ đơn giản là một chuỗi, vì bạn có thể gán nó cho một biến và có thể được eval-ed với .V. .«mθtrông giống như một đoạn trích, vì, tự nó, bạn không thể gán nó cho một biến để sử dụng lại sau này. Chà, bây giờ Adnan đã sửa vấn đề, nhưng eh.
Erik the Outgolfer

5

Pure Bash (chỉ tích hợp - không có tiện ích bên ngoài), 21

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

Đầu vào được đưa ra trên dòng lệnh dưới dạng danh sách được phân tách bằng dấu phẩy.

Số nguyên Bash phải tuân theo giới hạn số nguyên được ký bình thường cho các phiên bản 64 và 32 bit.

Hãy thử trực tuyến!


2
^là XOR bitwise, đó là lý do tại sao bạn 5thoát ra khỏi trường hợp thử nghiệm thay vì chính xác 1. Bạn sẽ cần thêm một byte để chuyển sang**
Sophia Lechner

@SophiaLechner Có - tất nhiên - bắt tốt! Không chắc chắn làm thế nào mà nó ^len lỏi vào - tôi đã có **trong các lần lặp trước của chu kỳ dev của tôi.
Chấn thương kỹ thuật số



4

Ruby, 41 47 byte

Kích thước tăng do xử lý bất kỳ 0 nào trong mảng đầu vào, cần xem xét thêm. Nhờ vàorewritten

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

This is solved as I believe the original source intended, i.e. for very large exponentiations that will not fit into language native integers - the restriction is that the array will sum into 2**32-1, not that the interim calculations are also guaranteed to fit. In fact that would seem to be the point of the challenge on Code Wars. Although Ruby's native integers can get pretty big, they cannot cope with the example below processed naively with a %10 at the end

E.g.

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

Output: 9


Impressive. By spending a 4 more bytes, you can also cope with much higher towers: replace n**(t%4+4) with n**((t-1)%4+1) so you get n**1 instead of n**5 etc. Kudos for the observation that at any stage 4 would be a good cycle.
rewritten

1
There is an issue if the sequence has 0s
rewritten

@rewritten: Good spot! I'll have to think about that. In theory the sequence should be forced to terminate 2 steps before the first zero.
Neil Slater

Indeed, but that will require a lot more code, exactly 6 more bytes: n<2?n: before n**.
rewritten




3

C# (.NET Core), 84 bytes

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

Try it online!

  • -7 bytes thanks to @raznagul

You can save some bytes by removing the brackers around a and by combining the loop condition with the decrement (for(var i=a.Lengt-1;i-->0;)). But using-statement must be included in he byte count.
raznagul

@raznagul: sorry, I'm pretty new to code-golf in C#, is it ok now ?
digEmAll

No problem. Yes this is fine now.
raznagul

1
You can save 3 more bytes by using a new variable to hold the result and remove most of the index access to the array: Try it online!
raznagul

@raznagul: great !
digEmAll

3

C (gcc), 56

  • Saved 4 bytes thanks to @JonathanFrech

Recursive function r() called from macro f - normal stack limits apply.

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

Input given as a zero-terminated int array. This is under the assumption that none of the xn are zero.

Try it online!


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

1
Also, if you want to use UB, you could golf r(int*n){return pow to R;r(int*n){R=pow.
Jonathan Frech


3

Japt -h, 7 bytes

OvUqp)ì

Try it online!

Explanation:

OvUqp)ì
Ov   )    // Japt eval:
   q      //   Join
  U       //   Input with
    p     //   Power method
      ì   // Split into an array of numbers
-h        // Return the last number

Weird, that wouldn't work for me.
Shaggy


@Shaggy :P
Oliver

Ah, for Jaysis' sake! :\ That's happening more & more often!
Shaggy

3

Japt -h, 7 6 bytes

If input can be taken in reverse order then the first character can be removed.

Limited to 2**53-1.

Ôr!p ì

Try it


Explanation

Ô          :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

I got the exact same answer without the flag so this looks like the optimal way for now.
Nit

@Nit: until it's confirmed we can take input in reverse :)
Shaggy

@Oliver Yeah, but you're still using a flag. Personally I think the byte count without flags is the most accurate scoring result.
Nit

@Nit Shouldn't a flag add 3 bytes by meta consensus?
LegionMammal978

@LegionMammal978, not any more.
Shaggy



2

Excel VBA, 60 bytes

An anonymous VBE immediate window function that takes input from range [A1:XFD1]

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



2

Python 3, 55 bytes

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

Older versions

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


Wouldn't that have to be p=lambda...? Python can't handle recursive anonymous lambdas, so if you need your function to be named, it needs to be part of your solution, and the naming counts towards your byte count for code-golf challenges.
mypetlion


2

Brain-Flak, 161 bytes

Bao gồm +1 cho -r

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

Hãy thử trực tuyến!

Ví dụ [3, 4, 2]này dài hơn 60 giây, vì vậy liên kết TIO sử dụng[4, 3, 2].

-rthể loại bỏ nếu đầu vào có thể được thực hiện theo thứ tự ngược lại cho số byte là 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

Hãy thử trực tuyến!

Khai thác kiểm tra lực lượng Brute

Lấy đầu vào dưới dạng byte thô. Giới hạn ở 2 ** 8-1.

Giải trình

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.