避免使用符号更改重复输入


14

该轶事包含以下有趣的交流:

“好,弗雷德。”阿维打断道。“那您将如何更改它以避免重复输入?”

“哦,只要将那一个改成否定的。”

尽管此声明在上下文中并不准确,但我确实想知道是否有一些合理的代码有意义。

您的挑战是编写符合以下条件的代码(程序,函数等):

  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]之后。

这是一次人气竞赛。除非您想炫耀,否则它不是代码高尔夫球。我将在大约两周内接受投票最高的答案。


输入是什么-仅整数?正面和/或负面?如果输入列表包含重复项,是否应将它们删除-1
恢复莫妮卡

1
我们是否应该假设输入列表已排序并且自身不包含重复项?
ugoren 2013年

当我在DailyWTF上看到它时,我的第一个念头是他们需要定义“合并”。这个问题也需要对其进行定义。
彼得·泰勒

“他们叫他子弹头道奇鲍里斯”“为什么叫他那个?” “……因为他躲着子弹,阿维”。CodeGolf上有任何抢夺粉丝吗?
Bojangles,

Answers:


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,则将删除重复项。它可以用于任何可比较的值。


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 01。这些向量用于从合并的向量中选择适当的元素。
格雷厄姆

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下一行的数字之前添加减号,则程序的行为不会有所不同。

输入文件每行包含一个整数(这是列表作为文本文件的常规表示形式)。必须将它们作为两个参数传递。结果列表将被写入标准输出。

# 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。
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.