Список числовых модулей их индексов в списке


25

Простой: возьмите список положительных целых чисел в качестве входных данных и выведите модуль чисел их индекс на основе 1 в списке.

Если входные целые числа являются {a, b, c, d, e, f, g}тогда, выходные данные должны быть, {a%1, b%2, c%3, d%4, e%5, f%6, g%7}где %- оператор модуля.


Тестовые случаи:

10  9  8  7  6  5  4  3  2  1
 0  1  2  3  1  5  4  3  2  1

8 18  6 11 14  3 15 10  6 19 12  3  7  5  5 19 12 12 14  5
0  0  0  3  4  3  1  2  6  9  1  3  7  5  5  3 12 12 14  5

1
0

1  1
0  1

Ответы:



9

Язык сценариев работы Flashpoint , 73 байта

f={l=_this;r=[];i=0;while{i<count l}do{r=r+[(l select i)%(i+1)];i=i+1};r}

Звоните с:

numList = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1];
hint format["%1\n%2", numList, numList call f];

Выход:


1
Что ... это вещь?
JAD

2
@JarkoDubbeldam Да. Игра позволяет игрокам создавать свои собственные сценарии, и в игре есть язык сценариев, разработанный в дополнение к разработке миссий. Однако, поскольку язык полон по Тьюрингу, вы можете делать с ним практически все, что захотите.
Steadybox


7

Желе , 2 байта

%J

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

Объяснение:

%J
 J List 1 .. len(input). This is results in a list of the indexes.
%  Modulo.

По сути, код модулирует исходный список списком индексов.


2
Как только я увидел этот вопрос, я подумал: «Это %Jв желе, интересно, кто-нибудь ответил таким ответом?». Я думаю, у кого-то еще была такая же идея :-D

1
@ ais523 Ты думаешь, что был единственным? Подумай еще раз!
Эрик Outgolfer

6

R, 24 18 байт

pryr::f(x%%seq(x))

Оценивает функцию:

function (x) 
x%%seq(x)

Который используется seq_along()для создания вектора такой же длины, как x, начиная с 1, а затем %%взять по модулю.

Поведение по умолчанию seqпри представлении с вектором - seq(along.with = x)это тот же вывод, что seq_along(x)и на 6 байт.


seq(x)это удобная вещь, чтобы иметь вокруг, так как я всегда использую 1:length(x).
Джузеппе

@Giuseppe Да, я тоже был немного удивлен.
JAD

6

R, 27 байт

x=scan();cat(x%%1:sum(1|x))

сэкономили 5 байт благодаря @Jarko

спас 4 еще больше благодаря @Giuseppe

спасли еще 2 благодаря @Taylor Scott

Сохранено еще 2 благодаря @returnbull


35 это - удален ненужный последний
парень

1
вам не нужно ' '(пробел) в конце cat; это разделитель по умолчанию
Джузеппе

2
Вы можете отбросить 2 байта, чтобы получить 33, уменьшив это до x<-scan();cat(x%%1:length(x)," ")- о, и пару советов по форматированию, 1) вам нужно всего 4 пробела слева от кода, чтобы он был правильно отступ и помечен 2) вы можете добавить <!-- language-all: lang-r -->флаг до того, как ваш код будет выделен (хотя в этом примере это мало меняется) 3) вам не нужны скобки вокруг названия вашего языка 4) о, и вам не нужно комментировать, когда вы вносите изменения в сообщение
Тейлор Скотт

2
(1) Вы можете использовать =вместо того, <-чтобы сохранить байт. (2) Спецификация говорит «вывод», а не «печать», так что вы, вероятно, можете отбросить cat(), сохранив 5 байтов. (3) sum(1|x)на один байт меньше, чем length(x).
rturnbull

5

APL (Dyalog) , 5 байтов

⍳∘≢|⊢

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

 индексы

 из

 длина аргумента

| этот модуль

 Аргумент


Всегда удивлялся, что «основной» язык может быть таким экономичным. Путь APL, кажется, естественно, код гольф: например, (~T∊T∘.×T)/T←1↓⍳R ⍝ primes up to Rилиlife←{↑1 ω∨.∧3 4=+/,¯1 0 1∘.⊖¯1 0 1∘.⌽⊂ω} ⍝ Game of Life

@YiminRong Вы можете сделать лучше: простые числа к R: (⊢~∘.×⍨)1↓⍳Rи GoL (в версии 16.0): K∊⍨⊢∘⊂⌺3 3где K - константа.
Адам

@YiminRong Попробуйте поиск простых чисел здесь !
Адам

5

Cubix , 19 байт

;ww.1I!@s%Ow;)Sow.$

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

    ; w
    w .
1 I ! @ s % O w
; ) S o w . $ .
    . .
    . .

Смотреть это работает

Довольно прямолинейная реализация.

  • 1 нажмите 1 в стек, чтобы начать индекс
  • I!@ получить целочисленный ввод и остановить, если 0
  • s%Ow поменяйте местами индекс, мод, вывод результата и смену полосы движения
  • ;) удалить результат и индекс приращения
  • Sow нажмите 32, выходной пробел и смените полосу движения (в направлении от o)
  • $O прыгать на выходе
  • w;wсмените lange, удалите 32 из стека и смените полосу на Iвход

5

05AB1E , 2 байта

ā%

Попробуйте онлайн! или попробуйте все тесты

ā  # Push the range(1, len(a) + 1)
 % # Mod each element in the input by the same one in this list

Интересно, я думал, что это было бы DgL%хорошо.
Волшебная Урна Осьминога

@carusocomputing у меня изначально был, gL%потому что я забыл о ā.
Райли

Вы собираетесь углубиться в мои мысли ā? Я полагаю, что никогда не использовал это, просто так, for eachно 1 to n+1так, как это vy<code>})подразумевается vy<code>})?
Волшебная Урна Осьминога

@carusocomputing выдвигает массив со значениями 1 к длине вытолкнутого массива. Это эквивалентно gL. TIO
Райли

Это также обманывает ввод? Или неявный ввод теперь автоматически распространяется на ближайший доступный ввод?
Волшебная Урна Осьминога


4

Звездный , 75 70 байт

      +`  , + +   *    +  + +      +*   +    *  .               + + .'

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

объяснение

Это бесконечный цикл, который продолжает чтение чисел с входа и увеличивает счетчик, инициализированный в 1. Для каждой пары ввода и счетчика модуль вычисляется и печатается.

Чтобы завершить цикл, когда вход исчерпан, используется следующий прием. Когда больше нет доступных входных данных, попытка прочитать еще один номер дает 0. Таким образом, мы делим прочитанное число на себя, и если это так, 0программа завершается с ошибкой. Иначе мы отбрасываем результат и продолжаем.

      +              Push 1. This is the initial value of the counter
`                    Mark label
  ,                  Read number from input and push it. Gives 0 if no more input
 +                   Duplicate top of the stack
 +                   Duplicate top of the stack
   *                 Pop two numbers and push their division. Error if divisor is 0
    +                Pop (discard) top of the stack
  +                  Swap top two numbers
 +                   Duplicate top of the stack
      +              Push 1
*                    Pop two numbers and push their sum. This increases the counter
   +                 Rotate stack down, to move increased counter to bottom
    *                Pop two numbers and push their modulus
  .                  Pop a number and print it as a number
               +     Push 10
 +                   Duplicate top of the stack
 .                   Pop a number (10) and print it as ASCII character (newline)
'                    If top of the stack is non-zero (it is, namely 10) go to label



3

Japt, 5 4 байта

®%°T

Попытайся


объяснение

     :Implicit input of array U
®    :Map over the array
%    :Modulo of the current element
°T   :T (0, initially) incremented by 1

1
Я думаю, что вы можете сохранить байт с помощью ®%°T(на самом деле, вы все равно можете использовать его Yтам, если хотите)
ETHproductions

Ага. Спасибо, @ETHproductions.
Лохматый

3

R, 22 байта

pryr::f(x%%1:sum(x|1))

R выполняет 1: длина (х), прежде чем делать модуль.


Приятно найти с sum(x|1)!
JAD

1
Просто обнаружил, что использование seq()вместо seq_along()делает то же самое. Так что это снова на несколько байтов.
JAD

1
Я собирался сказать вам это, но у меня не было представителя, чтобы комментировать. Рад, что вы поняли это.
Shayne03



2

Mathematica, 21 байт

#~Mod~Range@Length@#&

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

или 20 байтов (Мартином)

#~Mod~Range@Tr[1^#]&

Tr[1^#]для Length@#.
Мартин Эндер

что никто не работает над математикой, поэтому я держу их обоих
J42161217

Вы пропускаете в #качестве второго последнего символа в вашем первом ответе.
Ян Миллер

2

Excel VBA, 59 46 байт

Golfed

Anonymous VBE Функция непосредственного окна, которая принимает строку массива с разделителем- пробелом в качестве входных данных из диапазона [A1]и выводит модуль чисел с их индексом на основе 1 в начальном списке в непосредственное окно VBE

For Each n In Split([A1]):i=i+1:?n Mod i;:Next

Ввод, вывод:

[A1]="10 9 8 7 6 5 4 3 2 1" ''# or manually set the value
For Each n In Split([A1]):i=i+1:?n Mod i;:Next
 0  1  2  3  1  5  4  3  2  1 

Старая Subрутина

Подпрограмма, которая принимает входные данные как переданный массив и выводит их в непосредственное окно VBE.

Sub m(n)
For Each a In n
i=i+1
Debug.?a Mod i;
Next
End Sub

Вход / выход:

m Array(10,9,8,7,6,5,4,3,2,1)
 0  1  2  3  1  5  4  3  2  1 

Ungolfed

Option Private Module
Option Compare Binary
Option Explicit
Option Base 0 ''# apparently Option Base 1 does not work with ParamArrays

Public Sub modIndex(ParamArray n() As Variant)
    Dim index As Integer
    For index = LBound(n) To UBound(n)
        Debug.Print n(index) Mod (index + 1);
    Next index
End Sub

Ввод, вывод:

Call modIndex(10,9,8,7,6,5,4,3,2,1)
 0  1  2  3  1  5  4  3  2  1 

1

CJam , 9 байт

{_,,:).%}

Анонимный блок, который ожидает массив в стеке и заменяет его выходным массивом.

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

объяснение

{       }    e# Define block
 _           e# Duplicate
  ,          e# Length
   ,         e# Range, 0-based
    :)       e# Add 1 to each entry
      .%     e# Vectorized modulus





1

GNU APL 1.2, 9 байт

(⍳⍴R)|R←⎕

APL работает справа налево, отсюда и круглые скобки.

R←⎕назначает пользовательский ввод для вектора R.

⍴Rдает длину вектора; ⍳⍴Rдает вектор со всеми числами от 1 до этой длины (поэтому индексы).

|является оператором мод ( a|bвыходов b%a). APL работает с массивами, поэтому код отрывает вектор, содержащий каждый элемент из пользовательского ввода, его индекс.





1

Брайнгольф , 18 байт

V1R&,{v.m1+v%}&,=;

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

объяснение

V1R&,{v.m1+v%}&,=;  Implicit input from commandline args
V1R                 Create stack2, push 1 to it, and return to stack1
   &,               Reverse stack1
     {.......}      Foreach loop, runs for each item in stack1
      v             Switch to stack2
       .m           Duplicate last item on stack and move duplicate to stack1
         1+         Increment last item on stack
           v%       Return to stack1, pop last 2 items and push modulus result
              &,    Reverse stack1
                =   Output stack1
                 ;  Suppress implicit output

1

Java 8 / C #, 39 байт

a->{for(int i=0;i<a.length;a[i]%=++i);}

Попробуй это здесь.

Также работает в C #, заменяя ->на =>и lengthс Length:

a=>{for(int i=0;i<a.Length;a[i]%=++i);}

Попробуй это здесь.

Объяснение:

a->{                       // Method with integer-array parameter and no return-type
  for(int i=0;i<a.length;  //  Loop over the indexes of the array (0-indexed)
      a[i]%=++i            //   And replace every integer with itself mod (1+i)
  );                       //  End of loop
}                          // End of method

Изменяет массив ввода, отсюда и отсутствие возврата.


1
По сути, то, что я сделал бы в C # +1, также может прокомментировать, что это работает и для C #, если вы измените -> на =>и используете заглавные буквы length.
TheLethalCoder
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.