Uogólnione sekwencje FiveThirtyEight

17

Na podstawie tej zagadki FiveThirtyEight .

tło

Sprawdź następującą nieskończoną sekwencję:

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

Powiedzmy, że sekwencja ma indeks 1. Liczba ith w sekwencji określa, ile 3s jest przed ith 2i po poprzednich 2. Ponieważ sekwencja zaczyna się 3od sekwencji, sekwencja musi się rozpocząć, 3 3 3 2a ponieważ 3na początku sekwencji znajdują się trzy s, podsekwencja 3 3 3 2musi się powtórzyć trzy razy. Po tym osiągasz, 3 3 2ponieważ czwarta liczba w sekwencji to 2.

Zagadka FiveThirtyEight pyta o limit stosunków trzy do dwójki (których tutaj nie zepsuję), ale możesz też zapytać, jaki jest łączny stosunek po indeksie i. Na przykład stosunek co i=4się znajduje 3/1 = 3i co i=15to jest 11/4 = 2.75.

Przejdźmy do generała

Podane numery ni kmożemy zrobić podobną sekwencję, która zaczyna się ni tak jak oryginalna sekwencja opisana numer w indeksie iokreśla ile ns pokazać się przed iTH ki po wszelkie wcześniejsze ks.

Przykłady:

n=2, k=5 podaje sekwencję 2 2 5 2 2 5 2 2 2 2 2 5 2 2 5 ...

n=3, k=0 daje 3 3 3 0 3 3 3 0 3 3 3 0 0 3 3 3 0 ...

n=1, k=3 daje 1 3 1 1 1 3 1 3 1 3 1 3 1 1 1 3 1 ...

Wyzwanie

Napisz funkcję / program i wykonaj następujące czynności. Weź jako dane wejściowe:

  • dodatnia liczba całkowita n
  • nieujemna liczba całkowita k ≠ n
  • dodatnia liczba całkowita i > n

Pierwsze dwa wejścia ni kokreślenia sekwencji, jak opisano powyżej, a ijest wskaźnikiem. Korzystam z indeksowania 1 w przykładach, ale masz swobodę korzystania z indeksowania 0 lub 1. Jeśli indeksowane jest 0, to ograniczenie ijest włączone i ≥ n.

Z trzema liczbami wyprowadza się stosunek ns do ks w sekwencji do liczby włącznie z indeksem i. Format wyniku może być albo wartością dziesiętną z co najmniej 5 cyframi dokładności, albo dokładną wartością w stosunku 3524/837lub 3524:837.

W postaci dziesiętnej ostatnią cyfrę można zaokrąglić w dowolny sposób. Końcowe zera i białe znaki są dozwolone.

W każdej z form ciągu dwie liczby muszą zostać znormalizowane, aby były chronione prawem autorskim. Na przykład, jeśli stosunek wynosił 22/4 11/2i 11:2jest akceptowalny, ale 22/4nie jest.

Przykłady

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

Jest to kod golfowy w każdym języku, więc zwycięzcą jest najkrótszy kod w każdym języku.

dylnan
źródło
Polecam dopuszczenie pary liczb całkowitych jako proporcji, wymagając od autorów odpowiedzi oddzielenia liczb za pomocą /lub :po prostu dodaje niepotrzebnej komplikacji do wyzwania.
Erik the Outgolfer,
@EriktheOutgolfer dozwolona jest również liczba dziesiętna
dylnan
Czy standardowa liczba zmiennoprzecinkowa jest wystarczająco dokładna dla wyjścia dziesiętnego?
Przywróć Monikę - nie
@iamnotmaynard Nie jestem surowy w kwestii formatu float, więc tak, tak myślę
dylnan

Odpowiedzi:

5

Łuska , 16 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe w tej samej kolejności co przypadki testowe. Zwraca liczbę wymierną. Wydaje mi się, że ma za dużo indeksów górnych, ale nie wiem, jak się ich pozbyć ...

Wyjaśnienie

¤/#ωȯ↑⁰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.
Zgarb
źródło
4

Python 3 , 94 92 89 87 bajtów

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)

Wypróbuj online!

Kredyty

  • Zmniejszony z 94 do 92 bajtów: Colera Su .
  • Zmniejszony z 92 do 89 bajtów: dylnan .
  • Zmniejszono z 89 do 87 bajtów: ovs .
Neil
źródło
Nie powinno tak być .count(n)?
Colera Su
@ColeraSu Dzięki. Naprawdę nie wiem, jak mi tego brakowało.
Neil,
92 bajty .
Colera Su
@ColeraSu Dzięki, zaktualizowano. Spróbuję zacząć używać exec. To fajnie.
Neil,
89 bajtów
dylnan,
4

Galaretka , 22 bajty

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

Wypróbuj online!

Pełny program Bierze argumenty n, k, i.

Istnieje błąd, który powoduje, że ta potrzeba niepotrzebnie musi być dłuższa o 1 bajt.

Erik the Outgolfer
źródło
Użyłem niektórych twoich sztuczek - fajnie. Zastanawiasz się, jaka powinna być naprawdę poprawka dla błędu ...
Jonathan Allan,
@JonathanAllan Uderzyła mnie ta linia , choć nie jestem pewien, dlaczego wprowadzenie znaku `sprawia, że ​​działa. Aha, a twoja odpowiedź różni się tym, że zapomniałem zaimplementować golfa, który znalazłem w innym języku> _>
Erik the Outgolfer
4

Galaretka ,  25  16 bajtów

-9 bajtów ~ 50% przypisywanych odpowiedzi Erik the Outgolfer's Jelly (1. szybkie użycie nowego klucza, ƙnawet z błędem w tłumaczu kosztującym obecnie bajt; 2. użycie odwzorowanego powtórzenia, aby uniknąć liczenia i indeksowania do bieżącej sekwencji .) Idź, daj mu trochę uznania!

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

Pełen program, biorąc trzy argumenty: n, k, iktóry drukuje wynik.

Wypróbuj online!

W jaki sposób?

³ẋЀ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)

Przykładem prowadzony z wejściami 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
Jonathan Allan
źródło
3

Mathematica, 85 bajtów

(s={#};Do[s=Join[s,#~Table~s[[t]],{#2}],{t,#3}];Last@@Ratios@Tally@s[[#+3;;#3+#+2]])&

Wypróbuj online!

J42161217
źródło
2

APL (Dyalog Unicode) , 126 70 bajtów

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

Wypróbuj online!

Dzięki @ Adám za usunięcie 56 bajtów z tej odpowiedzi.

To niladic Tradfn ( upr itional F unctio n ) przy 1 wejście, które jest lista 3 elementem.

⎕PP←5nie dodaje się do liczby bajtów, ponieważ jest on używany tylko do ograniczenia P rukuj P recision do 5 cyfr.

∇fi nie są dodawane do liczby bajtów, ponieważ nie są częścią kodu, a jedynie ogranicznikami dla tradfn.

Jak to działa:

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.
J. Sallé
źródło
1

R , 88 bajtów

function(n,k,i){s=rep(n,n);for(j in 1:i){s=c(s,k,rep(n,s[j]))};z=sum(s[1:i]==n);z/(i-z)}

Wypróbuj online!

duckmayr
źródło
możesz pozbyć się nawiasów klamrowych wokół forkorpusu pętli, ponieważ istnieje tylko jedna instrukcja.
Giuseppe,
0

Szybki , 152 bajty

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)")}

Czy będzie krótszy niż Java?

Wyjaśnienie

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
}
Herman L.
źródło
0

Rubinowy , 77 71 70 bajtów

->n,k,i{r=[n]
i.times{|c|r+=[n]*r[c]+[k]}
1r*(j=r[1,i].count n)/(i-j)}

Wypróbuj online!

Zwraca wartość wymierną, która działa zarówno jako liczba, jak i uściśla do dokładnie zredukowanej części.

Przywróć Monikę - notmaynard
źródło
0

Pyth , 24 bajty

AEtcH/e.u<sm+*d]QGNH]Q)G

Zestaw testowy.

Stały punkt [n]pod pewną funkcją tablicy.

Leaky Nun
źródło
0

Zephyr , 284 bajty

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

Pobiera trzy liczby ze standardowego wejścia na trzy osobne linie. Wysyła dokładny stosunek, taki jak 104/11lub 63.

Bez golfa

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
DLosc
źródło