Son basamak büyük sayı


12

Belirli bir sayı listesi için ın son basamağını bulun Örnek: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   

Çünkü .3(42)=316=43046721

Çünkü .4(32)=49=262144

Çünkü .4(31)=43=64

Çünkü .5(32)=59=1953125

Kurallar:

Bu kod golf, bu yüzden en az bayt ile cevap kazanır.

Dilinizde tamsayı boyutu için sınırlar varsa (ör. ) n, toplamın tamsayıya sığacak kadar küçük olacaktır.2321

Giriş herhangi bir makul formda olabilir (stdin, dosya, komut satırı parametresi, tamsayı, dize, vb.).

Çıktı herhangi bir makul formda olabilir (stdout, dosya, sayıyı gösteren grafik kullanıcı öğesi, vb.).

Kod savaşlarında gördüm.


2
Bir sorum var: Mesajınızda sadece numbers hakkında konuşuyorsunuz . Sadece pozitif tamsayıları mı kastediyorsunuz? Bu nasıl yorumlandığını hissediyorum.
Jonathan Frech

1
Girdiyi tersine çevirmek makul midir? Giriş sıfır olabilir mi?
NieDzejkob

1
Ben düşünüyorum böylece o başarısız olması mod gerçek toplamını hesaplamak rutinleri sınırı terimlerin toplamına olmak için size niyetinde ve. Örneğin, giriş [999999,213412499,34532599,4125159,53539,54256439,353259,4314319,5325329,1242149,142219,1243219,14149,1242149,124419,999999999]geçerli ve sonuç olmalıdır 1Eğer öyleyse, bunu çözmeyen cevapları oyladığınız için ipucunun daha açık hale getirilmesi gerekir (ipucu - moddöngünün içini hareket ettirin ). Belki bunu açıklığa kavuşturan bazı örnekler ekleyin.
Neil Slater

1
Aslında benim örneğimin sonucu 9. Bunu uygulamak için gereken rakam azaltma şeması, bu sorunun elde ettiği gerçek cevaplardan çok daha ilginçtir.
Neil Slater

2
Sevgili OP, daha fazla test vakasına ihtiyacımız var.
NieDzejkob

Yanıtlar:


15

JavaScript (ES7), 22 bayt

sınırlıdır .2531

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

Çevrimiçi deneyin!


2
Dünyada ne var, bu neden işe yarıyor ?!
Caleb Jay

@ komali_2: **JavaScript'in üstelleştirme operatörüdür. Gerisi oldukça basit.
Shaggy

2
@ komali_2 a.join`**` eşdeğerdir a.join(['**'])ve ['**']zorlanır edilir '**'göre joinyöntem.
Arnauld

1
OP'nin sınırın değerlerin toplamı üzerinde olmasını istediğini düşünüyorum, bu durumda bu durum ortaya çıkan sorunları çözmez.
Neil Slater

1
@AJParaday sonunda% 10. Herhangi bir sayıyı 10'a böldüğünüzde, geri kalan kısım (modül) her zaman son rakam n % 10olacaktır , bu yüzden son basamağını döndürecektirn
Skidsdev

13

R , 25 bayt

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

Çevrimiçi deneyin!


İnsanların bu cevapla ilgili neleri çok sevdiğinden emin değilim.
ngm

1
Şahsen Reducekullanıldığını görmek hoşuma gidiyor .
JayCe


9

HP 49G RPL, 36,5 bayt

APPROX modunda çalıştırın (ancak programa EXACT modunda girin). İlk öğe, tamsayı veya gerçekler olarak yığının en derinindeki yığına girer.

WHILE DEPTH 1 - REPEAT ^ END 10 MOD

Sophia'nın çözümünde olduğu gibi bir değer kalana kadar yığın üzerinde açıkça üstlenir, daha sonra son basamağı almak için mod 10 alır.

Hesaplama için APPROX kullanmamın nedeni, 0.0 ^ 0.0 = 1 (her ikisi de real olduğunda), ancak 0 ^ 0 =? (her ikisi de tamsayı olduğunda). APPROX tüm tamsayıları realere zorlar, böylece girdi ikisiyle de iyi olur. Ancak, 10 (tamsayı) basamaklı depolanır ve 6.5 bayt, ancak 10.0 (gerçek) tam gerçek sayı olarak depolanır ve 10.5 bayt olduğundan, programa girmek için EXACT kullanın. Ayrıca 10 bayt ek yükü olan ekstra bir program nesnesi sunduğu için RPL indirgeme (STREAM adı verilir) kullanmaktan kaçının. Zaten bir tane var ve başka bir tane istemiyorum.

HP 49G gerçek (12 ondalık basamak) hassasiyetiyle sınırlıdır

Boş listeden sonra -10 bayt -> 1 gereksinimi kaldırıldı.

Yığına girdi alarak -2 bayt.


1
Hey, bayt hesabının nasıl hesaplandığını açıklayabilir misiniz? Sadece bu dilin nasıl nibble kullandığını merak ediyorum .
JungHwan Min

1
@JungHwanMin HP 49G, hesap makinesi olduğu için 4 bit işlemci ve BCD aritmetiği kullanır. Dahili olarak çoğu komut, yerden tasarruf etmek için temsil ettikleri rutinlere 2,5 baytlık işaretçiler olarak dönüştürülür. Küçük sayılar da (0-9) bu şekilde dönüştürülür.
Jason

1
Satürn işlemci aslında çalışmak için oldukça eğlenceli. Bir uzun zaman önce yazdım BurgerTime bu portu HP 48G (X) için (montaj olarak). Daha sonra 49G'ye taşındı . Güzel anılar!
Arnauld

7

dc , 17 15 bayt

1[^z1<M]dsMxzA%

Çevrimiçi deneyin!

Yığından girdi alır, yığına çıkar. Çok basit uygulama - yığın üzerinde yalnızca bir değer ve son basamak için mod kalıncaya kadar üssel olur.

İki bayt tasarrufu için brhfl'e teşekkürler!


2
Sen değiştirerek golf bir bayt can 10%için A%- ve iki kez yığın derinliğini kontrol etmiyor tarafından bir daha bayt sadece koyun 1: n ^ 1 == n beri çalıştırmadan önce yığının tepesine1[^z1<M]dsMxA%
brhfl

İyi fikirler! Ben Aondalık girdi olarak ayarlanırken dc değişmez olarak kullanmama izin verecek hiçbir fikrim yoktu . Teşekkürler @brhfl!
Sophia Lechner

1
@SophiaLechner Bu hile tüm giriş üsleri için geçerlidir: codegolf.stackexchange.com/a/77728/11259
Digital Trauma


6

05AB1E , 4 bayt

.«mθ

Çevrimiçi deneyin!

açıklama

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

1
Bildiğim kadarıyla gibi, yığın tabanlı diller gibi bir şey bu yüzden giriş yerine STDIN veya alternatiflerin yığını bulunduğundan varsayabiliriz bu 4 bayt (alternatif olarak sadece bir yer için çalışmalı Ebaşlığında).
Bay Xcoder


1
Bu sorunu ileride kullanmak üzere en son taahhütte çözdüm .
Adnan

@ Mr.Xcoder: Doğru! Bunu hatırlamalıydım. Öyleyse nadiren örtülü girdi ile ihtiyaç duyulmaktadır. Teşekkürler :)
Emigna

@ Mr.Xcoder Uh, meta'nın gerçekten ne anlama geldiğinden emin değilim. 05AB1E'de "işlev" nedir? Bir değişkene atayabileceğiniz ve değerlendirilebildiğinden, bunun sadece bir dize olması gerektiğini düşünüyorum .V. .«mθdaha çok bir snippet'e benziyor, çünkü daha sonra yeniden kullanmak için tek başına bir değişkene atayamazsınız. Adnan şimdi sorunu çözdü, ama ha.
Outgolfer Erik

5

Pure Bash (yalnızca yerleşikler - harici yardımcı programlar yok), 21

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

Giriş, komut satırında virgülle ayrılmış bir liste olarak verilir.

Bash tamsayıları 64 ve 32 bit sürümleri için normal imzalı tamsayı sınırlarına tabidir.

Çevrimiçi deneyin!


2
^bitwise XOR, bu yüzden 5doğru yerine test senaryosundan çıkıyorsunuz 1. Geçiş yapmak için bir bayt eklemeniz gerekecek**
Sophia Lechner

@SophiaLechner Evet - elbette - iyi yakalama! Bu nasıl ^sızdı emin değilim - **dev döngüsü önceki iterasyon vardı .
Dijital Travma



4

Yakut, 41 47 bayt

Giriş dizisinde herhangi bir 0'ın işlenmesi nedeniyle boyut artışı, bu da ekstra dikkat gerektirir. Sayesinderewritten

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

Bu, orijinal kaynağın, dil yerel tamsayılarına sığmayacak çok büyük üsler için tasarlandığına inandığım için çözüldü - kısıtlama, 2**32-1ara hesaplamaların da sığacağı garanti edilmediğinden dizinin toplamıdır . Aslında bu Kod Savaşları'ndaki zorluğun noktası gibi görünüyor. Ruby'nin yerel tam sayıları oldukça büyüyebilse de, sonunda% 10 ile saf olarak işlenen aşağıdaki örnekle baş edemezler

Örneğin

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

Çıktı: 9


Etkileyici. 4 daha bayt ayırırsanız, ayrıca çok daha yüksek kuleleri ile başa çıkabilir: yerine n**(t%4+4)ile n**((t-1)%4+1)getirecek şekilde n**1yerine n**5herhangi bir aşamasında 4 iyi bir döngü olacağı gözlem için vs. teşekkürler.
yeniden yazıldı


@rewritten: İyi nokta! Bunu düşünmem gerekecek. Teoride, dizi ilk sıfırdan önce 2 adımı sonlandırmaya zorlanmalıdır.
Neil Slater

Gerçekten de, bu çok daha fazla kod, tam olarak 6 bayt daha gerektirir: n<2?n:önce n**.
yeniden yazıldı




3

C # (.NET Core) , 84 bayt

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

Çevrimiçi deneyin!

  • @Raznagul sayesinde -7 bayt

Etrafındaki parantezleri çıkararak ave döngü koşulunu decrement ( for(var i=a.Lengt-1;i-->0;)) ile birleştirerek bazı baytlar kaydedebilirsiniz . Ancak - usingdurum bayt sayısına dahil edilmelidir.
raznagul

@raznagul: Üzgünüm, C # kod-golf için oldukça yeni, şimdi iyi mi?
digEmTüm

Sorun değil. Evet, şimdi iyi.
raznagul

1
Sonucu tutmak ve diziye dizin erişiminin çoğunu kaldırmak için yeni bir değişken kullanarak 3 bayt daha kaydedebilirsiniz: Çevrimiçi deneyin!
raznagul

@raznagul: harika!
digEmTüm

3

C (gcc) , 56

  • @JonathanFrech sayesinde 4 bayt kaydedildi

Makrodan r()çağrılan özyinelemeli işlev f- normal yığın sınırları geçerlidir.

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

Sıfır sonlu int dizisi olarak verilen girdi. Bu, x n'den hiçbirinin sıfır olmadığı varsayımı altındadır .

Çevrimiçi deneyin!


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

1
Ayrıca, UB kullanmak istiyorsanız, golf r(int*n){return powiçin olabilir R;r(int*n){R=pow.
Jonathan Frech



3

Japt -h , 7 6 bayt

Giriş ters sırada alınabiliyorsa, ilk karakter kaldırılabilir.

İle sınırlıdır 2**53-1.

Ôr!p ì

Dene


açıklama

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

Aynı cevabı bayraksız aldım, bu yüzden şimdilik bu en uygun yol gibi görünüyor.
Nit

@Nit: teyit edilene kadar tersine girdi alabilir :)
Shaggy

@Oliver Evet, ama hala bir bayrak kullanıyorsun. Şahsen bayraksız bayt sayısının en doğru skorlama sonucu olduğunu düşünüyorum.
Nit

@Nit Bir bayrak meta konsensüsle 3 bayt eklememeli mi?
LegionMammal978

@ LegionMammal978, artık değil .
Shaggy



2

Excel VBA, 60 bayt

Aralıktan girdi alan anonim bir VBE anında pencere işlevi [A1:XFD1]

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



2

Python 3 , 55 bayt

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

eski versiyonlar

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


Bunun olması gerekmez p=lambda...mi? Python, özyinelemeli anonim lambdalarla başa çıkamaz, bu nedenle işlevinizin adlandırılması gerekiyorsa, çözümünüzün bir parçası olması gerekir ve adlandırma, kod golf zorlukları için bayt sayınıza doğru sayar.
mypetlion


2

Brain-Flak , 161 bayt

İçin +1 içerir -r

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

Çevrimiçi deneyin!

Örnek [3, 4, 2]60 saniyeden uzun sürüyor, bu nedenle TIO bağlantısı kullanılıyor [4, 3, 2].

-rGiriş 160 bir bayt sayısı için tersten alınabilir halinde çıkarılabilir.

# 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 bayt

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

Çevrimiçi deneyin!

Brute-force test koşum takımı

Ham bayt olarak girdi alır. 2 ** 8-1 ile sınırlıdır.

açıklama

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.