合計注文の存在を決定する


8

このタスクでは、次のような正の整数の配列を検討します。

3 18 321 17 4 4 51 1 293 17

入力は、両方の任意の、おそらく異なる、正の長さのそのような配列のペアで構成されます。全順序≤かどうかを判断XN × NNは正の整数の集合であるが、両方の入力配列が≤に対して順になるように存在するX。(A≤という通知X B∧B≤ X A)↔A = Bが成立しなければならないが、その2つの数は≤下に等しいと見なされているX場合、それらは同じ数である場合にのみ。

たとえば、入力が配列のペアである場合

7 2 1 1 4 12 3
9 8 7 2 5 1

あなたは全順序が≤どうかを把握することになっているXは、このような存在します

7≤ X 2≤ X 1≤ X 1≤ X 4≤ X 12≤ X 3

そして

9≤ X 8≤ X 7≤ X 2≤ X 5≤ X 1。

あなたの提出は、全順序≤かどうかを計算し、実装定義の方法で入力の二つの配列(上記指定された)受信サブルーチン又はプログラムであってもよいX要求を満たすには一つの「はい」を表す値でも異なって存在して戻り、上述しました「いいえ」を表す値 これらの値の選択は任意です。それらを文書化してください。

あなたは、入力配列がない2つの以上含まれていないと仮定することができる15 1要素それぞれとその要素の各々が1から2の範囲であることを- 15 - 1インクルーシブ。各配列は、0などの前述の範囲外の定数センチネルで終了する必要がある場合があります。必要なセンチネルを指定してください。配列自体から長さを推測できない場合(Cなどの言語の場合)、追加の長さとして配列の長さが必要になる場合があります。標準の抜け穴の禁止に加えて、トポロジカルソートルーチンを使用することはできません。

この挑戦はコードゴルフです。キャラクターの数が最も少ない投稿が優先されます。


2
誰もが使いやすいように、テスト用にいくつかのサンプル入出力を作成できますか?
orlp 2015

1
1つのリストが逆説的で、ループ自体を持つことはできますか?
jimmy23013

@ user23013はい。
FUZxxl 2015

@orlpもちろん。少し時間をください。
FUZxxl 2015

1
@orlp平等は異なる順序に触れるべきではありませんが、段落を追加させてください。
FUZxxl 2015

回答:


4

バース、28 22

L.AmqdSdmfhTmxhkbek^b2

y2つの配列を含むタプルで呼び出すことができる関数を作成します。完全な順序が存在する場合は「True」を、存在しない場合は「False」を返します。

stdinで上記の関数を定義して呼び出すヘルパープログラム:

L.AmqdSdmfhTmxhkbek^b2y,rw7rw7 

ここで試してください。

最初に両方の配列を読み取ります。次に、両方の配列のすべての組み合わせを作成します。次に、各組み合わせについて、最初の配列が信頼できるものと想定し、それが2番目の配列と一致しているかどうかを確認します。


正の整数はすべての真の出力で同じですか?「はい」を表す1つの整数と「いいえ」を表す1つの整数があることが仕様の意図です
FUZxxl 2015

@FUZxxl今はそうです。
orlp 2015

私はあなたが好きなように入力を取ることが許可されていると思います、それは多くのキャラクターを節約するでしょう。Receives two arrays ... in an implementation-defined way.7文字以上保存できます。
isaacg 2015

@isaacgおかげで、ラムダを使用する必要があるため、6しか保存できません。サブルーチンかプログラムのどちらかを指定する必要があります。
orlp 2015

2

GolfScript、25バイト

:A{:a;A{.a--.{a?}$=!},},!

このコードをオンラインで試してください。

スタック上の2つ(またはそれ以上)の配列の配列を取ります。入力配列のすべてのペアに互換性のある合計順序がある場合は1(true)を返し、そうでない場合は0(false)を返します。

入力配列の可能なすべてのペア(それ自体とペアになっている各配列を含む)をループし、最初の配列の要素を2番目の配列で最初に出現する位置に従ってソートし(見つからないものを無視)、チェックすることで機能します結果の順序が元の順序と一致すること。

このコードは任意の数の入力配列をとることができますが、ペアワイズ整合性のみをチェックすることは注目に値します。たとえば[[1 2] [2 3] [3 1]]、3つの配列のいずれか2つが全体の順序に一貫性があるため、入力に対してtrueを返します。ただし、2入力の場合はこれで十分であり、これが課題に必要なすべてです。

これはコメント付きの非ゴルフバージョンです。

:A         # save input to "A", and leave it on the stack to be looped over
{          # run this outer loop for each input array:
  :a;      #   save this array to "a" (and pop it off the stack)
  A{       #   also run this inner loop for each input array:
    .a--   #     remove all elements not in "a" from this array
    .      #     make a copy of the filtered array
    {a?}$  #     sort it by the first location of each element in "a"
    =!     #     check whether the sorted copy differs from the original
  },       #   select those arrays for which there was a difference
},         # select those arrays for which at least one difference was found
!          # return 1 if no differences were found, 0 otherwise

Ps。名前付き変数Aで入力を直接指定することを要求したり、「はい」の場合は出力フォーマットを空の配列に変更したり、「いいえ」の場合は空でない配列に変更したりすることで、1バイトまたは2バイトを節約できます。 。しかし、それは私にはかなり安っぽいようです。


これは素晴らしいアイデアです。たぶん私はこのソリューションのJポートをやっています。
FUZxxl 2015

2

J、36 30 26バイト

[:*/@,(e.~(-:/:~)@#i.)&>/~

2つの入力リストaとを呼び出しましょうb。関数は(を使用して(e.~(-:/:~)@#i.)

  • aで(に関してa)ソートされたの要素b
  • aで(に関してa)ソートされたの要素a
  • bで(に関してb)ソートされたの要素a
  • bで(に関してb)ソートされたの要素b

入力は2つの整数ベクトルのリストです。

結果は10それ以外に順序が存在する場合です。(ランタイムはO(n * n)です。)

使用法:

   f=.[:*/@,(e.~(-:/:~)@#i.)&>/~

   a=.7 2 1 1 4 12 3 [b=.7 2 1 1 4 12 3 1 [c=.9 8 7 2 5 1
   f a;c
1
   f b;c
0

こちらからオンラインでお試しください。


どのようbにに関してソートできないのbですか?
FUZxxl 2015

@FUZxxl例、b=1 2 1または私の2番目の例b=7 2 1 1 4 12 3 1
randomra

わかりました…ある意味です。
FUZxxl 2015

1

ルビー、79

!!gets(p).scan(r=/\d+/){|s|$'[/.*/].scan(r){s!=$&&~/\b#$& .*\b#{s}\b/&&return}}

入力はスペースで区切られた数値の2行のファイルであると想定しています。true存在nilしない場合は、順序が存在するときに戻ります。


出力フォーマットに従ってください:順序の存在を指定する1つの値、または存在しないことを指定する別の値を返します。これらの値は入力から独立している必要があります。
FUZxxl 2015

できました。技術的には1文字少ない仕様に準拠できますが、戻るnilか、falseあまりに間違っていると感じます。
ヒストクラート2015

戻るnilfalse、まったく問題ありません。
FUZxxl 2015

1

Haskell、98バイト

import Data.List
a%b=intersect(r a)$r b
r l=map head$group l
c l=nub l==r l
x#y=c x&&c y&&x%y==y%x

Trueまたはを返しますFalse。使用例:[7,2,1,1,4,12,3] # [9,8,7,2,5,1]-> True

仕組み:入力リストから連続する重複を削除します(例:[1,2,2,3,2] -> [1,2,3,2]。結果として生じる両方のリストに重複が含まれておらず、list1とlist2の交差がlist2とlist1の交差に等しい場合、順序が存在します。


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