最後の桁の大きな数字


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、ファイル、コマンドラインパラメーター、整数、文字列など)にすることができます。

出力は、合理的な形式(stdout、ファイル、数字を表示するグラフィカルユーザー要素など)にすることができます。

コード戦争を見ました。


2
質問が1つあります。投稿では、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

回答:


15

JavaScript(ES7)、22バイト

制限されます。2531

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

オンラインでお試しください!


2
一体どうして、これはなぜ機能するのですか?!
カレブジェイ

@ komali_2:**JavaScriptのべき乗演算子です。残りは非常に簡単です。
シャギー

2
@ komali_2 a.join`**` は、メソッドa.join(['**'])と同等であり、メソッドによって['**']強制さ'**'joinます。
アーナウルド

1
OPは、制限が値の合計にあることを意図していると思います。その場合、これは提起された問題を解決しません。
ニールスレーター

1
@AJFaraday最後の%10。任意の数値を10で除算すると、剰余(モジュラス)は常に最後の桁になるためn % 10、次の最後の桁が返されますn
Skidsdev



9

HP 49G RPL、36.5バイト

APPROXモードで実行します(ただし、EXACTモードでプログラムに入ります)。整数または実数として、スタックの最初の要素がスタック内で最も深いスタックで入力を受け取ります。

WHILE DEPTH 1 - REPEAT ^ END 10 MOD

Sophiaのソリューションのように、1つの値が残るまでスタック上で簡単に累乗し、10を法として最後の桁を取得します。

計算にAPPROXを使用する理由は、0.0 ^ 0.0 = 1(両方が実数である場合)であるが、0 ^ 0 =?(両方が整数の場合)。APPROXはすべての整数を実数に強制するため、どちらでも問題ありません。ただし、10(整数)は1桁ずつ格納され、6.5バイトですが、10.0(実数)は完全な実数として格納され、10.5バイトであるため、EXACTを使用してプログラムに入ります。また、RPLのreduce(STREAMと呼ばれる)を使用することは避けます。これは、10バイトのオーバーヘッドである余分なプログラムオブジェクトを導入するためです。私はすでに持っていますが、もう必要ありません。

HP 49G実数(12桁の12桁)の精度に制限されています

空のリストの後-10バイト-> 1つの要件が削除されました。

スタックで入力を取得して-2バイト。


1
ねえ、バイトカウントの計算方法を説明できますか?その言語がニブルをどう使っているのか不思議です。
ジョンファンミン

1
@JungHwanMin HP 49Gは、計算機であるため、4ビットプロセッサとBCD算術演算を使用します。内部的には、ほとんどのコマンドは、スペースを節約するために、それらが表すルーチンへの2.5バイトポインターに変換されます。小さい数字(0-9)もこの方法で変換されます。
ジェイソン

1
Saturnプロセッサは実際に作業するのがとても楽しいです。長い時間前に、私が書いたバーガータイムのこのポートを HP 48G(X)のために(アセンブリ内で)。後で49G移植されました。良い思い出!
アーナウルド

7

dc17 15バイト

1[^z1<M]dsMxzA%

オンラインでお試しください!

スタックから入力を受け取り、スタックに出力します。非常に簡単な実装-スタックに1つの値だけが残り、最後の桁のmodになるまで累乗します。

2バイトを節約してくれたbrhflに感謝します!


2
に変更10%するA%と1バイト、スタックの深さを2回チェックしないことでもう1バイトゴルフでき1ます。n^ 1 == n以降、実行する前にスタックの上に置くだけ1[^z1<M]dsMxA%
です。– brhfl

良いアイデア!dcがA10進入力に設定されている間、リテラルとして使用できるとは考えていませんでした。ありがとう@brhfl!
ソフィア・レヒナー

1
@SophiaLechnerこのトリックは、すべての入力ベースで機能します:codegolf.stackexchange.com/a/77728/11259
デジタル外傷


6

05AB1E、4バイト

.«mθ

オンラインでお試しください!

説明

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

1
私の知る限り、スタックベースの言語は、STDINまたは代替の代わりにスタックに入力があると想定できるため、このようなものは4バイトで動作するはずです(あるいは、Eヘッダーに配置するだけです)。
ミスターXcoder


1
今後の使用に備えて、最新のコミットでこの問題を修正しました。
アドナン

@ Mr.Xcoder:そうです!覚えておくべきだった。そのため、暗黙的な入力ではほとんど必要ありません。ありがとう:)
エミグナ

@ Mr.Xcoderうーん、それがメタが本当に意味するものなのかわかりません。05AB1Eの「機能」とは何ですか?変数に割り当てることができ、で評価できるため、単純に文字列にする必要があると思います.V.«mθ後で再利用するためにそれを変数に割り当てることができないため、スニペットのように見えます。さて、アドナンは問題を修正しましたが、ええ。
エリックアウトゴルファー

5

Pure Bash(組み込みのみ-外部ユーティリティなし)、21

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

入力は、コンマで区切られたリストとしてコマンドラインで与えられます。

bash整数は、64ビットおよび32ビットバージョンの通常の符号付き整数の制限に従います。

オンラインでお試しください!


2
^ビット単位のXORであるため5、正しいの代わりにテストケースから抜け出しているのです1。切り替えるバイトを追加する必要があります**
ソフィア・レヒナー

@SophiaLechnerはい-もちろん-良いキャッチ!それがどのように^浸透したのかわからない-私**は私の開発サイクルの以前の繰り返しで持っていた。
デジタル外傷



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)取得します。任意のステージ4が良いサイクルであるという観測に対する称賛。n**1n**5
書き換え

1
シーケンスに0がある場合は問題があります
書き換えられ

@書き換え:良いスポット!私はそれについて考えなければなりません。理論的には、シーケンスは最初のゼロの2ステップ前に強制的に終了する必要があります。
ニールスレーター

確かに、それは、正確に6つのより多くのバイトを、より多くのコードが必要になります:n<2?n: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;}

オンラインでお試しください!

  • @raznagulのおかげで-7バイト

周りのブラッカーを削除しa、ループ条件と減分(for(var i=a.Lengt-1;i-->0;))を組み合わせることで、いくつかのバイトを節約できます。ただし、using-countmentはバイトカウントに含める必要があります。
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 powをすることができますR;r(int*n){R=pow
ジョナサンフレッチ



3

ジャプト -h7 6 bytes

入力を逆順で取得できる場合は、最初の文字を削除できます。

に限定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: 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

Includes +1 for -r

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

Try it online!

The example [3, 4, 2] takes longer than 60 seconds, so the TIO link uses [4, 3, 2].

The -r can be removed if input can be taken in reverse order for a byte count of 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 bytes

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

Try it online!

Brute-force test harness

Takes input as raw bytes. Limited to 2**8-1.

Explanation

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.