記号の変更を使用して重複エントリを回避する


14

この逸話には、次の興味深い交換が含まれています。

「ファイン、フレッド」アヴィは割り込んだ。「では、エントリの重複を避けるためにこれをどのように変更しますか?」

「あそこのネガティブなものに変えてください。」

この主張は文脈では正確ではありませんが、理にかなっているもっともらしいコードがあるのではないかと思います。

あなたの挑戦は、この基準に適合するコード(プログラム、関数など)を書くことです。

  1. 2つの入力リストを1つにマージし、重複を保持します。[編集:オプションで、それらが整数であること、および/またはリスト自体が一意であると仮定することができます。整数が正であると仮定することはできません(これを行う1つの答えは祖父です)。]
  2. リテラル「1」はコードのどこかに表示されます。これをリテラル「-1」に変更すると、コードは同じことを行いますが、重複を削除します。
  3. コードは単に1 / -1から分岐しません。たとえば、if (1 < 1) removeDuplicates()またはを探していません[do_nothing, merge_with_dups, merge_without_dups][1].call()

入力および出力は、選択した任意の妥当な形式にすることができます。一例は

[1,2],[2,3]->[1,2,2,3]符号が変わる前と[1,2,3]後。

これは人気コンテストです。あなたが自慢したいのでなければ、それはコードゴルフではありません。約2週間以内に最高投票数の回答を受け入れます。


入力とは何ですか?整数のみですか?ポジティブおよび/またはネガティブ?入力リストに重複が含まれている-1場合、それらを削除する必要がありますか?
モニカを

1
入力リストはソートされており、それ自体に重複が含まれていないと想定する必要がありますか?
ウゴレン

DailyWTFで「マージ」を定義する必要があると思ったとき、最初に考えました。この質問にもその定義が必要です。
ピーターテイラー

「彼らは彼をボリス・ドジャーのボリスと呼ぶ」「なぜ彼らは彼をそれと呼ぶのか?」「...弾丸をかわすので、アビ」。CodeGolfのスナッチファンはいますか?
ボジャングルズ

回答:


11

JavaScript

従来のアルゴリズムを使用して、バグを付けて記述します。

function merge(a, b) {
  var ai = 0, bi = 0, oi = 0;
  var o = [];
  while (ai < a.length && bi < b.length) {
    var v = a[ai] < b[bi] ? a[ai++] : b[bi++];
    if (v !== o[oi + 1]) {
      o[oi++] = v;
    }
  }
  while (ai < a.length) o[oi++] = a[ai++];
  while (bi < b.length) o[oi++] = b[bi++];
  return o;
}

このコードには、リテラルが1つだけ含まれています1。に変更する-1と、重複が削除されます。同等の値で使用できます。


5

APL 22/23

←⎕を介して画面入力を要求し、順序付けられたマージ済みリストを返します。または、先頭のリストが負に設定されている場合、重複なしでリストを返します。

(~1=0,-2=/v)/v←v[⍋v←⎕]

⎕:
    (1 2),(2 3)
1 2 2 3

(~¯1=0,-2=/v)/v←v[⍋v←⎕]

⎕:
    (1 2),(2 3)
1 2 3

バイトカウンターは、このサイトで適切にレンダリングするために、シングルバイトのAPL文字がUTF8に変換されていることに注意してください。


-1はどのようにすべてを変更しますか?
ヨハネ

@Johannes Kuhn上記の例では、コード0、-2 = / vはベクトル0 0¯10を生成し、¯1は重複エントリの位置を示します。このベクトルを1および¯1に対してテストすると、0 0 0 0または0 0 1 0が返され、ブール要素が逆になり、1 1 1 1または1 1 0 1が得られます。これらのベクトルは、マージされたベクトルから適切な要素を選択するために使用されます
グラハム

4

k(18)

有効なタイプのリストで動作するはずです

{(*1#(::;?:))@x,y}

例:

k){(*-1#(::;?:))@x,y}[1 2 3 4;3 4 5 6]
1 2 3 4 5 6
k){(*1#(::;?:))@x,y}[1 2 3 4;3 4 5 6]
1 2 3 4 3 4 5 6


2

バッシュ

コンテキストの精神ではlgrep行の小文字の前にマイナス記号を追加すると、このプログラムは重複を削除します。I前の行の大文字の前、または1次の行の数字の前にマイナス記号を追加しても、プログラムの動作は変わりません。

入力ファイルには、1行に1つの整数が含まれます(これは、テキストファイルとしてのリストの通常の表現です)。これらは2つの引数として渡す必要があります。結果のリストは、標準出力に書き込まれます。

# Create temp file for working
temp=$(mktemp -d)
# Copy left and right file to merge into same
cp $1 $temp/l
cp $2 $temp/r
cd $temp

while read num
do
  # I remove the output
  set `grep -Lax -e $num l ` <r> /dev/null
  if [ $# != 1 ]
  then echo $num >>r
  fi
done <l

cp r /dev/stdout
cd
rm -r $temp

インタビューであなたの最高のコードの例としてこのプログラムを使用してください。私が尋ねるのは、あなたがそれが私の最高のコードだと言わないことです。


1

Tcl

引用の精神で

foreach item $list1 {
    if {$item in $list2} {set item [expr {$item * 1}]}
    lappend list2 $item
}
foreach item $list2 {
    if {$item >= 0} {lappend result $item}
}

重複している場合は、負の値を除外した後、(-)1を掛けます。


この答えは、質問が変わる前にそのように書かれていました。引用の精神で、私はまだエントリーを否定的にすることを好みます。
ヨハネ

-1

私はPHPの初心者です、それが正しいかどうかわかりません

$list1=explode(',',$_GET['list1']);
$list2=explode(',',$_GET['list2']);
$list_merged=array_merge($list1,$list2);
print_r($list_merged);
$list_unique=array_unique($list_merged);
print_r($list_unique);

7
これは実際に課題に答えているようには見えません-あなたのコードのどこにもリテラル1はありません
Riking
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.