마지막 자리수


12

주어진 숫자 목록에서 의 마지막 숫자를 찾으십시오 예 :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   

왜냐하면 .3(42)=316=43046721

때문에 .4(32)=49=262144

때문에 .4(31)=43=64

때문에 .5(32)=59=1953125

규칙 :

이것은 코드 골프이므로 가장 적은 바이트를 가진 답이 이깁니다.

언어에 정수 크기에 제한이있는 경우 (예 : ) n은 합계가 정수에 맞을만큼 작습니다.2321

입력은 합리적인 형식 (stdin, file, command line parameter, integer, string 등)이 될 수 있습니다.

출력은 합리적인 형식 (stdout, 파일, 숫자를 표시하는 그래픽 사용자 요소 등) 일 수 있습니다.

코드 전쟁을 보았다.


2
내가 가진 한 가지 질문 : 당신의 게시물에서 당신은 numbers에 대해서만 이야기 합니다. 독점적으로 양의 정수를 의미합니까? 그것이 어떻게 해석되는지 느낍니다.
Jonathan Frech

1
입력을 반대로받는 것이 합리적입니까? 입력이 0이 될 수 있습니까?
NieDzejkob

1
나는 생각한다 , 따라서 다음에 오류가 발생 MOD 실제 합계를 계산 루틴을 제한 용어의 합에있을 당신이하고자합니다. 예를 들어, 입력 [999999,213412499,34532599,4125159,53539,54256439,353259,4314319,5325329,1242149,142219,1243219,14149,1242149,124419,999999999]이 유효하고 결과가 맞아야합니다. 1그렇다면이 문제를 해결하지 못한 답을 올렸으므로 질문에서 더 명확 해져야합니다 (힌트- mod루프 내부 로 이동 ). 아마도이를 분명히하는 몇 가지 예를 추가하십시오.
Neil Slater

1
실제로 내 예제의 결과는 9입니다. 이를 구현하는 데 필요한 자릿수 축소 체계는이 문제로 인해 발생한 실제 답변보다 훨씬 더 흥미 롭습니다.
Neil Slater

2
친애하는 OP, 더 많은 테스트 사례가 필요합니다.
NieDzejkob

답변:


15

자바 스크립트 (ES7), 22 바이트

제한됩니다 .2531

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

온라인으로 사용해보십시오!


2
지구상에서 무엇이 작동합니까?!
Caleb Jay

@ komali_2 : **는 JavaScript의 지수 연산자입니다. 나머지는 매우 간단합니다.
얽히고 설킨

2
@ komali_2은 a.join`**` 동등 a.join(['**'])하고 ['**']으로 강제된다 '**'의해 join방법.
Arnauld

1
OP는 한계가 값 의 합계 에 있다고 생각하며 ,이 경우 문제가 해결되지 않습니다.
Neil Slater

1
@AJFaraday 마지막에 % 10. 숫자를 10으로 나누면 나머지 (모듈러스)는 항상 마지막 자리가되므로 n % 10마지막 자리는n
Skidsdev



9

HP 49G RPL, 36.5 바이트

APPROX 모드에서 실행하십시오 (그러나 EXACT 모드에서는 프로그램을 입력하십시오). 스택에서 가장 깊은 첫 번째 요소를 정수 또는 실수로 스택에 입력합니다.

WHILE DEPTH 1 - REPEAT ^ END 10 MOD

하나의 값이 남을 때까지 소피아의 솔루션에서와 같이 스택에서 직접 지수화 한 다음 마지막 숫자를 얻기 위해 mod 10을 취합니다.

내가 계산에 APPROX를 사용하는 이유는 0.0 ^ 0.0 = 1 (둘 다 실수 일 때)이지만 0 ^ 0 =? (둘 다 정수인 경우). APPROX는 모든 정수를 실수로 강제 변환하므로 입력에 문제가 없습니다. 그러나 10 (정수)은 자릿수로 저장되고 6.5 바이트이지만 10.0 (실수)은 전체 실수로 저장되며 10.5 바이트이므로 EXACT를 사용하여 프로그램을 시작합니다. 또한 RPL의 Reduce (STREAM이라고 함)를 사용하지 마십시오. 이는 10 바이트의 오버 헤드 인 추가 프로그램 개체를 도입하기 때문입니다. 나는 이미 하나 있고 다른 것을 원하지 않습니다.

HP 49G 실수 (십진수 12 자리)의 정밀도로 제한

비어있는 목록 후 -10 바이트-> 1 요구 사항이 제거되었습니다.

스택에 입력하여 -2 바이트


1
바이트 카운트 계산 방법을 설명해 주시겠습니까? 그 언어가 니블을 어떻게 사용하는지 궁금합니다 .
JungHwan Min

1
@JungHwanMin HP 49G는 계산기이기 때문에 4 비트 프로세서와 BCD 산술을 사용합니다. 내부적으로 대부분의 명령은 공간을 절약하기 위해 자신이 나타내는 루틴에 대한 2.5 바이트 포인터로 변환됩니다. 이런 방식으로 작은 숫자 (0-9)도 변환됩니다.
Jason

1
토성 프로세서는 실제로 작업하기가 꽤 재미 있습니다. 오래 전, 내가 쓴 BurgerTime이 포트 는 HP 48G (X)에 대한 (어셈블리). 나중에 49G로 포팅되었습니다 . 좋은 추억들!
Arnauld

7

dc , 17 15 바이트

1[^z1<M]dsMxzA%

온라인으로 사용해보십시오!

스택에서 입력을 가져 와서 스택으로 출력합니다. 매우 간단한 구현-스택에 하나의 값만 남고 마지막 숫자에 대해 수정 될 때까지 지수화합니다.

2 바이트 절약을위한 brhfl에 감사합니다!


2
로 변경 10%하여 1 바이트를 골프화 할 수 있고 A%스택 깊이를 두 번 확인하지 않고 1 바이트를 더 골프화 할 수 있습니다. 1n ^ 1 == n부터 실행하기 전에 스택 위에 1[^z1<M]dsMxA%
놓기 만하면됩니다

좋은 생각! 나는 A십진수 입력으로 설정하는 동안 dc가 리터럴로 사용할 수 있다는 것을 몰랐습니다 . @brhfl 감사합니다!
소피아 레크 너

1
@SophiaLechner이 트릭은 모든 입력 기반에 적용됩니다 : codegolf.stackexchange.com/a/77728/11259
Digital Trauma


6

05AB1E , 4 바이트

.«mθ

온라인으로 사용해보십시오!

설명

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

1
내가 아는 한 스택 기반 언어는 STDIN 또는 대안 대신 스택에 입력이 있다고 가정 할 수 있으므로 이와 같은 것은 4 바이트 (또는 E헤더에 배치) 에 대해 작동해야합니다 .
Mr. Xcoder


1
나중에 사용하기 위해 최신 커밋 에서이 문제를 해결했습니다 .
Adnan

@ Mr.Xcoder : 맞아! 나는 그것을 기억해야했다. 따라서 암시 적 입력을 할 필요는 거의 없습니다. 감사합니다 :)
Emigna

@ Mr.Xcoder 어, 그것이 메타가 실제로 무엇을 의미하는지 잘 모르겠습니다. 05AB1E의 "기능"은 무엇입니까? 변수에 할당 할 수 있고로 평가 할 수 있기 때문에 단순히 문자열이어야한다고 생각합니다 .V. .«mθ자체적으로 나중에 재사용하기 위해 변수에 할당 할 수 없으므로 스 니펫처럼 보입니다. 글쎄, Adnan은 이제 문제를 해결했지만 어.
Outgolfer Erik

5

퓨어 배쉬 (내장 전용-외부 유틸리티 없음), 21

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

입력은 명령 행에 쉼표로 구분 된 목록으로 제공됩니다.

배쉬 정수는 64- 비트 및 32- 비트 버전에 대해 정상적인 부호있는 정수 제한을 따릅니다.

온라인으로 사용해보십시오!


2
^비트 XOR이므로 5올바른 대신 테스트 사례 에서 벗어나는 이유 1입니다. 다음으로 전환하려면 바이트를 추가해야합니다.**
Sophia Lechner

@SophiaLechner 예-물론-잘 잡습니다! 그것이 어떻게 영향을 받았는지 잘 모르겠습니다 . 이제 개발자주기의 이전 반복에서 ^있었습니다 **.
디지털 외상



4

루비, 41 47 바이트

입력 배열에서 0을 처리하여 크기가 증가하므로 추가로 고려해야합니다. 덕분에rewritten

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

이것은 원래의 소스가 의도 한대로, 즉 언어 고유 정수에 맞지 않는 매우 큰 지수에 대한 것이므로 해결됩니다. 제한은 2**32-1중간 계산도 맞지 않는다는 것이 아니라 배열이 합산되는 것 입니다. 실제로 그것은 코드 전쟁에 대한 도전의 포인트 인 것 같습니다. Ruby의 기본 정수는 꽤 커질 수 있지만 끝에 % 10으로 순진하게 처리 된 아래 예제에 대처할 수 없습니다.

예 :

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

산출: 9


감동적인. 4 바이트 이상을 지출하면 훨씬 높은 타워에 대처할 수 : 대신 n**(t%4+4)n**((t-1)%4+1)당신이 얻을 수 있도록 n**1하는 대신 n**5어떤 단계 4에서 좋은 사이클이 될 것이라고 관찰 등 했네.
재 작성

1
시퀀스에 0이있는 경우 문제가 있습니다.
다시 작성

@ 다시 작성 : 좋은 자리! 나는 그것에 대해 생각해야 할 것이다. 이론적으로 시퀀스는 첫 번째 0 전에 2 단계를 종료해야합니다.
Neil Slater

실제로, 그러나 훨씬 더 많은 코드, 정확히 6 바이트가 더 필요합니다 : n<2?n:before n**.
다시 작성




3

C # (. NET 코어) , 84 바이트

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

온라인으로 사용해보십시오!

  • @raznagul 덕분에 -7 바이트

근사한 부분을 제거 a하고 루프 조건을 감소 ( for(var i=a.Lengt-1;i-->0;)) 와 결합하여 일부 바이트를 절약 할 수 있습니다 . 그러나 using바이트 수에는-문이 포함되어야합니다.
raznagul

@ raznagul : 죄송합니다, C #에서 코드 골프를 처음 접했습니다. 지금 괜찮습니까?
digEmAll

문제 없어요. 예, 이제 괜찮습니다.
raznagul

1
새 변수를 사용하여 결과를 유지하고 배열에 대한 대부분의 인덱스 액세스를 제거하여 3 바이트를 더 절약 할 수 있습니다. 온라인으로 시도하십시오!
raznagul

@ raznagul : 좋아!
digEmAll

3

C (gcc) , 56

  • @JonathanFrech 덕분에 4 바이트 절약

r()매크로에서 호출 된 재귀 함수 f-일반 스택 제한이 적용됩니다.

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

입력은 0으로 끝나는 int 배열로 제공됩니다. 이것은 x n 중 어느 것도 0이 아니라는 가정하에 있습니다.

온라인으로 사용해보십시오!


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

1
또한 UB를 사용하려면로 골프 r(int*n){return pow를 칠 수 R;r(int*n){R=pow있습니다.
Jonathan Frech



3

Japt -h , 7 6 바이트

입력을 역순으로 입력 할 수 있으면 첫 번째 문자를 제거 할 수 있습니다.

로 제한되었습니다 2**53-1.

Ôr!p ì

시도 해봐


설명

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

플래그가없는 것과 똑같은 대답을 얻었으므로 현재로서는 최적의 방법처럼 보입니다.
Nit

@Nit : 그것이 확인 될 때까지 우리는 반대로 입력을받을 수있다 :)
Shaggy

@Oliver 네,하지만 여전히 깃발을 사용하고 있습니다. 개인적으로 나는 플래그가없는 바이트 카운트가 가장 정확한 스코어링 결과라고 생각합니다.
Nit

@Nit 플래그가 메타 컨센서스로 3 바이트를 추가해서는 안됩니까?
LegionMammal978




2

Excel VBA, 60 바이트

범위에서 입력을받는 익명의 VBE 즉시 창 기능 [A1:XFD1]

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



2

파이썬 3 , 55 바이트

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

이전 버전

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


그럴 필요는 p=lambda...없습니까? 파이썬은 재귀 익명 람다를 처리 할 수 ​​없으므로 함수의 이름을 지정 해야하는 경우 솔루션의 일부가되어야하며 코드 골프 과제의 바이트 수에 대한 이름 지정 횟수가 필요합니다.
mypetlion


2

Brain-Flak , 161 바이트

에 +1 포함 -r

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

온라인으로 사용해보십시오!

이 예제 [3, 4, 2]는 60 초보다 오래 걸리므로 TIO 링크는을 사용합니다 [4, 3, 2].

-r입력 (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 바이트

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

온라인으로 사용해보십시오!

무차별 시험 장치

입력을 원시 바이트로 취합니다. 2 ** 8-1로 제한됩니다.

설명

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.