自乗した対角線上の位置を出力


18

数値nを指定すると、n*n正方行列のいずれかの対角要素に該当する1ベースのインデックスの順序付きリストを出力します。

例:

入力の場合3

正方形は:

1 2 3
4 5 6
7 8 9

ここで\/またはで表されるすべてのインデックスを選択しますX#または非対角位置は拒否されます)

\ # /
# X #
/ # \

出力は次のとおりです。

[1,3,5,7,9]

テストケース:

1=>[1]
2=>[1,2,3,4]
3=>[1,3,5,7,9]
4=>[1,4,6,7,10,11,13,16]
5=>[1,5,7,9,13,17,19,21,25]

受け入れられる回答はありません。各言語の最短コードを知りたい。


1
質問は、画像内の\、/、およびX文字の(1-indexed)インデックスを求めています。それ自体は悪い質問ではありませんが、説明はありません。
アルフィー

あなたが望むものの簡潔で明確な説明を提供したい場合、それは悪い挑戦ではないので、おそらくこれを再開します。今のところ、それだけで非常に不明瞭である
氏Xcoder

混乱を避けるために、サンプル領域からasciiイメージを移動することもできますが、再開することに投票しました。最初はそれらも作成する必要があるかどうかはわかりませんでした(ただし、必要な出力はインデックスのリストにすぎないことを理解しています)
-Arfie

7
順序は重要ですか?
ミスターXcoder

9
FWIW私は順序がより興味深いgolfs ...とは無関係かもしれないメイクもあると思います
ジョナサン・アラン

回答:



7

JavaScript(ES6)、48バイト

整数のダッシュ区切りリストを文字列として出力します。

f=(n,k=n*n)=>--k?f(n,k)+(k%~-n&&k%-~n?'':~k):'1'

書式設定およびコメント化

f = (n, k = n * n) => // given n and starting with k = n²
  --k ?               // decrement k; if it does not equal zero:
    f(n, k) + (       //   return the result of a recursive call followed by:
      k % ~-n &&      //     if both k % (n - 1) and
      k % -~n ?       //             k % (n + 1) are non-zero:
        ''            //       an empty string
      :               //     else:
        ~k            //       -(k + 1) (instantly coerced to a string)
    )                 //   end of iteration
  :                   // else:
    '1'               //   return '1' and stop recursion

テストケース


区切り記号として記号を使用して、素敵な回避策。bitwsie &を使用してバイトを保存できますか?
シャギー

@Shaggyいいえ、それは機能しません。例えば:4%3および4%5一般的には1ビットを有していないが、両方が非ゼロです。
アーナルド

うん、テストしてみてn=5、うまくいかないことを見つけた。
シャギー

k%~-n&&k%-~n動作するはずです。セパレータを使った素敵なトリック!
タイタス

@Titusゴルフに関しては本当に重要なことではありませんが... ...そう、それは少し読みやすいかもしれません。:
アーナウド

7

R38 35 34 38バイト

which関数の存在を思い出したときに3バイトが節約されました...、@ Riftのおかげで1バイトが節約されました

d=diag(n<-scan());which(d|d[n:1,])

ec=Tによって完全なプログラムとして呼び出されたときの引数に+4バイトsource()

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

説明:

n<-scan()            # take input
d=diag(n);           # create an identity matrix (ones on diagonal, zeros elsewhere)
d|d[n:1,]            # coerce d to logical and combine (OR) with a flipped version
which([d|d[n:1,]])   # Find indices for T values in the logical expression above

1
-1バイトd=diag(n<-scan());which(d|d[n:1,])
リフト

これを完全なプログラム(source)として実行すると、何も出力されません。電話をする必要がありますcatmetaのこの投稿を参照してください。
JAD

@JarkoDubbeldamまあまあ!TIOで有効な出力が得られることを常に念頭に置いて作業していましたが、「完全なプログラム」であるという要件を実際に考えたことはありませんでした。
user2390246

私は戻ってこれを修正するために私の古い答えをすべて編集するつもりはありませんが!
user2390246

Rのコンソール環境とコードスニペットが主な使用方法であるため、少しあいまいです。リンクしたメタスレッドに関する洞察を自由に共有してください。それほど多くの入力を受け取っていません。
JAD


5

オクターブ41 37バイト

これは、MATLABでも機能します。卑劣なオクターブ固有の機能はありません:)

@(x)unique([x:x-1:x^2-1;1:x+1:x*x+1])

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

説明:

正方行列を作成し、2つの対角線を見つける代わりに、代わりに直接対角線を計算する方がよいと考えました。これは17バイト短くなりました!=)

@(x)                                   % Anonymous function that takes 'x' as input
    unique(...                   ...)  % unique gives the unique elements, sorted
           [x:x-1:x^2-1                % The anti-diagonal (is that the correct word?)
                       ;               % New row
                        1:x+1:x*x+1])  % The regular diagonal

これは、次のように見えるものuniqueです:

ans =    
    6   11   16   21   26   31
    1    8   15   22   29   36

はい、対角線の順序を逆にして、より人間に優しいものにする必要があります。


5

MATL、6バイト

XytP+f

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

説明

オクターブの答えと同じアプローチ。

3例として入力を検討してください。

Xy   % Implicit input. Identity matrix of that size
     % STACK: [1 0 0;
               0 1 0;
               0 0 1]
t    % Duplicate
     % STACK: [1 0 0
               0 1 0
               0 0 1],
              [1 0 0
               0 1 0
               0 0 1]
P    % Flip vertically
     % STACK: [1 0 0
               0 1 0
               0 0 1],
              [0 0 1
               0 1 0
               1 0 0]
+    % Add
     % STACK: [1 0 1
               0 2 0
               1 0 1]
f    % Linear indices of nonzero entries. Implicit display  
     % STACK:[1; 3; 5; 7; 9]

線形インデックスは、優先、1ベースです。詳細については、長さ12は、スニペットを参照ここ


「転置」とはどういう意味ですか?
エリックアウトゴルファー

@EriktheOutgolfer申し訳ありませんが、私の悪い。t転置ではなく複製です。また、私が働いた例を追加しました
ルイスMendo

すごい!これを達成するには、2つのループが必要です。
mr5

@LuisMendo疑いがありました。恒等行列を転置しても意味がないので...うーん、アルゴリズムでバイトを保存できました。
エリックアウトゴルファー


4

オクターブ、68 54バイト

14バイトを節約してくれた@Stewie Griffinに感謝します!

@(x)unique([diag(m=reshape(1:x^2,x,x)),diag(flip(m))])

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

MATLAB、68バイト

x=input('');m=reshape([1:x*x],x,x);unique([diag(m) diag(flipud(m))])

説明:

@(x)                               % Anonymous function
m=reshape([1:x*x],x,x);            % Create a vector from 1 to x^2 and
                                   % reshape it into an x*x matrix.
diag(m)                            % Find the values on the diagonal.
diag(flip(m))                      % Flip the matrix upside down and
                                   % find the values on the diagonal.
unique([])                         % Place the values from both diagonals
                                   % into a vector and remove duplicates.

@LuisMendoありがとう、ジミは私のお気に入りです。
Steadybox





2

C#(.NET Core)97 83バイト

f=>{var s="[";for(int i=0;i<n*n-1;)s+=i%-~n<1|i++%~-n<1?i+",":"";return s+n*n+"]";}

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

ここでの変更は、検索する数値間のシフトに基づいています。0から始まる2つのシフトであるn-1n+1そうであれば、n=5のための番号は、n-1あろう0,4,8,12,16,20とするためn+1であろう0,6,12,18,24。これらを組み合わせて(0インデックス付けの代わりに)1インデックス付けを行うと、が得られ1,5,7,9,13,17,19,21,25ます。以下からのオフセットnビット単位の否定(ビット単位の補数演算)、使用して達成される~-n==n-1とします-~n==n+1

古いバージョン

f=>{var s="[";for(int i=0;i<n*n-1;i++)s+=(i/n!=i%n&&n-1-i/n!=i%n?"":i+1+",");return s+$"{n*n}]";}

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

このアプローチでは、列と行のインデックスを使用して、数値が対角線上にあるかどうかを判断します。i/n行インデックスと列インデックスをi%n提供します。

数値配列のみを返す

数値配列のみの構築がバイトコストにカウントされると見なされる場合、Dennis.Verweijの提案に基づいて、以下を実行できます(using System.Linq;追加の18バイトが追加されます)。

C#(.NET Core)、66 + 18 = 84バイト

x=>Enumerable.Range(1,x*x).Where(v=>~-v%~-x<1|~-v%-~x<1).ToArray()

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


余分なコードを取り除くことでコードを減らすことができます&。追加&は、最初の入力が偽の場合に比較を中断するためだけにありますMSDN
Dennis.Verweij

実際、Linqを使用して92バイトを使用できます。オンラインで試してみてください。
-Dennis.Verweij

@ Dennis.Verweijニート、TIOのヘッダーまたはフッターにどれだけシフトできるかわからなかった。私と一緒に遊びましょう。
Ayb4btu

linq(System.Linqを使用)への参照に18バイトを含めることを忘れないでください。これは残念ですが、どのように機能するのか:S
Dennis.Verweij

ああ、わかった。しかし、それは必要ありませんusing System;か?(私はそれをラップすることnamespace System.Linqは有効ではないと思いますか?)
Ayb4btu

2

Javascript、73 63バイト

古いバージョン

n=>[...Array(y=n*n).keys(),y].filter(x=>(--x/n|0)==x%n||(x/n|0)==n-x%n-1)

@Shaggyのおかげで10バイト節約

n=>[...Array(n*n)].map((_,y)=>y+1).filter(x=>!(--x%-~n&&x%~-n))

初めてのゴルフ!ここで私があまりにもひどく混乱しないことを願っています。


PPCGへようこそ:)私が取り組んでいたものと同様のソリューション(私のものだけが0からインデックス付けされています)。filter関数で次を使用することで、いくつかのバイトを保存できる場合があり!(--x%(n+1)&&x%(n-1))ます。配列を次のように作成することにより、[...Array(n*n+1).keys()]
シャギー

@Shaggyありがとうございます!仕事から家に帰るとすぐに、あなたの提案で答えを改善しようとします!
マルコレポ

どういたしまして。ちなみに、「範囲を作成するよりも少し短い[1...n*n]Array(n*n).fill().map((x,i)=>i+1)」- [...Array(n*n)].map((_,y)=>y+1)将来の参考のために、これを行うより短い方法です。
シャギー

それでもう少しし、56バイトのこれで終わった:n=>[...Array(n*n+1).keys()].filter(x=>!(--x%-~n&&x%~-n))
シャギー

@Shaggy私はあなたの最後のバージョンを試しましたが、f(1)とf(2)に余分なゼロを出力し、[1 ... n * n]の範囲で動作しますが、前のコメント。または多分私は台無しにした?
マルコ・ルポール




1

ジャプト、16バイト

これよりもうまくいくようには見えませんが、それは可能だと確信しています。1インデックスを使用するという不必要な要件のために、2バイトを犠牲にしなければなりませんでした。

²õ f@´XvUÉ ªXvUÄ

試して



0

PHP、56 54 + 1バイト

-Rフラグ用の+1バイト

for(;$z**.5<$n=$argn;$z++)$z%-~$n&&$z%~-$n||print~+$z;

ダッシュを前に付けた数字を出力します。でパイプとして実行する-nR、オンラインで試してください

**演算子にはPHP 5.6以降が必要です。
古いPHPのために1つのバイトを追加します交換してください;$z**.5<$n=$argn$z=$argn;$z<$n*$n


0

Ruby、45バイト

->n{(n*n).times{|i|i%-~n>0&&i%~-n>0||p(i+1)}}

ゼロインデックスとして内部的に機能します。imodulo n+1またはn-10であるかどうかをチェックします(そうである場合)i+1

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