Обобщенные последовательности FiveThirtyEight


17

Адаптировано из этой загадки FiveThirtyEight .

Фон

Изучите следующую бесконечную последовательность:

3 3 3 2 3 3 3 2 3 3 3 2 3 3 2 3 3 3 2 ...

Допустим, последовательность имеет 1 индекс. Число ith в последовательности определяет, сколько 3s существует до ith 2и после любых предыдущих 2s. Таким образом, поскольку последовательность начинается с a, 3последовательность должна начинаться, 3 3 3 2и поскольку 3в начале последовательности есть три s, подпоследовательность 3 3 3 2должна повторяться три раза. После этого вы достигнете, 3 3 2потому что четвертый номер в последовательности 2.

Загадка FiveThirtyEight требует ограничения отношений троек и двоек (что я не буду здесь баловать), но вы также можете спросить, каково совокупное соотношение после индекса i. Например, соотношение в i=4это 3/1 = 3и в i=15это 11/4 = 2.75.

Давай вообще

С учетом числа nи kмы можем сделать подобную последовательность , которая начинается с nи так же , как исходная последовательность описана число в индексе iопределяет , сколько nей показать до iго kи после всех предыдущих kс.

Примеры:

n=2, k=5 дает последовательность 2 2 5 2 2 5 2 2 2 2 2 5 2 2 5 ...

n=3, k=0 дает 3 3 3 0 3 3 3 0 3 3 3 0 0 3 3 3 0 ...

n=1, k=3 дает 1 3 1 1 1 3 1 3 1 3 1 3 1 1 1 3 1 ...

Соревнование

Напишите функцию / программу и с ней сделайте следующее. Взять в качестве ввода:

  • целое положительное число n
  • неотрицательное целое число k ≠ n
  • целое положительное число i > n

Первые два входа nи kопределяют последовательность, как описано выше, и iявляется индексом. Я использую 1-индексацию в примерах, но вы можете свободно использовать 0- или 1-индексацию. Если 0-индексированные то ограничение на iIS i ≥ n.

С помощью трех чисел выведите отношение ns к ks в последовательности, включая число в индексе i. Формат вывода может быть либо десятичным значением с точностью не менее 5 цифр, либо точным значением в виде отношения типа 3524/837или 3524:837.

В десятичной форме последняя цифра может быть округлена, как вам нравится. Конечные нули и пробелы разрешены.

В любой из строковых форм два числа должны быть нормализованы так, чтобы они были взаимно простыми. Например, если соотношение было 22/4 11/2и 11:2приемлемо, но 22/4это не так.

Примеры

n   k   i      output
2   4   15     2.75     or   11/4
6   0   666    5.1101   or   557:109
50  89  64     63       or   63:1
3   2   1000   2.7453   or   733/267
9   12  345    9.4545   or   104/11

Это код гольф для каждого языка, поэтому самый короткий код на каждом языке является победителем.



Я рекомендую разрешить пару целых чисел как отношение, требуя, чтобы ответчики разделяли числа с /или :просто добавляли ненужное усложнение к задаче.
Эрик Outgolfer

@EriktheOutgolfer разрешено и десятичное число
dylnan

Достаточно ли точно стандартное число с плавающей запятой для десятичного вывода?
Восстановить Монику - Нотмайнард

@iamnotmaynard Я не строг в отношении формата float, так что да, я так думаю
dylnan

Ответы:


5

Шелуха , 16 байт

¤/#ωȯ↑⁰J¹`C∞²N¹²

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

Принимает входные данные в том же порядке, что и контрольные примеры. Выводит рациональное число. Я чувствую, что здесь слишком много надстрочных знаков, но я не знаю, как от них избавиться ...

объяснение

¤/#ωȯ↑⁰J¹`C∞²N¹²  Inputs are n, k, i.
             N    Starting with the natural numbers [1,2,3..
   ωȯ             do this until a fixed point is reached:
                    Argument is a list s.
           ∞²       Take the infinite list [n,n,n..
         `C         and split it to the lengths in s.
       J¹           Join the resulting blocks with k.
     ↑⁰             Take the first i elements.
                  Call the result x.
¤             ¹²  For each of n and k,
  #               count their number of occurrences in x
 /                and perform exact division on the results.

4

Python 3 , 94 92 89 87 байт

def g(n,k,i):o,t=[n],0;exec('o+=[n]*o[t]+[k];t+=1;'*i);return-1-i/(o[1:i+1].count(n)-i)

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

кредиты

  • Уменьшено с 94 до 92 байт: Colera Su .
  • Уменьшено с 92 до 89 байт: dylnan .
  • Уменьшено с 89 до 87 байт: овс .

Не должно ли это быть .count(n)?
Колера Су

@ColeraSu Спасибо. Не знаю, как я это пропустил, исправлено.
Нил


@ColeraSu Спасибо, обновлено. Я постараюсь начать использовать exec's. Это круто.
Нил


4

Желе , 22 байта

³ẋЀ;€⁴Ẏḣ⁵
ẋ`;ÇÐLLƙ`÷/

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

Полная программа. Принимает аргументы n, k, i.

Есть ошибка, из-за которой это должно быть излишне длиннее на 1 байт.


Использовал некоторые твои трюки - приятно. Хотите знать, каким должно быть правильное исправление ошибки ...
Джонатан Аллан

@JonathanAllan Что меня поразило, так это строка , хотя я не уверен, почему `ее использование работает. Да, и ваш ответ отличается от того, что я забыл внедрить гольф, который нашел на другом языке> _>
Эрик Игрок в гольф

4

Желе ,  25  16 байтов

-9 байт ~ 50%, относящиеся к ответу Эрика Эголога на желе (1. быстрое использование ключа new-ish ƙдаже с ошибкой в ​​интерпретаторе, которая в настоящее время стоит байт; 2. использование сопоставленного повторения, чтобы избежать подсчета и индексации в текущей последовательности .) Иди дай ему кредит!

³ẋЀj⁴ṁ⁵µÐLLƙ`÷/

Полная программа принимает три аргумента: n, k, iкоторый выводит результат.

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

Как?

³ẋЀj⁴ṁ⁵µÐLLƙ`÷/ - Main link
        µ        - monadic chain separation
         ÐL      - apply the monadic chain to the left repeatedly until no change occurs:
³                -   program's 1st argument, n
  Ѐ             -   map across the current sequence (initially just n)
 ẋ               -     repeat (the first run give triangle of n i.e. [[n],[n,n],...,[n]*n]
     ⁴           -     program's 2nd argument, k
    j            -     join
       ⁵         -     program's 3rd argument, i
      ṁ          -     mould like (repeat the list to fill, or cut it, to length i)
            ƙ    - keyed application, map over groups of identical items:
             `   - (this has an arity of 2, make it monadic by repeating the argument)
           L     -   length -> [numberOfNs, numberOfKs]
               / - reduce with:
              ÷  -   division -> [numberOfNs / numberOfKs]
                 - implicit print (a single item list just prints its content)

Пример запуска с входами n=2, k=3, i=30:

Start the "loop until no change", ÐL
Note: Initial left argument, n=2, implicitly range-ified by Ѐ to become [1,2]
1. mapped repeat of n: [[2],[2,2]]
          join with k: [2,3,2,2]
         mould like i: [2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3]

2. mapped repeat of n: [[2,2],[2,2,2],[2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2],[2,2,2]]
          join with k: [2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,3,2,2,2]
         mould like i: [2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,3,2]
                          ^different to previous result

3. mapped repeat of n: [[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2,2],[2,2]]
          join with k: [2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2]
         mould like i: [2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2]
                                  ^different to previous result

4. mapped repeat of n: [[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2,2],[2,2]]
          join with k: [2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2]
         mould like i: [2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,3,2]
                                                      ^different to previous result

5. mapped repeat of n: [[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2,2],[2,2],[2,2],[2,2,2],[2,2]]
          join with k: [2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2]
         mould like i: [2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,2,3,2,2,3,2,2,3,2,2,3,2]
                       all the same as the previous result; stop loop and yield this.

length applied to equal elements: [length([2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]), length([3,3,3,3,3,3,3,3,3])]
                                = [21,9]
reduce by division              = [21/9] = [2.3333333333333335]
implicit print                  2.3333333333333335


2

APL (Dyalog Unicode) , 126 70 байт

k n i←⎕
j←⍴v←⍬
:While j<i
v,←k,⍨n⍴⍨{v≢⍬:jvn}j+←1
:End
÷/+/¨n k⍷¨⊂jv

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

Что ж, спасибо @ Adám за удаление 56 байтов из этого ответа.

Это niladic Tradfn ( трады itional х unctio п ) с 1 входом, который является списком 3 элемента.

⎕PP←5не добавляются к счетчику байт , так как он используется только для ограничения Р Ринт P recision до 5 цифр.

∇fи не добавляются в счетчик байтов, потому что они не являются частью кода, а только разделителями для tradfn.

Как это устроено:

k n i←⎕                    Take input (←⎕) for k, n and i.
j←⍴v←⍬                     Assign (←) an empty vector (⍬) to v, then assign its shape (⍴, which is 0) to j.
:While j<i                 while j<i, do:
v,←k,⍨n⍴⍨{v≢⍬:jvn}j+←1  this:
                     j+←1  increment j (+←1)
          {v≢⍬:     }      if (:) v does not match (≢) 
               jv         return the jth element of v (v[j])
                  n       else (⋄) return n
      n⍴⍨                  shape (⍴) n as the result (repeats n result times)
   k,⍨                     append (,⍨) k
v,←                        append to (,←) v
:End                       End while loop
÷/+/¨n k⍷¨⊂jv             then:
           jv             shape (⍴) v as j (truncates v to j elements)
                          enclose the resulting vector
         ¨                 for each element
                          find (returns a boolean vector)
     n k                   n and k (⍷ will return a boolean vector for each)
  +/¨                      cumulative sum of each vector (returns the number of times n and k appear in v)
÷/                         divide them and implicitly return the result.


0

Swift , 152 байта

func f(n:Int,k:Int,i:Int){var a=[0];(1...i).map{a+=(0..<(a.count>$0 ?a[$0]:n)).map{_ in n}+[k]};let m=a[1...i].filter{n==$0}.count;print("\(m)/\(i-m)")}

Это будет короче чем Java?

объяснение

func f(n:Int,k:Int,i:Int){
  var a=[0]                                    // Initialize the array (the zero is to
                                               //  define the type of the array and will be
                                               //  ignored by the code)
  (1...i).map{                                 // Repeat i times (more than enough):
    a+=(0..<(a.count>$0 ?a[$0]:n)).map{_ in n} //  Add the right amount of n:s to the array
      +[k]                                     //  Add k to the array
  }                                            // End repeat
  let m=a[1...i].filter{n==$0}.count           // Count the amount of n:s in the first
                                               //  i elements of the array
  print("\(m)/\(i-m)")                         // Print the result
}



0

Зефир , 284 байта

input n as Integer
input k as Integer
input m as Integer
set s to Array(m)
for i from 1 to n
set s[i]to n
next
set s[i]to k
set N to n
set K to 1
for a from 2 to m
for b from 1 to s[a]
inc i
if i<=m
set s[i]to n
inc N
end if
next
inc i
if i<=m
set s[i]to k
inc K
end if
next
print N/K

Берет три числа из стандартного ввода в три отдельные строки. Выводит точное соотношение, такое как 104/11или 63.

Ungolfed

input n as Integer
input k as Integer
input maxIndex as Integer

set sequence to Array(maxIndex)
for i from 1 to n
    set sequence[i] to n
next
set sequence[i] to k

set nCount to n
set kCount to 1

for a from 2 to maxIndex
    for b from 1 to sequence[a]
        inc i
        if i <= maxIndex
            set sequence[i] to n
            inc nCount
        end if
    next
    inc i
    if i <= maxIndex
        set sequence[i] to k
        inc kCount
    end if
next

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