最后一位数字


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,文件,命令行参数,整数,字符串等)。

输出可以是任何合理的形式(标准输出,文件,显示数字的图形用户元素等)。

看到了代码大战。


2
我有一个问题:在您的帖子中,您仅谈论numbers。您是专门指正整数吗?这就是我的理解方式。
乔纳森·弗雷希

1
反向输入是否合理?输入可以为零吗?
NieDzejkob

1
认为您打算限制条件的总和,因此计算实际总和然后对其进行修改的例程将失败。例如,输入[999999,213412499,34532599,4125159,53539,54256439,353259,4314319,5325329,1242149,142219,1243219,14149,1242149,124419,999999999]有效且结果应为“是”,1因此,您需要在问题中更清楚地说明问题,因为您对不能解决问题的答案进行了投票(提示- mod在循环内移动)。也许添加一些例子可以使这一点变得清楚。
尼尔·斯莱特

1
实际上,我的示例得出的结果是9。实施此操作所需的数字减少方案比该问题获得的实际答案要有趣得多。
尼尔·斯莱特

2
尊敬的OP,我们需要更多的测试用例。
NieDzejkob

Answers:


15

JavaScript(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打算限制值的总和,在这种情况下,这不能解决所提出的问题。
尼尔·斯莱特

1
@AJFaraday最后的%10。当将任何数字除以10时,余数(模数)将始终是最后一位数字,因此n % 10将返回n
Skidsdev '18



9

HP 49G RPL,36.5字节

在APPROX模式下运行它(但在EXACT模式下输入程序)。接受堆栈中第一个元素最深的堆栈中的输入,为整数或实数。

WHILE DEPTH 1 - REPEAT ^ END 10 MOD

它像在Sophia的解决方案中那样直接在堆栈上求幂,直到剩下一个值为止,然后将其取值为mod 10以获得最后一位。

我使用APPROX进行计算的原因是因为0.0 ^ 0.0 = 1(当它们都是实数时),但是0 ^ 0 =?(当它们都是整数时)。APPROX将所有整数都强制转换为实数,因此使用任一输入都可以。但是,我使用EXACT进入程序是因为10(整数)是逐位存储的,是6.5个字节,而10.0(实数)是作为一个完整的实数存储的,是10.5个字节。我还避免使用RPL的reduce(称为STREAM),因为它引入了额外的程序对象,这是10字节的开销。我已经有一个,不想再有一个。

仅限于HP 49G实数的精度(12个十进制数字)

空列表后的-10个字节-> 1个要求已删除。

通过在堆栈上输入-2个字节。


1
嘿,您能解释一下字节数的计算方式吗?只是好奇这种语言是如何使用半字节
JungHwan Min

1
@JungHwanMin HP 49G使用4位处理器和BCD算术,因为它是计算器。在内部,大多数命令都转换为指向它们表示的例程的2.5字节指针,以节省空间。小数字(0-9)也以这种方式转换。
杰森

1
实际上,使用Saturn处理器非常有趣。一个很长的时间以前,我写了汉堡世界的这个端口(组装)的HP 48G(X)。后来移植到了49G。美好的回忆!
Arnauld

7

dc17 15字节

1[^z1<M]dsMxzA%

在线尝试!

从堆栈中获取输入,然后输出到堆栈。非常简单的实现-取幂,直到堆栈上只剩下一个值,最后一位取mod。

感谢brhfl节省了两个字节!


2
您可以通过更改10%为来打一个字节A%,而不必两次检查堆栈深度就可以打一个字节- 1执行n ^ 1 == n之前,只需将堆栈放在栈顶即可:1[^z1<M]dsMxA%
brhfl

好主意!我不知道dc A在设置为十进制输入时会让我用作文字。谢谢@brhfl!
Sophia Lechner '18

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在头)。
Xcoder先生18年


1
我已经在最新的提交中解决了这个问题,以备将来使用。
阿德南'18

@ Mr.Xcoder:对!我应该记得这一点。因此很少需要使用隐式输入。谢谢:)
Emigna '18

@ Mr.Xcoder呃,我不确定这是否是meta真正的意思。05AB1E中的“功能”是什么?我认为它应该只是一个字符串,因为您可以将其分配给变量,并且可以与评估.V.«mθ看起来更像是一个代码段,因为就其本身而言,您不能将其分配给变量以供以后重用。好吧,阿德南现在解决了这个问题,但是。
暴民埃里克(Erik the Outgolfer)'18年

5

Pure Bash(仅内置工具-无外部实用程序),21

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

输入在命令行中以逗号分隔的列表形式给出。

对于64位和32位版本,Bash整数受常规有符号整数限制。

在线尝试!


2
^是按位XOR,这就是为什么您要5离开测试用例而不是正确的原因1。您需要添加一个字节才能切换到**
Sophia Lechner,

@SophiaLechner是的-当然-不错!不确定该如何^进行-我**在开发周期的先前迭代中有过。
Digital Trauma '18



4

Ruby,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**5etc。在任何一个阶段4都是一个不错的周期,这一点得到了荣誉。
改写了

1
如果序列具有0,则存在一个问题
重写

@rewrite:好地方!我得考虑一下。从理论上讲,应强制序列在第一个零之前终止2个步骤。
尼尔·斯莱特

确实,但是这将需要更多的代码,正好是6个字节:n<2?n:before n**
重写




3

C#(.NET Core),84字节

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

在线尝试!

  • -7个字节,感谢@raznagul

您可以通过删除括号a并将循环条件与减量(for(var i=a.Lengt-1;i-->0;))合并来节省一些字节。但是using-statement必须包含在字节数中。
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

输入以零终止的int数组形式给出。这是基于x n都不为零的假设。

在线尝试!


2
) r(-> )r(
乔纳森·

1
另外,如果你想使用UB,你可以打高尔夫球r(int*n){return powR;r(int*n){R=pow
乔纳森·弗雷希



3

Japt -h7 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标志不应该通过meta共识添加3个字节吗?
LegionMammal978 '18

@ 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

Python 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...吗?Python无法处理递归匿名lambda,因此,如果您需要对函数进行命名,则它必须是解决方案的一部分,并且对于代码高尔夫球挑战,命名要计入字节数。
mypetlion '18


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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.