Digit angka besar terakhir


12

Untuk daftar nomor tertentu temukan digit terakhir dari Contoh: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   

Karena .3(42)=316=43046721

Karena .4(32)=49=262144

Karena .4(31)=43=64

Karena .5(32)=59=1953125

Aturan:

Ini adalah kode golf, jadi jawabannya dengan byte paling sedikit menang.

Jika bahasa Anda memiliki batasan ukuran bilangan bulat (mis. ) n akan cukup kecil sehingga jumlahnya akan cocok dengan bilangan bulat.2321

Input dapat berupa bentuk yang wajar (stdin, file, parameter baris perintah, integer, string, dll).

Output dapat berupa bentuk yang masuk akal (stdout, file, elemen pengguna grafis yang menampilkan nomor, dll).

Melihat perang kode.


2
Satu pertanyaan yang saya miliki: Dalam posting Anda, Anda hanya berbicara tentang numbers. Apakah maksud Anda bilangan bulat positif secara eksklusif? Itulah yang saya rasakan bagaimana itu ditafsirkan.
Jonathan Frech

1
Apakah mengambil input secara terbalik masuk akal? Bisakah inputnya nol?
NieDzejkob

1
Saya pikir Anda berniat untuk membatasi jumlah persyaratan, dan dengan demikian rutinitas yang menghitung jumlah aktual maka mod seharusnya gagal. Misalnya input [999999,213412499,34532599,4125159,53539,54256439,353259,4314319,5325329,1242149,142219,1243219,14149,1242149,124419,999999999]valid dan hasilnya harus 1Jika demikian, ini perlu dibuat lebih jelas dalam pertanyaan karena Anda telah memutakhirkan jawaban yang tidak menyelesaikan ini (petunjuk - pindahkan bagian moddalam loop). Mungkin menambahkan beberapa contoh yang membuat ini jelas.
Neil Slater

1
Sebenarnya hasil dari contoh saya adalah 9. Skema pengurangan angka yang diperlukan untuk mengimplementasikan ini jauh lebih menarik daripada jawaban aktual yang telah dikumpulkan masalah ini.
Neil Slater

2
OP yang terhormat, kami membutuhkan lebih banyak kasus uji.
NieDzejkob

Jawaban:


15

JavaScript (ES7), 22 byte

Terbatas untuk .2531

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

Cobalah online!


2
Apa-apaan, mengapa ini bekerja ?!
Caleb Jay

@ komali_2: **adalah operator eksponensial JavaScript. Sisanya cukup mudah.
Shaggy

2
@ komali_2 a.join`**` sama dengan a.join(['**'])dan ['**']dipaksa '**'oleh joinmetode.
Arnauld

1
Saya pikir OP bermaksud bahwa batasannya adalah pada jumlah nilai, dalam hal ini ini tidak menyelesaikan masalah seperti yang diajukan.
Neil Slater

1
@ AJFaraday% 10 di akhir. Saat membagi angka dengan 10, sisanya (modulus) akan selalu menjadi digit terakhir, sehingga n % 10akan mengembalikan digit terakhirn
Skidsdev



9

HP 49G RPL, 36,5 byte

Jalankan dalam mode APPROX (tetapi masukkan program dalam mode EXACT). Mengambil input pada stack dengan elemen pertama terdalam di stack, sebagai integer atau real.

WHILE DEPTH 1 - REPEAT ^ END 10 MOD

Ini langsung eksponensial pada stack seperti dalam solusi Sophia sampai ada satu nilai yang tersisa, lalu bawa mod 10 untuk mendapatkan digit terakhir.

Alasan saya menggunakan APPROX untuk perhitungan adalah karena 0,0 ^ 0,0 = 1 (ketika keduanya adalah real), tetapi 0 ^ 0 =? (ketika keduanya bilangan bulat). APPROX memaksa semua bilangan bulat ke real, jadi inputnya boleh saja. Namun, saya menggunakan EXACT untuk masuk ke program karena 10 (integer) disimpan digit-demi-digit, dan 6,5 byte, tetapi 10,0 (nyata) disimpan sebagai bilangan real penuh, dan 10,5 byte. Saya juga menghindari penggunaan pengurangan RPL (disebut STREAM) karena memperkenalkan objek program tambahan, yaitu 10 byte overhead. Saya sudah punya satu dan tidak mau yang lain.

Terbatas pada presisi HP 49G nyata (12 angka desimal)

-10 byte setelah daftar kosong -> 1 persyaratan telah dihapus.

-2 byte dengan mengambil input pada stack.


1
Hei, bisakah Anda menjelaskan bagaimana bytecount dihitung? Hanya ingin tahu bagaimana bahasa itu menggunakan camilan .
JungHwan Min

1
@JungHwanMin HP 49G menggunakan prosesor 4-bit dan BCD aritmatika, karena ini adalah kalkulator. Secara internal sebagian besar perintah diubah menjadi pointer 2,5 byte ke rutinitas yang mereka wakili, untuk menghemat ruang. Angka kecil (0-9) juga ditransformasikan dengan cara ini.
Jason

1
Prosesor Saturn sebenarnya cukup menyenangkan untuk dikerjakan. Sebuah panjang waktu lalu, saya menulis port ini dari Burgertime (dalam perakitan) untuk HP 48g (X). Itu kemudian diangkut ke 49G . Kenangan yang indah!
Arnauld

7

dc , 17 15 byte

1[^z1<M]dsMxzA%

Cobalah online!

Mengambil input dari stack, output ke stack. Implementasi yang sangat mudah - eksponensial hingga hanya satu nilai yang tersisa di stack dan mod untuk digit terakhir.

Terima kasih kepada brhfl untuk menghemat dua byte!


2
Anda dapat golf satu byte dengan mengubah 10%ke A%, dan satu lagi byte dengan tidak memeriksa kedalaman tumpukan dua kali - hanya menempatkan 1di atas tumpukan sebelum mengeksekusi sejak ^ 1 == n n:1[^z1<M]dsMxA%
brhfl

Ide bagus! Saya tidak tahu dc akan membiarkan saya menggunakan Asebagai literal sementara diatur ke input desimal. @ Brhfl terima kasih!
Sophia Lechner

1
@SophiaLechner Trik ini berfungsi untuk semua basis input: codegolf.stackexchange.com/a/77728/11259
Digital Trauma


6

05AB1E , 4 byte

.«mθ

Cobalah online!

Penjelasan

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

1
Sejauh yang saya ketahui, bahasa berbasis stack dapat mengasumsikan input hadir pada stack alih-alih STDIN atau alternatif, jadi sesuatu seperti ini seharusnya bekerja untuk 4 byte (atau, cukup tempatkan Edi header).
Tn. Xcoder


1
Saya telah memperbaiki masalah ini dalam komit terbaru untuk penggunaan di masa mendatang.
Adnan

@ Mr.Xcoder: Benar! Seharusnya aku ingat itu. Jadi jarang perlu meskipun dengan input implisit. Terima kasih :)
Emigna

@ Mr.Xcoder Eh, saya tidak yakin apakah itu yang dimaksud dengan meta. Apa itu "fungsi" di 05AB1E? Saya pikir itu harus berupa string, karena Anda dapat menetapkannya ke variabel, dan dapat dievaluasi dengan .V. .«mθlebih mirip potongan, karena, dengan sendirinya, Anda tidak dapat menetapkannya ke variabel untuk digunakan kembali nanti. Nah, Adnan sekarang memperbaiki masalahnya, tapi eh.
Erik the Outgolfer

5

Pure Bash (hanya builtin - tidak ada utilitas eksternal), 21

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

Input diberikan pada baris perintah sebagai daftar yang dipisahkan koma.

Bash integer tunduk pada batas bilangan bulat yang ditandatangani normal untuk versi 64-dan 32-bit.

Cobalah online!


2
^adalah XOR bitwise, itulah sebabnya Anda 5keluar dari kasus uji alih-alih yang benar 1. Anda harus menambahkan byte untuk beralih ke**
Sophia Lechner

@SophiaLechner Ya - tentu saja - tangkapan yang bagus! Tidak yakin bagaimana itu ^merangkak masuk - saya punya **di iterasi sebelumnya siklus dev saya.
Trauma Digital



4

Ruby, 41 47 byte

Peningkatan ukuran karena penanganan 0 dalam array input, yang perlu pertimbangan ekstra. Terimakasih untukrewritten

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

Ini diselesaikan karena saya percaya sumber asli yang dimaksudkan, yaitu untuk eksponensial yang sangat besar yang tidak akan cocok dengan bilangan bulat asli bahasa - batasannya adalah array akan dijumlahkan 2**32-1, bukan karena perhitungan sementara juga dijamin sesuai. Bahkan itu tampaknya akan menjadi titik tantangan pada Perang Kode Meskipun bilangan bulat asli Ruby bisa menjadi sangat besar, mereka tidak dapat mengatasi contoh di bawah ini yang diproses secara naif dengan% 10 di akhir

Misalnya

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

Keluaran: 9


Impresif. Dengan menghabiskan 4 byte lebih banyak, Anda juga dapat mengatasi menara yang jauh lebih tinggi: ganti n**(t%4+4)dengan yang n**((t-1)%4+1)Anda dapatkan n**1alih-alih n**5dll. Kudos untuk pengamatan bahwa pada setiap tahap 4 akan menjadi siklus yang baik.
ditulis ulang

1
Ada masalah jika urutannya memiliki 0s
ditulis ulang

@rewritten: Tempat yang bagus! Saya harus memikirkannya. Secara teori urutan harus dipaksa untuk menghentikan 2 langkah sebelum nol pertama.
Neil Slater

Memang, tetapi itu akan membutuhkan lebih banyak kode, tepatnya 6 byte lebih: n<2?n:sebelumnya n**.
ditulis ulang




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;}

Cobalah online!

  • -7 byte terima kasih kepada @raznagul

Anda dapat menyimpan beberapa byte dengan menghapus braket di sekitarnya adan dengan menggabungkan kondisi loop dengan decrement ( for(var i=a.Lengt-1;i-->0;)). Tetapi - usingpernyataan harus dimasukkan dalam hitungan byte.
raznagul

@raznagul: maaf, saya cukup baru untuk kode-golf di C #, apakah tidak apa-apa sekarang?
digEmAll

Tidak masalah. Ya ini baik-baik saja sekarang.
raznagul

1
Anda dapat menyimpan 3 byte lebih banyak dengan menggunakan variabel baru untuk menahan hasilnya dan menghapus sebagian besar akses indeks ke array: Coba online!
raznagul

@raznagul: bagus!
digEmAll

3

C (gcc) , 56

  • Disimpan 4 byte berkat @JonathanFrech

Fungsi rekursif r()dipanggil dari makro f- batas stack normal berlaku.

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

Input diberikan sebagai array int nol-dihentikan. Ini dengan asumsi bahwa tidak ada x n yang nol.

Cobalah online!


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

1
Juga, jika Anda ingin menggunakan UB, Anda bisa golf r(int*n){return powuntuk R;r(int*n){R=pow.
Jonathan Frech



3

Japt -h , 7 6 byte

Jika input dapat diambil dalam urutan terbalik maka karakter pertama dapat dihapus.

Terbatas untuk 2**53-1.

Ôr!p ì

Cobalah


Penjelasan

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

Saya mendapat jawaban yang sama persis tanpa bendera jadi ini sepertinya cara yang optimal untuk saat ini.
Nit

@Nit: sampai dikonfirmasi, kita dapat mengambil input secara terbalik :)
Shaggy

@ Lebih Ya, tetapi Anda masih menggunakan bendera. Secara pribadi saya pikir jumlah byte tanpa bendera adalah hasil penilaian yang paling akurat.
Nit

@Nit Bukankah seharusnya sebuah bendera menambahkan 3 byte oleh konsensus meta?
LegionMammal978

@ LegionMammal978, tidak lagi .
Shaggy



2

Excel VBA, 60 byte

Fungsi jendela langsung VBE anonim yang mengambil input dari jangkauan [A1:XFD1]

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



2

Python 3 , 55 byte

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

Versi yang lebih lama

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


Bukankah itu harus terjadi p=lambda...? Python tidak dapat menangani lambdas anonim rekursif, jadi jika Anda ingin fungsi Anda dinamai, itu harus menjadi bagian dari solusi Anda, dan penamaannya dihitung terhadap jumlah byte Anda untuk tantangan kode-golf.
mypetlion


2

Brain-Flak , 161 byte

Termasuk +1 untuk -r

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

Cobalah online!

Contohnya [3, 4, 2]membutuhkan waktu lebih dari 60 detik, sehingga tautan TIO digunakan [4, 3, 2].

The -rdapat dihapus jika input dapat diambil dalam urutan terbalik untuk menghitung byte dari 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

Cobalah online!

Harness uji brute-force

Mengambil input sebagai byte mentah. Terbatas untuk 2 ** 8-1.

Penjelasan

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.