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


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
У мене є одне питання: У своєму дописі ви говорите лише про 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 байти

Обмежено .2531

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.