Последнее число большое число


12

Для заданного списка числа найти последнюю цифру x x x x n 3 2 1 Пример:[Икс1,Икс2,Икс3,,,,,ИксN]Икс1Икс2Икс3...ИксN

[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

Входные данные могут быть любой приемлемой формы (стандартный, файл, параметр командной строки, целое число, строка и т. Д.).

Вывод может быть в любой разумной форме (стандартный вывод, файл, графический пользовательский элемент, отображающий число и т. Д.).

Увидел на войне кодов.


2
У меня один вопрос: в своем посте вы говорите только о numberс. Вы имеете в виду исключительно натуральные числа? То есть я чувствую, как это было истолковано.
Джонатан Фрех

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 байта

Ограничено .253-1

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

Он прямо возводится в степень в стеке, как в решении Софии, пока не останется одно значение, а затем принимает значение 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 Мин

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

1
С процессором Saturn работать довольно интересно. Давно давно, я писал этот порт 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
Цифровая травма


6

05AB1E , 4 байта

.«mθ

Попробуйте онлайн!

объяснение

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

1
Насколько мне известно, языки на основе стека могут предполагать, что входные данные присутствуют в стеке вместо STDIN или альтернатив, поэтому что-то вроде этого должно работать для 4 байтов (альтернативно, просто поместите Eв заголовок).
Мистер Xcoder


1
Я исправил эту проблему в последнем коммите для будущего использования.
Аднан

@ Mr.Xcoder: Верно! Я должен был вспомнить это. Так что редко нужно, хотя с неявным вводом. Спасибо :)
Emigna

@ Mr.Xcoder Э-э, я не уверен, действительно ли это означает мета. Что такое «функция» в 05AB1E? Я думаю, что это должна быть просто строка, так как вы можете присвоить ее переменной, и ее можно оценить с помощью .V. .«mθбольше похоже на фрагмент, поскольку сам по себе вы не можете присвоить его переменной для последующего повторного использования. Ну, теперь Аднан решил проблему, но да.
Эрик Outgolfer

5

Pure Bash (только для buildins - без внешних утилит), 21

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

Ввод указывается в командной строке в виде списка через запятую.

На целые числа Bash распространяются обычные ограничения целых чисел со знаком для 64- и 32-разрядных версий.

Попробуйте онлайн!


2
^является побитовым XOR, поэтому 5вместо правильного вы выходите из теста 1. Вам нужно будет добавить байт, чтобы переключиться на**
София Лехнер

@SophiaLechner Да - конечно - хороший улов! Не уверен, как это ^закралось - у меня было **в предыдущих итерациях моего цикла разработки.
Цифровая травма



4

Рубин, 41 47 байт

Увеличение размера из-за обработки любого 0 во входном массиве, который требует дополнительного рассмотрения. Благодаряrewritten

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

Это решено, поскольку я полагаю, что исходный источник предназначен, то есть для очень больших возведений в степень, которые не будут вписываться в родные целые числа языка - ограничение состоит в том, что массив будет суммироваться 2**32-1, а не то, что промежуточные вычисления также гарантированно будут соответствовать. На самом деле это может показаться проблемой для Code Wars. Хотя нативные целые числа в 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
Существует проблема, если последовательность имеет 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: извините, я довольно новичок в code-golf в C #, теперь все нормально?
digEmAll

Нет проблем. Да, теперь все в порядке.
Разнагул

1
Вы можете сохранить еще 3 байта, используя новую переменную для хранения результата и удаления большей части индекса доступа к массиву: попробуйте онлайн!
Разнагул

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

@ Оливер Да, но ты все еще используешь флаг. Лично я считаю, что подсчет байтов без флагов является наиболее точным результатом подсчета очков.
Нить

@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

Мозг-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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.