Остання цифра велика кількість


12

Для заданого списку числа знайдіть останню цифру x x x … x n 3 2 1 Приклад:[x1,x2,x3,...,xn]x1x2x3…xn

[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 буде досить малим, щоб сума вмістилася в ціле число.232−1

Введення може бути будь-якою розумною формою (stdin, файл, параметр командного рядка, ціле число, рядок тощо).

Вихід може бути будь-якої розумної форми (stdout, файл, графічний елемент користувача, який відображає число тощо).

Бачив на кодових війнах.


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
Шановний ОП, нам потрібно більше тестових випадків.
— NieDzejkob

Відповіді:


15

JavaScript (ES7), 22 байти

Обмежено .253−1

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

Спробуйте в Інтернеті!


2
Що на землі, чому це працює ?!
— Калеб Джей

@ komali_2: **це оператор експоненції JavaScript. Решта досить просто.
— Shaggy

2
@ komali_2 a.join`**` еквівалентний a.join(['**'])і ['**']примусовий до '**'цього joinметоду.
— Арнольд

1
Я думаю, що ОП має на меті встановити ліміт на суму значень, і в цьому випадку це не вирішує поставлених проблем.
— Ніл Слейтер

1
@AJFaraday наприкінці% 10. При діленні будь-якого числа на 10, решта (модуль) завжди буде останньою цифрою, тому n % 10поверне останню цифруn
— Skidsdev



9

HP 49G RPL, 36,5 байт

Запустіть його в режимі APPROX (але введіть програму в точному режимі). Здійснює введення в стек з першим елементом, найглибшим у стеку, у вигляді цілих чи реальних цифр.

WHILE DEPTH 1 - REPEAT ^ END 10 MOD

Він прямо експонується на стек, як у рішенні Софії, поки не залишиться одне значення, а потім приймає mod 10, щоб отримати останню цифру.

Причиною, що я використовую APPROX для обчислення, є те, що 0,0 ^ 0,0 = 1 (коли вони обидва реальні), але 0 ^ 0 =? (коли вони обидва цілих числа). APPROX примушує всі цілі числа до дійсних цифр, тому введення даних добре з будь-яким. Однак я використовую EXACT для вступу в програму, оскільки 10 (ціле число) зберігається з цифр у цифру і становить 6,5 байт, але 10,0 (справжнє) зберігається як повне дійсне число і становить 10,5 байт. Я також уникаю використання скорочення RPL (званого STREAM), оскільки він вводить додатковий об'єкт програми, який становить 10 байт накладних витрат. У мене вже є одне, а іншого не хочу.

Обмежено точністю реального HP 49G (12 десяткових цифр)

-10 байт після порожнього списку -> 1 вимога була видалена.

-2 байти, взявши вхід на стек.


1
Гей, ви могли б пояснити, як обчислюється обмінний рахунок? Тільки цікаво, як ця мова використовує кусаки .
— JungHwan Min

1
@JungHwanMin HP 49G використовує 4-бітний процесор та арифметику BCD, оскільки це калькулятор. Внутрішня частина більшості команд перетворюється на 2,5 байт-покажчики до підпрограм, які вони представляють, щоб заощадити місце. Невеликі числа (0-9) також трансформуються таким чином.
— Джейсон

1
Процесор Сатурн насправді досить весело працювати. Давно давно, я писав цей порт BurgerTime (в зборі) для HP 48G (X). Пізніше він був перенесений на 49G . Хороші спогади!
— Арнольд

7

постійного струму , 17 15 байт

1[^z1<M]dsMxzA%

Спробуйте в Інтернеті!

Бере вхід зі стека, виводить у стек. Дуже відверта реалізація - експонується до тих пір, поки на стеку не залишиться лише одне значення та мод для останньої цифри.

Дякуємо brhfl за збереження двох байтів!


2
Ви можете пограти в один байт, змінивши 10%на A%і ще один байт, не перевіряючи глибину стека двічі - просто поставте 1зверху стек перед виконанням з n ^ 1 == n:1[^z1<M]dsMxA%
— brhfl

Гарні ідеї! Я не мав ідеї, що DC може дозволити мені використовувати Aв якості буквального під час встановлення десяткового введення. Дякую @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в заголовку).
— Містер Xcoder


1
Я вирішив це питання в останньому зобов'язанні для подальшого використання.
— Аднан

@ Mr.Xcoder: Правильно! Я мав це пам’ятати. Тому рідко потрібно хоч із неявним введенням. Дякую :)
— Емінья

@ Mr.Xcoder Так, я не впевнений, що це мета означає насправді. Що таке "функція" в 05AB1E? Я думаю, що це повинен бути просто рядок, оскільки ви можете призначити його змінній, а з нею можна зрівнятись .V. .«mθбільше схожий на фрагмент, оскільки сам по собі ви не можете призначити його змінної для подальшого повторного використання. Ну, Аднан зараз виправив це питання, але так.
— Ерік Аутгольфер

5

Pure Bash (лише вбудовані - без зовнішніх утиліт), 21

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

Введення подано у командному рядку у вигляді списку, розділеного комами.

Цілі числа Bash підлягають нормальним підписаним цілим обмеженням для 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, а не тим, що тимчасові обчислення також гарантовано підходять. Насправді, це, здається, було б суперечливим завданням у боротьбі з кодовами. Хоча вихідні цілі числа Рубі можуть отримати досить великі розміри, вони не впораються із наведеним нижче прикладом, наївно обробленим% 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
Виникає проблема, якщо в послідовності є 0s
— переписано

@rewritten: Добре місце! Мені доведеться подумати над цим. Теоретично послідовність повинна бути змушена припинити 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;}

Спробуйте в Інтернеті!

  • -7 байт завдяки @raznagul

Ви можете зберегти кілька байтів, видаливши гальма навколо aі комбінуючи стан циклу з декрементом ( for(var i=a.Lengt-1;i-->0;)). Але using-повідомлення повинно бути включено до підрахунку байтів.
— raznagul

@raznagul: Вибачте, я досить новачок у коді-гольф у C #, це нормально зараз?
— digEmAll

Нема проблем. Так, це зараз добре.
— raznagul

1
Ви можете зберегти ще 3 байти, скориставшись новою змінною, щоб утримати результат та видалити більшу частину доступу до індексу до масиву: Спробуйте в Інтернеті!
— raznagul

@raznagul: чудово!
— digEmAll

3

C (gcc) , 56

  • Збережено 4 байти завдяки @JonathanFrech

Застосовується рекурсивна функція, 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

1
Крім того, якщо ви хочете використовувати UB, ви можете покататися r(int*n){return powна гольфі R;r(int*n){R=pow.
— Джонатан Фрех


3

Japt -h , 7 байт

OvUqp)ì

Спробуйте в Інтернеті!

Пояснення:

OvUqp)ì
Ov   )    // Japt eval:
   q      //   Join
  U       //   Input with
    p     //   Power method
      ì   // Split into an array of numbers
-h        // Return the last number

Дивно, це не працювало б для мене.
— Shaggy


@Shaggy : P
— Олівер

Ага, заради Джейсіса! : \ Це трапляється все частіше і частіше!
— Кошлатий

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: поки не буде підтверджено, ми можемо взяти вклад у зворотному порядку :)
— Shaggy

@Oliver Так, але ви все ще використовуєте прапор. Особисто я вважаю, що кількість байтів без прапорців є найбільш точним результатом підрахунку балів.
— Ніт

@Nit Чи не повинен прапор додавати 3 байти мета-консенсусом?
— LegionMammal978

@ 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 не може впоратися з рекурсивними анонімними лямбдами, тому, якщо вам потрібна назва вашої функції, вона повинна бути частиною вашого рішення, а іменування вважається вашим числом байтів для проблем з кодовим гольфом.
— mypetlion


2

Мозок-Флак , 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.