{0、3、2、5、0、3、5、1、4、6、2、4}の最短表現


24

与えられた整数のリスト{0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4}。これらの数字に興味がある人のために平日の計算に使用されます。

Weekday = (m[n] + d + y + y>>2 + y/400 - y/100) % 7;m[n]where-検索する式、-day dof month、y- year - (month <= 2)

算術演算子、論理演算子、ビット単位演算子で構成される式を作成します。これらの演算子は、リストのn番目の数値に等しくnなるmように正の整数を出力しm % 7ます。

分岐、三項演算子、テーブル検索、およびポインターは許可されていません。

スコア:
1- | & ^ ~ >> <<オペレーター
1.1- + - < > <= >= == != ! && ||オペレーター
1.2- *オペレーター
1.4- / %オペレーター

最も低い得点で答えます。

個人的に私は見つけた:

(41*n)>>4+((n+61)>>4)<<2スコア6.4。これを見つけるのは難しいだろうと思ったので、そもそも独自の表現を提供しました。


配列の逆参照(および同族)も許可されていませんか?
ジョンド

ああ、もちろん、私は質問を編集しました。
ソムニウム14

6
この質問は、何らかの動機付けによって大幅に改善されます。それらの数字はどこから来たのですか?
ピーターテイラー14

table lookups私が思う面白い言い回しは...
ɐɔıʇǝɥʇuʎs

4
スコアの%7をカウントしないのはなぜですか?たぶん、%を使用しない別の解決策があるかもしれません。ゼロは正、負、両方またはゼロですか?
トーマスウェラー14

回答:


34

2 2.2

私は任意精度の計算が大好きです。

0x4126030156610>>(n<<2)

または、16進数が気に入らない場合は、

1146104239711760>>(n<<2)

テスト:

print([(0x4126030156610>>(n<<2))%7 for n in range(1,13)])
[0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4]

4*n代わりにルックアップテーブルを作成し、次のように記述して0.2ポイント節約できますn<<2か?
xnor 14

@xnor絶対に!8進数から16進数に切り替えるだけです。ちょうど秒
isaacg 14

クール。1つの操作を使用するだけでよいため、何も改善できないと確信しています7。また、すべての構造modが多すぎるようです。私の整数階除算の最良の候補はconst/n、とに矛盾しn=4ていn=8ます。
xnor 14

@xnorもう1つの近いものはconst%n、n = 1,2および3を除くすべてを満たすことができます。
isaacg14年

...私は同じことを行うつもりだったが、あなたはそれに私を打つ
ɐɔıʇǝɥʇuʎs

32

2.0

(127004 >> i) ^ 60233

または(スコア2.2):

(i * 3246) ^ 130159

すべてが総当たりで見つかりました:-)


これはisaacgの回答と同じスコアを持っていますが、64ビット整数を使用していないため、これを承認済みの回答として選択しています。答えてくれてありがとう!
ソムニウム14

8
@ user2992539この回答が32ビット整数を使用するのは良いことですが、チャレンジでこの基準を指定しなかったため、isaacgの回答が完全に有効になります。したがって、2つの答えは同点であり、このスコアを獲得した最初のものを受け入れることは公正だと思います。(ただし、スーパーシャフインに称賛、+ 1!)
マーティンエンダー14

@ m.buettner私はあなたに同意しなければなりません。次回は、説明と回答の選択にもっと注意します。
ソムニウム14

他の人が学ぶために、ブルートフォース計算をどのように行ったかについて詳しく説明していただけますか?
トーマスウェラー14

@Thomas私は二重forループを作り、式のすべての値p、qをテストして(p >> i) ^ qからコーヒーを飲みに行き、結果を読んでから10分後になりました。
アルノー14

8

35.3

これは、リストを作成するための最も効率の悪い方法であると思われます。

1.7801122128869781e+003 * n - 
1.7215267321373362e+003 * n ^ 2 + 
8.3107487075415247e+002 * n ^ 3 - 
2.0576746235987866e+002 * n ^ 4 + 
1.7702949291688071e+001 * n ^ 5 + 
3.7551387326116981e+000 * n ^ 6 - 
1.3296432299817251e+000 * n ^ 7 + 
1.8138635864087030e-001 * n ^ 8 - 
1.3366764519057219e-002 * n ^ 9 + 
5.2402527302299116e-004 * n ^ 10 - 
8.5946393615396631e-006 * n ^ 11 -
7.0418841304671321e+002

多項式回帰を計算しました。私は他にどんなひどい方法が試みられるのか見てみたいと思います。

特に、結果が丸められた場合、3.3ポイントを節約できました。この時点では、それは重要ではないと思います。


5

3.2

ゼロベースのソリューション:

7 & (37383146136 >> (i*3))

1つのソリューション:

7 & (299065169088 >> (i*3))

最初は %7操作も同様にカウントさ%れ、ここでは高価な操作であるそれなしで解決しようとしました。

次のような3.2の結果になりました。

// Construction of the number
// Use 3 bits per entry and shift to correct place
long c = 0;
int[] nums = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
for (int i = nums.Length - 1; i >= 0; i--)
{
    c <<= 3;
    c += nums[i];
}
// c = 37383146136

// Actual challenge
for (int i = 0; i < 13; i++)
{
    Console.Write("{0} ",7 & 37383146136 >> i*3);
}

このアプローチを使用した最適化に興味があります(なし%)。ありがとう。


これはクールです。多分これは私をいつか助けてくれるでしょう)あなたはどう思いますか、多分数式全体の最小化のために別の質問を作成する必要がありますか?
ソムニウム14

1
どう(0426415305230 >> (i*3)) & 7?出力数字を逆順に見ることができます。
CJデニス14

@CJDennis:C#には8進数はないと思います。
トーマスウェラー14

ただのCだと思った?C#への他の参照は表示されません。
CJデニス14

0

Python(3)

最近ではこれらの質問がかなりあるので、3(または2)トークンで自動的に解決するプログラムを作成することにしました。このチャレンジの結果は次のとおりです。

G:\Users\Synthetica\Anaconda\python.exe "C:/Users/Synthetica/PycharmProjects/PCCG/Atomic golfer.py"
Input sequence: 0 3 2 5 0 3 5 1 4 6 2 4
f = lambda n: (72997619651120 >> (n << 2)) & 15
f = lambda n: (0x426415305230L >> (n << 2)) & 15
f = lambda n: (0b10000100110010000010101001100000101001000110000 >> (n << 2)) & 15

Process finished with exit code 0

これが機能することの証明:

f = lambda n: (72997619651120 >> (n << 2)) & 15

for i in range(12):
   print i, f(i)

0 0
1 3
2 2
3 5
4 0
5 3
6 5
7 1
8 4
9 6
10 2
11 4

ソルバーはオペランドのコストをどのように考慮しますか?
トーマスウェラー14

しゅう そうではなく、常に右シフト、おそらく左シフト(値が1ビットでない場合)とを使用し&ます。
ɐɔıʇǝɥʇuʎs
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.