なんて奇妙な機能


45

ここでのタスクは、正の整数の順列(正の整数から自身への全単射)を形成する関数1を実装することです。これは、各正の整数が順列で1回だけ現れることを意味します。キャッチは、関数が偶数よりも奇数を出力する確率が大きいことです。

今、これは奇妙または不可能に見えるかもしれません。確かに偶数と同じくらい多くの奇数がありますか?そして、この直観は有限集合に対しては正しいが、実際には無限集合に対しては成り立たない。たとえば、次の順列を取ります。

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 ...

サイズがを超えるシーケンスのサブセクションを使用すると、少なくとも偶数と同じ数の奇数があります。したがって、ランダム項が奇数である確率は偶数である確率よりも大きいようです。また、すべての数字の奇数または偶数が最終的にシーケンスに表示され、一度しか表示できないことに注意してください。したがって、シーケンスは真の順列です。1

確率の定義

混乱やあいまいさを避けるために、この質問で確率が意味するものを明確に説明します。

関数があるとしましょう。数の確率は、奇数セットのサイズに設定さの比奇数メンバーの限界として定義されているとして無限大に向かう傾向があります。ff{1n}n

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

たとえば、前述の関数の確率は2/3奇数になります。


これはため、回答はバイト単位でスコアリングされ、バイト数が少ない方が優れています。


追加の課題

ここでは、遊んでみて、おそらく実装しようとするいくつかの楽しいアイデアを紹介します。これらは単なる楽しみのためであり、スコアリングには影響しません。これらのいくつかは、このチャレンジに対する有効なソリューションでさえありません。チャレンジ2または3に対するソリューションのみを含む回答は有効な回答ではなく、削除される可能性があります

  • 1奇数確率で順列を記述します。(これは可能です)

  • 任意のについて、に偶数よりも奇数の数が多いが、確率が順列を記述します。f{1n}n1/2

  • 定義された確率のない順列を記述します(つまり、制限はありません)。


1:ここでは、関数はプログラムまたは関数を意味します。入力を受け取り、出力を生成するコードの一部にすぎません。

回答:


22

ゼリー、7バイト

Æf^<¥4P

入力の素因数分解で2秒と3秒を入れ替えます。オッズの確率は2/3です。

オンラインでお試しください!

使い方

Æ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.

この答えは非常に賢明です。私はそれがなぜ機能するのか理解していると思いますが、最初は直感的ではないことがわかったので、あなたはそれが機能するという証拠を含めたいかもしれません。
小麦ウィザード

6
これが順列であることの証明:関数はそれ自身の逆です。比率の証明:出力が奇数である可能性は、元の要素に因子3がなかった可能性です。これは、正確に3で割り切れない場合です。そのチャンスは2/3です。
tomsmeding

15

11 10バイト

レオのおかげで-1バイト、わずかに異なる機能

これは、奇数の確率を持っています 1

!uΣz:NCNİ1

オンラインでお試しください!

シーケンスにインデックスを付けます:

[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...

説明

!               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
機能を説明してもらえますか?
小麦ウィザード

nubを使用することで1バイト少なくなります:tio.run
Leo


8

、8バイト

!uΣzeİ1N

オンラインでお試しください!

これにより、シーケンス例(1,3,2,5,7,4...)が実装されます。

説明

!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

誰もがチャレンジ1を行うので、他の2つをやってみましょう。

Perl 6、26バイト—チャレンジ2

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

オンラインでお試しください!

それはちょうどだ1 3 2 5 4 7 6...用語の偶数であってもより多くの2つの奇数番号は常にあります。奇数では、さらに1つです。ただし、これには明らかにの制限があり(n+2)/(2n+2) -> ½ます。


Perl 6、70バイト—チャレンジ3

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

オンラインでお試しください!

確かに、これは恐ろしくゴルフです。2⁰の奇数、2¹の偶数、2²の奇数、2³の偶数などを含むシーケンスにインデックスを付けます。

n個のこのような「ブロック」の後の確率は、nが奇数の場合、(2⁰+2²+2⁴+ ... +2ⁿ⁻¹)/(2ⁿ-1)です。分子の合計は、⅓(4½(n + 1) -1)=⅓(2 n + 1-1)に等しくなります。したがって、奇数ブロック後の確率は⅔(制限内)です。

ただし、ブロックをもう1つ追加して(それらの偶数カウントをn + 1にすると)、奇数は追加しませんでした(分子は同じまま)が、合計で(2 n + 1-1)の数があります。括弧はキャンセルされ、⅓(限界内)の確率が得られます。

制限が存在しないことを確認するために、これは明らかに2つの異なるクラスターポイント、⅓とhaveを持っているはずですが、実際にはそれを証明していません。堅牢で厳密な証明を行うための私の試みは、このMath.SEの回答:https ://math.stackexchange.com/a/2416990/174637にあります。バッシングミスは大歓迎です。


Perl 6、39バイト—コアチャレンジ。

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

オンラインでお試しください!

心地よい小さなパズルを提供する課題2および3のためにこの回答を掲載しましたが、すべての回答にはコア課題の解決策を含めるための厳しい要件があります。ここにあります。

これはシーケンス例です。


2
これらは追加の課題です。これが有効な答えであるためには、主要な課題に対する解決策を提供する必要があります。課題1の解決策もコアの課題の解決策ですが、課題2または3の解決策はそうではありません。
ピーターテイラー

1
まあ、余分な課題は、私にとってこの質問で興味深いものです。中心的な課題はそうではありません。しかし、とにかくいくつかのソリューションを追加しました。
ラミリーズ

:私はチャレンジ3にあなたの応答は、このMath.SEの質問には制限がないことを証明を求めmath.stackexchange.com/questions/2416053/...
復活モニカ-ケビン

@ケビン、質問してくれてありがとう。私はあなたを混乱させたかもしれないと思う。大丈夫だと確信していました。唯一のことは、心の平安のためだけに、私はしばしば非常に厳密に物事を証明することです(特に、このような無限のオブジェクトを扱うときは、足が簡単に滑る可能性があるため)。それがすべて私が言いたかったことです。
ラミリーズ

1
@Kevin —結局、私は怠​​lazを克服し(英雄的な行為です!)、その証拠を作りました。Math.SEの質問に対する回答として投稿しました。うまくいけば大丈夫です(夜にこの種の作業を行うのは、あまり良い考えではありません:—))当初考えていたほど恐ろしくはないことが判明しました。
ラミリーズ

5

Brain-Flak、120バイト

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

オンラインでお試しください!

次の機能を実行します。

関数

この関数はシーケンスを生成します

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

関数の確率は奇数です 1


4

R、82バイト(追加のチャレンジ1)

f<-function(n){if(sqrt(n)==floor(sqrt(n))){2*sqrt(n)}else{2*(n-floor(sqrt(n)))-1}}

オンラインでお試しください!

入力が完全な正方形の場合、偶数を返します。そうでなければ、奇数を与えます。完全な二乗の密度は0です。これは、このシーケンスが確率1で奇数を与えることを意味します。


TIOリンクを追加してください。
H.PWiz




3

C(gcc)、29バイト

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

オンラインでお試しください!

4番目の数字はすべて偶数です。

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

追加チャレンジ1、52バイト

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

オンラインでお試しください!

nが2 xに等しい場合は2 *(x + 1)を返し、そうでない場合は連続する奇数を返します。

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

3

脳フラック140の 138 136バイト

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

オンラインでお試しください!

説明

これにより、質問で提案された機能と同様の機能が実行されます。

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

これは主に、サイズ3スタックのスタックをロールするために作成したスニペットに基づいて機能します。

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

2つのスタックに1つのアキュムレータ値(2つの奇数、偶数)と1つの数値を設定します4 4 2。各反復では、両方のスタックをロールし、左スタックの上部を右スタックの上部に追加します。

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

これにより、各奇数が4ずつ増加し、1つの偶数が2ずつ増加します。ループを繰り返すと、すべての正の整数がヒットする2奇数1偶数のパターンが得られます。したがって、私たちだけのループnを持つ回n入力されています。これには2/3の漸近確率があります。


2

ゼリー、10バイト

ÆE;0ṭ2/FÆẸ

オッズの確率は2/3です。

オンラインでお試しください!

使い方

Æ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

バッチ、36バイト

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

質問で指定されたシーケンスを実装します。


1

JavaScript、23バイト

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

出力:1、3、5、2、7、9、11、4、13、15、17、6、19、21、23、8 ...

  • すべてのn = 4kの場合:
    • f(n)= n / 2 = 2k
  • すべてのn = 4k + b
    • f(n)= n / 2 + b / 2 + n-1 = 3/2 *(4k + b)+ 1/2 * b-1 = 6k + 2b-1

課題2:

n=>n^(n>1)

出力:1、3、2、5、4、7、6、9、8、11、10、13、12、15、14


n=>n%4?1.5*n|1:n/25バイト短くなります。
nwellnhof

1

CJam(21バイト)

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

最初の32個の出力を示すオンラインデモ。これは匿名ブロック(関数)です。

これは、チャレンジ1の解決策でもあります。偶数にマップされた数値は2のべき乗であるため、最初のn個の出力の偶数密度はlg(n)/ nであり、ゼロになる傾向があります。

解剖

{         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バイト

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

1

Brain-Flueue、88バイト

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

オンラインでお試しください!

説明

これは前回の回答と同じ機能を実装しますが、Brain-FlueueのFIFOモデルを使用していくつかのコーナーをカットします。以下に、生成される最初の2つの用語を示します。

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

コードの最初の部分はほんの少しのセットアップで0,-1,-3、最初のスタックと2,4,42番目のスタックに配置します。2,4,4私は私の脳高射砲の答えにやったとして偶数と奇数を循環するために使用されます。

次に、n回ループし、そのたびに左スタックの上部を右スタックに追加します。Brain-Flueueはスタックではなくキューを使用しているため、値に触れると自然にロールが発生し、余分なコードが不要になります。


FlueueとFlakの違いは何ですか?
FantaC

@tfbninja Flueueは、スタックではなくキューを使用します。
小麦ウィザード

しかし... bflkインタープリターを使用しています...どのように変更しますか
-FantaC

@tfbninja -lflueue引数。
小麦ウィザード

0

パイソン246 104 55のバイト

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

オンラインでお試しください!

シーケンスを生成する関数の代わりにシーケンスを生成するために使用できる関数を適切に実装した質問を読み違えました。0可能な出力のセットからも除外されます。

奇数の正の整数を見つける確率はに収束し1ます。


これは、これまで私が理解できるようにと数ではなく、セット/リストを返すべきである
氏Xcoder

また、これにはが含まれて0いるため、正しい順列ではありません。
氏Xcoder

@ Mr.Xcoder気づいてくれてありがとう。
ジョナサンフレッチ



0

Pyth、9バイト

*Fmxd<d4P

ここで試してみてください!または一度にもっとテストしてください!

このコードを使用して、特定のポイントまでの奇数の比率を確認できます。10000希望する制限に置き換えます(メモリエラーが発生するため、これ以上高く設定しないでください)。

Km*Fmxk<k4PdS10000clf%T2KlK

ここで試してみてください

上記の結果は約0.667です。奇数発生の真の確率は2/3です。このアプローチは、デニスの答えと同等の実装です。


説明

*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バイト

私がこれをゴルフし終わったときに来る説明:)

このプログラムは、入力としてコマンドライン引数を介して整数を受け取り、exempleシーケンスのn番目の要素をSTDOUTに出力します

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

説明

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

このシーケンスの偶数は、nth番目の偶数とn3 の倍数の両方であるため、式n%3*2を生成するのに十分です。

奇数の場合、それはもう少し難しいです。現在nに応じてそれらを見つけることができるという事実に基づいて、次の表があります:

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

レッツ・コール値がtarget-n i、私たちは、それぞれの時間があることがわかりますn%3==2iインクリメントされます。式があります:

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

奇数nは、追加に基づいていiます。

値はiオフセットと3によるユークリッド除算と同じレートでインクリメントします。math.floor(n/3)は、増加率とn%3-1オフセットを提供し、のn%3==2代わりに発生しますn%3==0


不要なスペース(...and (n/...)を削除すると、1バイトを簡単に節約できます。
ジョナサンフレッチ

@JonathanFrechは全くとして括弧を削除することで、この地点に2を保存することができたand n/3*2orだけで罰金として作品
Katenkyo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.