Узагальнені п'ять тридцять вісім послідовностей


17

Адаптовано з цієї загадки FiveThirtyEight .

Фон

Вивчіть таку нескінченну послідовність:

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

Скажімо, послідовність є 1-індексованою. iЕ число в послідовності визначає , скільки 3років існує до iго 2і після всіх попередніх 2с. Отже, оскільки послідовність починається з 3послідовності, повинна починатися, 3 3 3 2а оскільки 3на початку послідовності є три s, то послідовність 3 3 3 2повинна повторюватися три рази. Після цього ви досягнете, 3 3 2тому що четверте число в послідовності є 2.

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

Давайте загалом

За даними числами, nі kми можемо скласти подібну послідовність, яка починається з nі точно так само, як описана в початковій послідовності цифра в індексі iвизначає, скільки ns з'явиться перед ith kі після будь-яких попередніх ks.

Приклади:

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-індексовано, тоді обмеження iє 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

Це код гольфу на кожній мові, тому найкоротший код у кожній мові є переможцем.



Я рекомендую дозволити пару цілих чисел як співвідношення, потребуючи відповідників розділяти числа на /або :просто додавати зайве ускладнення виклику.
Ерік Аутгольфер

@EriktheOutgolfer також дозволено десятковий номер
dylnan

Чи є стандартний поплавок достатньо точним для десяткового виведення?
Відновіть Моніку - немайнард

@iamnotmaynard Я не суворо щодо плаваючого формату, так так, так, я думаю, що так
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)

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

Кредити


Чи не повинно бути .count(n)?
Колера Су

@ColeraSu Дякую Не знаю, як я пропустив це, виправлено.
Ніл


@ColeraSu Дякую, оновлено. Я спробую почати використовувати exec. Це досить круто.
Ніл


4

Желе , 22 байти

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

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

Повна програма. Приймає аргументи n, k, i.

Існує помилка, яка робить цю необхідність зайвою на 1 байт.


Використовували деякі свої хитрощі - приємно. Цікаво, що насправді має бути правильне виправлення помилки ...
Джонатан Аллан

@JonathanAllan Те, що мене вразило, - це ця лінія , хоча я не впевнений, чому розміщення `змушує її працювати. О, і де ваша відповідь відрізняється в тому , що я забув реалізувати в гольф , я знайшов на іншій мові> _>
Ерік Outgolfer

4

Желе ,  25  16 байт

-9 байт ~ 50%, що можна віднести до відповіді Еріка Елголфер (Jelly) (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

Свіфт , 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.

Безумовно

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.