昇順行列


17

「昇順行列」は、任意の要素がそれぞれの行と列で以前に使用されていない最小の利用可能な要素である整数の無限行列(0を含む)です。

  | 1 2 3 4 5 6 ...
--+----------------
1 | 0 1 2 3 4 5 ...
2 | 1 0 3 2 5 4 ...
3 | 2 3 0 1 6 7 ...
4 | 3 2 1 0 7 6 ...
5 | 4 5 6 7 0 1 ...
6 | 5 4 7 6 1 0 ...
. | ...............

あなたの仕事は、入力で指定された行と列にある要素を出力するプログラムを書くことです。(標準入出力)

テストケース:

5 3 -> 6
2 5 -> 5

コードゴルフルールが適用されます。最短のコードが優先されます。

PSこれがアルゴリズムの性質を持っている場合でも、コードは非常簡潔になります。

編集:私はXORソリューションをそれほど早く見るとは思っていませんでした。私は、アルゴリズム的アプローチとTHEN the xorソリューションを含む10の投稿を期待していました。さて、異なる言語でxorを書く方法を見るのはあまり面白くないことを念頭に置いて、アルゴリズムによるアプローチも試してみることをお勧めします。

だから、はい、誰も5文字のマークを打つことはできないと思います。そのため、Ilmari Karonenが最も賢明で最短のソリューションであることを祝福します。しかし、先に新しい課題があります:最短のアルゴリズムソリューションを記述します


5
Xorはアルゴリズムです。
ピーターテイラー

回答:


10

GolfScript、5文字

~(\(^

実際、パターンを認識すれば、このタスクは非常に簡単です。唯一の厄介なビットは1から始まるインデックスです。入力インデックスがゼロから始まる場合、この2文字のソリューションで十分です。

~^

GolfScriptに不慣れな読者にこれを説明するために、~コマンドは入力を評価し、2つの数字をスタックに残します。 ^次に、スタック上の最上位の2つの数値をXORし、結果を出力します。1から始まる入力を処理するには、さらに2つのコマンドが必要です。(スタックの一番上の番号を1つ減らし、スタックの一番\上の2つの項目をスワップします。


1
説明してください^。私はと呼ばGolfScriptビルトインページ対称差。この操作を2組の配列で使用するのは理にかなっていますが、2つの個別の数値に対してどのように機能するか理解できません。
ロブ

1
@Mike:数値に適用すると、^演算子はビット単位のXORを返します。
イルマリカロネン

それは非常にクールな関係です:)
beary605

1
私の回答の評価は正しかったのですが、チャレンジの誤読に基づいているため削除しました。
DavidC

2

Mathematica 10 44

編集

私の最初の応答は、Ilmariが指摘したように、チャレンジの性質についての誤解に基づいていました。別の試みがあります。

使用法

f[n___, 1, n___] := n - 1;
j_~f~k_ := BitXor[j - 1, k - 1]

@IlmariKaronen今回は正解だったと思う。しかし、それはあなたのソリューションのサイズにさえ近くなりません。
DavidC


2

PHP、38

Ilmari KaronenのXORの単純な実装

<?php echo --$_GET['a']^--$_GET['b']?>

使用法:

... / xor.php?a = 4&b = 7

6を印刷します


2

ハスケル174

XORに依存しないソリューションを作成すると思いました。適切にゴルフするのが面倒。

a 0 0=0
a b c
 |m==n=a(b-m)(c-n)
 |m>n=m+a(b-m)c
 |m<n=n+a b(c-n)
 where{g f=until(>f)(*2)1`div`2;m=g b;n=g c;}
main=do
 [x,y]<-fmap(map read.words)getLine
 print$a(x-1)(y-1)

編集: 1日後、これは単にXORを計算していることに気付きました。したがって、これがアルゴリズム的ソリューションとしてカウントされる場合、Ilmari Karonenのソリューションもカウントする必要があります。


2
適切にゴルフするのが面倒。-あなたの提出物をゴルフしてください。
ジョナサンフレッチ

2

Python 2、36

Pythonを学び始めたばかりなので、これを使用して最初の回答を送信するのに最適な時期であり(Pythonを使用して誰も回答していない)、おそらくフィードバックを受け取ることができると思います。

@IlmariKaronen、とてもクールなショートカットをありがとう。

下のコードをありがとう@Gareth

import sys
print(input()-1^input()-1)

Python 3、56

私が書いた元のプログラム。

import sys
x=int(input())
y=int(input())
x-=1
y-=1
print(x^y)

IDEONE 2および5

IDEONE 3および3


Python 3ではなくPython 2を使用していると仮定しています-このコメントを無視しない場合。input入力はすでに評価されているため、int()必要はありません。また、intを直接取得しているinput()ので、-1すぐに実行できます。また、中間変数を完全に削除して、に進むこともできますprint(input()-1^input()-1)。インポートが必要かどうかについて-このサイトの他のPythonユーザーはを使用するプログラムにはインポートしませんinput()が、私はPythonプログラマーではないので、必要かどうかは言えません。
ガレス

@Gareth実際、私はPython 3を使用していましたが、使用する提案が好きprint(input()-1^input()-1)です。お手伝いありがとう!
ロブ

なぜ輸入するのかと聞いてもいいsysですか?
ジョナサンフレッチ




弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.