Rasyonel Sayım İşlevi


11

Doğal bir sayı alan (0 dahil) başlayan ve sırasıyla pay ve payda olan bir çift pozitif tamsayı döndüren bir işlev oluşturun. Çapraz geçişi kullanın. Önceki sayılan sayılar atlanmalıdır. (atlanan değerler kümesini ezberleyebilirsiniz)

Diyagram:

resim açıklamasını buraya girin

Kırmızı, atlanan değerlerdir

Değerler:

  • f (0) = 1, 1
  • f (1) = 2,1
  • f (2) = 1,2
  • f (3) = 1,3
  • f (4) = 3, 1 (atlamaya dikkat edin)
  • f (5) = 4, 1
  • f (6) = 3, 2
  • f (7) = 2,3
  • f (8) = 1, 4
  • f (9) = 1,5
  • f (10) = 5, 1 (atlamaya dikkat edin)

Varsa Rasyonel veri yapısını ve işlemlerini kullanabilirsiniz. En kısa kod kazanır.


1
Her bir diyagonaldeki sayılan rasyonel sayıların sayısı, o diyagonalin ortak toplamının totient fonksiyonudur.
Leaky Nun

Bu zorluğun eski olduğunu biliyorum, ancak kabul edilenden daha kısa bir cevap var, bu yüzden tekrar kabul etmek isteyebilirsiniz.
Esolanging Fruit

Yanıtlar:


4

J, 41 36 karakter

Bir tamsayı alır ve iki tamsayı içeren bir vektör döndürür. Ne tamamen örtük ne de tamamen açık olan ilk çözümüm.

{3 :'~.;<`(<@|.)/.(,%+.)"0/~1+i.1+y'

İşte uygun olan yerlerde boşluklar eklenmiş çözüm:

{ 3 : '~. ; <`(<@|.)/. (, % +.)"0/~ 1 + i. 1 + y'

Bir açıklama:

  1. x (, % +.) y- pay xve paydalı kesri temsil eden uzunluk 2'nin bir vektörü yen küçük paydaya indirgenmiştir
  2. 1 + i. 1 + yArasındaki tam sayıların -a vektör 1içiny + 1
  3. (, % +.)"0/~ 1 + i. 1 + yAralığında indirgenmemiş payda ve pay tüm indirgenmiş fraksiyonların -a matris 1için y + 1.
  4. <`(<@|.)/. y–Bir matrisin eğik köşegenleri dizisi y, her biri çapraz köşegen
  5. ~. ; y- kopyaları kaldırılmış öğelerin bir vektörüne daraltılmış bir dizi diyagonal
  6. x { yPozisyonda -the madde xiçindey
  7. (u v) y- ile aynı y u v y. Bu özel kullanım durumunda, uolduğu {ve volduğu3 : '~. ; <`(<@|.)/. (, % +.)"0/~ 1 + i. 1 + y'


8

Haskell, 78 karakter

q(r,f)=[(r-b,b)|b<-f[1..r-1],r`gcd`b==1]
d=reverse:id:d
f=((zip[2..]d>>=q)!!)

Örnek çalışma:

> map f [0..10]
[(1,1),(2,1),(1,2),(1,3),(3,1),(4,1),(3,2),(2,3),(1,4),(1,5),(5,1)]
> f 100
(17,1)
> f 1000
(3,55)

  • Düzenleme: (100 → 87) aptal bana, sadece gcd test yeter!
  • Düzenleme: (87 → 85) zekice numara cycleve alternatif sıra düzeni işlevleri
  • Düzenleme: (85 → 82) cycleel yapımı sonsuz listeyle değiştird
  • Düzenle: (82 → 78) uygulanan gcdkimlik Matías tarafından önerilen

Tanım olarak, gcd (r-b) b == gcd r bdört karakteri daha tıraş edebilirsiniz.
Matías Giovannini

3

Python, 144 karakter

def F(i):
 r,d,z=[1],1,[]
 while z[:i]==z:z+=[(x,y)for x,y in zip(r[::d],r[::-d])if all(x%j+y%j for j in r[1:])];d=-d;r+=[r[-1]+1]
 return z[i]

2

Yakut 1.9, 109 106

F=->n{x=y=d=1
e=0
n.times{(x+=d).gcd(y+=e)>1&&redo
x<2?d<0?d=0:(d,e=1,-1):y<2?e<0?e=0:(d,e=-1,1):0}
[x,y]}

2

OCaml + Piller, 182 168 karakter

Haskell'de doğal olan budur, ancak OCaml'de ancak zar zor mümkündür:

open LazyList
let rec r(i,j)=lazy(let a,b=if(i+j)mod 2=0then i,j else j,i in
Cons((a,b),filter(fun(c,d)->a*d<>c*b)(r(if j=1 then 1,i+1else i+1,j-1))))
let f=nth(r(1,1))

Düzenleme: Diyagonal gereksiz


0

Perl 6 , 75 bayt

{(({|(1…($+=2)…1)}…*)Z/(1,{|(1…(($||=1)+=2)…1)}…*)).unique[$_]}

Dene

Bu temelde tüm rasyonel değerler dizisini oluşturur, ancak endeksli değer üretildiğinde durur.

( Başka bir meydan okuma için benim golf dayanarak .)

Expanded:

{  # bare block lambda with implicit parameter $_

  (
      ( # sequence of numerators

        {
          |( # slip into outer sequence (flatten)

            1      # start at one
            
            (
              $    # state variable
              += 2 # increment it by two each time this block is called
            )
            
            1      # finish at one
          )

        }
         * # never stop generating values
      )


    Z/   # zip using &infix:« /  » (generates Rats)


      ( # sequence of denominators

        1,  # start with an extra one

        {
          |( # slip into outer sequence (flatten)

            1
            
            (
              ( $ ||= 1 ) # state variable that starts with 1 (rather than 0)
              += 2        # increment it by two each time this is called
            )
            
            1
          )
        }
         * # never stop generating values
      )


  ).unique                # get only the unique values
  .[ $_ ]                 # index into the sequence
}

({1…($+=2)…1}…*)sonsuz sayı dizisi oluşturur ( |(…)düzleştirmek için yukarıda kullanılır)

(1 2 1)
(1 2 3 4 3 2 1)
(1 2 3 4 5 6 5 4 3 2 1)
(1 2 3 4 5 6 7 8 7 6 5 4 3 2 1)
(1 2 3 4 5 6 7 8 9 10 9 8 7 6 5 4 3 2 1)

(1,{1…(($||=1)+=2)…1}…*) sonsuz payda dizisi üretir

1
(1 2 3 2 1)
(1 2 3 4 5 4 3 2 1)
(1 2 3 4 5 6 7 6 5 4 3 2 1)
(1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1)
(1 2 3 4 5 6 7 8 9 10 11 10 9 8 7 6 5 4 3 2 1)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.