Ne Tuhaf Bir İşlev


45

Buradaki göreviniz , pozitif tamsayılar üzerinde bir permütasyon oluşturan bir işlevi 1 uygulamak olacaktır (pozitif tamsayılardan kendilerine yapılan bir eşekarısı). Bu, her pozitif tamsayının permütasyonda tam olarak bir kez görünmesi gerektiği anlamına gelir. Yakalama, işlevin, tek bir sayıdan tek bir sayı çıktısı alma olasılığına sahip olması gerektiğidir.

Şimdi bu garip veya imkansız görünebilir. Kuşkusuz, sayılar kadar tuhaf sayılar da var mı? Ve bu sezgi sonlu kümeler için doğru olsa da, aslında sonsuz kümeler için geçerli değildir. Örneğin, şu izni al:

1 3 2 5 7 4 9 11 6 13 15 8 17 19 10 21 23 12 25 27 14 29 31 16 33 35 18 37 39 20 41 43 22 45 47 24 49 51 26 53 55 ...

Eğer daha boyut daha sonra ile dizinin herhangi alt bölümünü ele alırsak 1 Eğer, hatta sayılar gibi birçok tek sayı olarak en az olacak böylece tuhaf olmanın herhangi rastgele dönem olasılığı bile olmaktan daha büyük olduğu görülmektedir. Ayrıca, her sayı tek veya çift sayının sonunda sırayla görüneceğini ve yalnızca bir kez görünebileceğini not edersiniz. Böylece dizi gerçek bir permütasyondur.

Olasılığın Tanımı

Karışıklık veya belirsizlikten kaçınmak için, bu sorudaki ihtimalin ne anlama geldiğini açıkça ortaya koyacağım.

Bir fonksiyonumuz olduğunu varsayalım f . Bir dizi olasılığı tek resim boyutuna grubu oranı tek elemanlarının limiti olarak tanımlanacak olan f{1n} olarak n sonsuza doğru gitmektedir.

limn|{x:x{1n},odd(f(x))}|n

Örneğin, yukarıda bahsedilen fonksiyonun 2/3 tuhaf olma ihtimali vardır .


Bu bu nedenle cevaplar daha az byte'ın daha iyi olmasıyla byte olarak puanlanacaktır.


Ekstra Zorluklar

İşte oynamak için bazı eğlenceli fikirler ve belki de uygulamaya çalışın. Bunlar sadece eğlence içindir ve puanlamayı hiçbir şekilde etkilemez. Bunlardan bazıları, bu zorluğa yönelik geçerli çözümler bile değildir ve yalnızca 2 veya 3 numaralı zorluğa çözüm içeren bir cevap geçerli bir cevap değildir ve silinmesi muhtemeldir .

  • Tuhaf bir olasılık olan olan bir permütasyon yaz . (Bu mümkün)1

  • Herhangi bir için içindeki tek sayılardan bile daha fazla tuhaf sayı içeren ancak olasılık tuhaf bir permütasyon yazınız .f{1n}n1/2

  • Tanımlanmış olasılığı olmayan bir permütasyon yazınız (sınır yoktur).


1: Burada işlev program veya işlev anlamına gelir. Bu sadece girdi alan ve çıktı üreten bir kod parçasıdır.

Yanıtlar:


22

Jöle , 7 bayt

Æf^<¥4P

Swaplar 2 s ve 3 girişin asal çarpanlara s. Oran olasılığı 2/3 .

Çevrimiçi deneyin!

Nasıl çalışır

Æf^<¥4P  Main link. Argument: n

Æf       Compute all prime factors of n, with duplicates.
    ¥4   Combine the two links to the left into a dyadic chain and call it with
         right argument 4.
   <       Compare each prime factor with 4. Yields 1 for 2 and 3, 0 otherwise.
  ^        Bitwise XOR the results with the corresponding prime factors.
         This maps 2 to 3, 3 to 2, and all other primes to themselves.
      P  Take the product of the resulting primes.

Bu cevap oldukça zekice. Neden işe yaradığını anlıyorum ama işe yaradığına dair bir kanıt eklemek isteyebilirsiniz, çünkü ilk başta sezgisel buldum.
Buğday Sihirbazı

6
Bunun bir permütasyon olduğunun kanıtı: fonksiyon kendi tersidir. Oran kanıtı: bir çıktının tuhaf olma ihtimali, orijinalin hiçbir faktör 3'e sahip olmadığı ve tam olarak üçe bölünmediği zaman olan bir şanstır. Bu şans 2/3.
17'de

15

Kabuğu , 11 10 bayt

Leo sayesinde -1 bayt ve biraz farklı bir işlev

Bu garip bir olasılık var 1

!uΣz:NCNİ1

Çevrimiçi deneyin!

Diziyi endeksler:

[1,2,3,5,7,9,11,4,13,15,17,19,21,23,25,27,29,6,31,33]
1 odd, 1 even, 5 odd, 1 even, 9 odd, 1 even, 13 odd...

açıklama

!               Index the following sequence (1-indexed)
 u              remove duplicates                     [1,2,3,5,7,9,11,4,13,15...]
  Σ              Concatenate                          [1,1,2,3,5,3,7,9,11,4,13..]
   z:            Zipwith append                       [[1,1],[2,3,5],[3,7,9,11]..
     N          Natural numbers
      CNİ1      Odd numbers cut into lists of lengths [[1],[3,5],[7,9,11]...]
                corresponding to the Natural numbers

1
Fonksiyonu açıklar mısın?
Buğday Sihirbazı,


8

Haskell, 35 34 32 bayt

f n=n:2*n+1:2*n+3:f(n+2)
(f 0!!)

Örnek diziyi uygular [1,3,2,5,7,4,9,11,6,13,15,8,17,19,10,21,...].

Çevrimiçi deneyin!

Referans için: eski sürüm, 34 bayt (@xnor sayesinde -1 bayt):

(!!)$do e<-[0,2..];[e,2*e+1,2*e+3]

Çevrimiçi deneyin!


Bir paren kaydetme:(!!)$do ...
xnor

8

Kabuğu , 8 bayt

!uΣzeİ1N

Çevrimiçi deneyin!

Bu, örnek diziyi ( 1,3,2,5,7,4...) uygular .

açıklama

!uΣzeİ1N
   ze       zip together
     İ1       the odd numbers
       N      with the natural (positive) numbers
  Σ         flatten the resulting list
 u          remove duplicates
!           index into the obtained sequence with the input

7

Herkes Challenge 1'i yapar, öyleyse diğer ikisini de yapalım.

Perl 6 , 26 bayt - 2. zorluk

{($_==1)+$_-(-1)**($_%%2)}

Çevrimiçi deneyin!

Sadece 1 3 2 5 4 7 6...çift ​​sayıda terimde, her zaman çiftten iki garip sayı daha vardır. Tek numarada 1 tane daha. Ancak bunun açıkça bir sınırı vardır (n+2)/(2n+2) -> ½.


Perl 6 , 70 bayt - Görev 3

{((1,),(2,4),->@a,@ {@(map(@a[*-1]+2*(*+1),^(4*@a)))}...*).flat[$_-1]}

Çevrimiçi deneyin!

Kuşkusuz, bu korkunç bir golf. 2⁰ tek sayı, sonra 2¹ çift, sonra 2² tek, sonra 2³ çift vb. İçeren bir dizini endeksler.

N'den sonra "2" + 2 blocks + ... + 2ⁿ⁻¹) / (2ⁿ-1) gibi "bloklar" ndan sonraki olasılık. Paydaki toplam ⅓ (4 ½ (n + 1) - 1) = ⅓ (2 n + 1 - 1) 'e eşittir . Yani tek sayıda bloktan sonra olasılık the (sınırda).

Bununla birlikte bir blok daha eklersek (ve n + 1'e eşit bir sayı atarsak), tek sayılar eklemedik (payer aynı kalır) ancak şimdi toplam (2 n + 1 - 1) sayı vardır . Parantezler iptal edildi ve biz ⅓ (sınırda) olasılığını alıyoruz.

Bunun, sınırın mevcut olmadığından emin olmak için ⅓ ve ⅔ olmak üzere 2 farklı küme noktasına sahip olduğu sanılıyor, ancak bu gerçekten kanıtlamıyor. Sağlam, titiz bir kanıt yapma girişimi bu Math'da bulunabilir. Cevap: https://math.stackexchange.com/a/2416990/174637 . Hatalı hatalar açıktır.


Perl 6 , 39 bayt - Çekirdek mücadelesi.

{my$l=$_ div 3;$_%3??2*($_-$l)-1!!2*$l}

Çevrimiçi deneyin!

Bu cevabı hoş bir küçük matematik bulgusu sunan 2 ve 3 numaralı zorluklar nedeniyle göndermeme rağmen, tüm cevapların temel mücadeleye bir çözüm içermesi için katı bir gereklilik var. İşte o zaman.

Bu örnek dizilimdir.


2
Bunlar ekstra zorluklar. Bunun geçerli bir cevap olması için, ana zorluğa bir çözüm sağlamalısınız. 1'e meydan okumak için bir çözüm aynı zamanda temel mücadeleye yönelik bir çözümdür, ancak 2 veya 3 numaralı mücadelelere çözüm değildir.
Peter Taylor

1
Ekstra zorluklar, bu soruda benim için ilginç olan şey. Çekirdek zorluk değil. Ama yine de bazı çözümler ekledim.
Ramillies

Challenge 3'e verdiğiniz cevabın bu Math.SE sorusunda sınırsız olduğuna dair bir kanıt istedim: math.stackexchange.com/questions/2416053/…
Kevin -

@Kevin, sorduğun için teşekkürler. Sanırım kafamı karıştırmış olabilirim. İyi olduğuna emindim. Tek şey, kendim için, sadece gönül rahatlığı için oldukça titizlikle kanıtladığım şeydir (çünkü ayaklarınız oldukça kolay, özellikle de bunun gibi sonsuz nesneleri tutarken kolayca kayabilir) - ve burada yapmadım. Tüm söylemek istediğim buydu.
Ramillies

1
@Kevin - Sonuçta tembelliğimi aştım (kahramanca bir iş!) Ve ispat ettim. Math.SE sorunuza cevap olarak gönderdim. Umarım sorun yok (bu tür işleri gece yapmak gerçekten iyi bir fikir değil: --)). İlk başta düşündüğüm kadar korkunç olmadığı ortaya çıktı.
Ramillies

5

Brain-Flak , 120 bayt

(({})<{{({}[()]<({}(()[{}]))>)}{}({}[({})]<({}<>{}<({}())>)><>)}>)<>({}[()]){{}((<>{}<>[{}]){}[()])<>}{}{(({}){})<>{}}<>

Çevrimiçi deneyin!

Aşağıdaki işlevi gerçekleştirir:

fonksiyon

Bu işlev diziyi oluşturur

2 4 1 6 3 5 7 8 9 11 13 15 17 19 21 10 23 25 27 29...

Fonksiyonun garip bir olasılığı vardır 1



3

C (gcc) , 29 bayt

f(n){return n&3?n+n/2|1:n/2;}

Çevrimiçi deneyin!

Her dördüncü sayı bile:

1 3 5   7 9 11   13 15 17   19 21 23   25 27 29
      2        4          6          8          10

Ekstra zorluk 1, 52 bayt

f(n,i){for(i=0;n>>i/2;i+=2);return n&n-1?2*n-i-1:i;}

Çevrimiçi deneyin!

N, 2 x'e ve ardışık tek sayılara eşitse, 2 * (x + 1) değerini döndürür:

    1   3 5 7   9 11 13 15 17 19 21    23 25
2 4   6       8                     10      

3

Brain-Flak , 140 138 136 bayt

({}<(((()())()()))((<>[()])[()()])>){({}[()]<(({}(({}({}))[({}[{}])]))[({}[{}])]<>(({}(({}({}))[({}[{}])]))[({}[{}])])<>)>)}{}({}<{}{}>)

Çevrimiçi deneyin!

açıklama

Bu, soruda önerilene benzer bir işlev görür.

2 3 1 4 7 5 6 11 9 8 15 13 10 17 15 ...

Çoğunlukla 3 boyut yığınları için yığını rulo yapmak için yaptığım bir snippet'e dayanarak çalışır.

(({}(({}({}))[({}[{}])]))[({}[{}])])

Biri akümülatör değerlerine sahip (iki tane tek, biri çift) ve biri sayılarla iki yığın oluşturduk 4 4 2. Her yineleme, her iki yığını da yuvarlar ve sol yığının üstünü sağ yığının üstüne ekler.

(({}(({}({}))[({}[{}])]))[({}[{}])]<>(({}(({}({}))[({}[{}])]))[({}[{}])])<>)

Bu, her bir tuhaf sayıyı 4 ve bir de 2 sayıyı arttıracaktır. Böylece biz sadece döngü nile kat ngirişi olmak. Bunun 2/3 asimptotik bir olasılığı var .


2

Jöle , 10 bayt

ÆE;0ṭ2/FÆẸ

Oran olasılığı 2/3 .

Çevrimiçi deneyin!

Nasıl çalışır

ÆE;0ṭ2/FÆẸ  Main link. Argument: n

ÆE          Compute the exponents of n's prime factorization.
  ;0        Append a 0.
     2/     Reduce all pairs by...
    ṭ         tack, appending the left argument to the right one.
            This inverts all non-overlapping pairs of exponents.
       F    Flatten the result.
        ÆẸ  Consider the result a prime factorization and compute the corresponding
            integer.

1

C, 80 bayt

#define R if(k++==n)return
i,j,k;f(n){for(i=k=1,j=2;;i+=4,j+=2){R i;R i+2;R j;}}

Sorudan örnek izin uygulamasının uygulanması.

Çevrimiçi deneyin!


1

Toplu, 36 bayt

@cmd/cset/an=%1*2,(-~n*!!(n%%3)+n)/3

Soruda verilen sırayı uygular.


1

JavaScript, 23 bayt

n=>n/2+n/2%2+(n%4&&n-1)

Çıktı: 1, 3, 5, 2, 7, 9, 11, 4, 13, 15, 17, 6, 19, 21, 23, 8 ...

  • Tüm n = 4k için:
    • f (n) = n / 2 = 2k
  • Tüm n = 4k + b
    • f (n) = n / 2 + b / 2 + n - 1 = 3/2 * (4k + b) + 1/2 * b - 1 = 6k + 2b - 1

2. meydan okuma:

n=>n^(n>1)

Çıktı: 1, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14


n=>n%4?1.5*n|1:n/25 bayt daha kısa.
nwellnhof

1

CJam (21 bayt)

{2b_(&!\_,2*\1$~+2b?}

İlk 32 çıktıyı gösteren çevrimiçi demo . Bu anonim bir bloktur (fonksiyon).

Bu aynı zamanda 1'e meydan okumak için bir çözümdür: eşit sayılara eşlenen sayılar 2'nin güçleridir, bu nedenle ilk n çıktıdaki çift sayıların yoğunluğu sıfıra eğilimli olan lg (n) / n'dir.

teşrih

{         e# Declare a block; let's call the input x
  2b      e#   Convert to base 2
  _(&     e#   Copy, pull out first digit (1) and set intersection with rest
  !       e#   Boolean not, so empty set (i.e. power of 2) maps to 1 and non-empty
          e#   to 0
  \_,2*   e#   Take another copy, find its length, and double it
  \1$~+   e#   Take the original base 2 array and append ~(2L) = -2L-1
  2b      e#   Convert from base 2, to get 2x-2L-1
  ?       e#   Take the 2L if it was a power of 2, and the 2x-2L-1 otherwise
}

1

Perl 40 bayt

$,=$";$i=4;{say$i-3,$i/2,($i+=4)-5;redo}

1

Beyin-Baca , 88 bayt

({}<(((<>)[()])[()()])>)<>(((()())()()))<>{({})({})({})({}[()]<({}<>({})<>)>)}{}{}({}){}

Çevrimiçi deneyin!

açıklama

Bu benim son cevabımla aynı işlevi yerine getiriyor, ancak bazı köşeleri kesmek için Brain-Flueue'nin FIFO modelini kullanıyor. İşte onun ürettiği ilk çift terimleri.

2 3 1 4 7 5 6 11 9 8 15 13 10 17 15 ...

Kodun ilk kısmı sadece bir miktar kurulum, 0,-1,-3birinci yığına ve 2,4,4ikinci yığına koyduk . 2,4,4Benim Beyin Flak cevap yaptıkları gibi çift ve tek sayılar arasında geçiş yapmak için kullanılacaktır.

Daha sonra her seferinde sol yığının tepesini sağ yığına ekleyerek n kere döngü yaparız. Beyin-Baca, ekstra kod ihtiyacını önleyerek onlara dokunduğumuzda doğal olarak yuvarlanan değerleri istiflemenin aksine kuyruklar kullandığından.


Flueue ve Flak arasındaki fark nedir?
FantaC

@tfbninja Flueue, yığın yerine Queue kullanır.
Buğday Sihirbazı

ama ... bflk yorumlayıcısını kullanıyorsunuz ... nasıl farklılaştırıyorsunuz
FantaC

@tfbninja -lflueueArgüman.
Buğday Sihirbazı,

0

Python 2 , 46 104 55 bayt

lambda n:2*((n-int(n**.5))+.5,n**.5-1)[n!=1>0==n**.5%1]

Çevrimiçi deneyin!

Soruyu yanlış anlayın, şimdi bir sekans üreten yerine sekans üretmek için kullanılabilecek bir fonksiyon düzgün bir şekilde uygulandı. Ayrıca 0olası çıkışlar grubundan çıkarılmıştır .

Şimdi garip bir pozitif tamsayı bulma olasılığı şu anda yakınlaşıyor 1.


Bu, anladığım kadarıyla bir set / liste değil, bir sayı döndürmelidir
Bay Xcoder

Ayrıca, bu içerdiği için doğru bir permütasyon değildir 0.
Bay Xcoder

@ Mr.Xcoder Fark ettiğiniz için teşekkürler.
Jonathan Frech



0

Pyth , 9 bayt

*Fmxd<d4P

Burada dene! veya Tek seferde daha fazlasını test edin!

Tekli sayıların belirli bir noktaya oranını doğrulamak için bu kodu kullanabilirsiniz. Yedek 10000istediğiniz limitli (çok daha yüksek koymayın bellek hataları yüzünden).

Km*Fmxk<k4PdS10000clf%T2KlK

Burada dene .

Yukarıdaki kabaca 0.667 verir . Garip olayların gerçek olasılığı 2/3 . Bu yaklaşım Dennis'in cevabının eşdeğer bir uygulamasıdır .


açıklama

*Fmxd<d4P   Full program.

        P   Prime factors.
  m         Map over ^.
   x        Bitwise XOR between:
    d          The current prime factor.
     <d4       The integer corresponding to the boolean value of current factor < 4.
*F          Product of the list.


0

Lua, 67 53 bayt

Açıklama bu golf bitirdiğimde geliyor :)

Bu program komut satırı argümanları üzerinden girdi olarak bir tamsayı alır ve örnek dizinin element elemanını STDOUT'a yazdırır

n=...print(n%3<1 and n/3*2or n+math.floor(n/3)+n%3-1)

açıklamalar

n=...                              -- shorthand for the argument
print(                             -- prints out the result of the following ternary
     n%3<1                         -- if n is divisible by 3
       and n/3*2                   -- prints out the corresponding even number
       or n+math.floor(n/3)+n%3-1) -- else prints out the odd number

Bu dizinin çift sayılar her ikisi de ninci çift sayı ve ndolayısıyla, formül 3'e ait birden fazla n%3*2bunları üretmek için yeterlidir.

Tek sayılar için biraz daha zor. Akıntıya bağlı olarak onları bulabileceğimiz gerçeğine dayanarak n, aşağıdaki tabloya sahibiz:

n       |  1   2   4   5   7   8   10   11  
target  |  1   3   5   7   9   11  13   15
target-n|  +0  +1  +1  +2  +2  +3  +3   +4

Let çağrısı değeri target-n i, her zaman görebilirsiniz n%3==2, iartırılır. İşte formülümüz var:

n+math.floor(n/3)+n%3-1

Tek sayılar, neklediklerimizi temel almaktadır i.

iÖtelemeli bölünme ile aynı oranda, ofset ile 3'lük artışların değeri . math.floor(n/3)bize artış oranını n%3-1verir ve bize n%3==2yerine ötelemeyi sağlar n%3==0.


Gereksiz bir boşluğu kaldırarak bir bayt kolayca kaydedilebilir ( ...and (n/...).
Jonathan Frech

and n/3*2or
@JonathanFrech
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.