Tránh các mục trùng lặp bằng cách sử dụng thay đổi dấu hiệu


14

Giai thoại này chứa các trao đổi hấp dẫn sau đây:

"Tốt thôi, Fred," Avi ngắt lời. "Sau đó, làm thế nào bạn sẽ thay đổi điều này để tránh các mục trùng lặp?"

"Ồ, chỉ cần thay đổi cái đó thành một cái tiêu cực."

Mặc dù tuyên bố này không chính xác trong ngữ cảnh, tôi tự hỏi liệu có một số mã hợp lý mà có ý nghĩa hay không.

Thách thức của bạn là viết mã (một chương trình, một chức năng, bất cứ điều gì) phù hợp với tiêu chí này:

  1. Hợp nhất hai danh sách đầu vào thành một, giữ các bản sao. [chỉnh sửa: Bạn có thể tùy ý cho rằng chúng là số nguyên và / hoặc bản thân danh sách là duy nhất. Bạn không thể cho rằng các số nguyên là dương (câu trả lời duy nhất được thực hiện).]
  2. Một chữ "1" xuất hiện ở đâu đó trong mã. Nếu bạn thay đổi điều này thành "-1" theo nghĩa đen, mã sẽ thực hiện tương tự nhưng loại bỏ trùng lặp.
  3. Mã không chỉ đơn giản là phân nhánh của 1 / -1. Chúng tôi không tìm kiếm if (1 < 1) removeDuplicates()hoặc [do_nothing, merge_with_dups, merge_without_dups][1].call(), ví dụ.

Đầu vào và đầu ra có thể ở bất kỳ định dạng hợp lý nào bạn chọn. Một ví dụ có thể là

[1,2],[2,3]->[1,2,2,3]trước khi thay đổi dấu hiệu, và [1,2,3]sau đó.

Đây là một cuộc thi phổ biến. Nó không phảimã golf , trừ khi bạn muốn thể hiện. Tôi sẽ chấp nhận câu trả lời được bình chọn cao nhất trong khoảng hai tuần.


Số nguyên đầu vào - chỉ là gì? Tích cực và / hoặc tiêu cực? Nếu danh sách đầu vào có chứa các bản sao, chúng có nên được loại bỏ trong -1trường hợp không?
Phục hồi Monica

1
Chúng ta có nên giả sử danh sách đầu vào được sắp xếp và không chứa bản sao?
ugoren

Suy nghĩ đầu tiên của tôi khi tôi thấy rằng trên DailyWTF là họ cần xác định "hợp nhất". Câu hỏi này cũng cần một định nghĩa về nó.
Peter Taylor

"Họ gọi anh ta là Boris the Bullet Dodger" "Tại sao họ gọi anh ta như vậy?" "... Bởi vì anh ta tránh đạn, Avi". Bất kỳ người hâm mộ Snatch trên CodeGolf?
Bojangles

Câu trả lời:


11

JavaScript

Lấy một thuật toán thông thường và viết nó với một lỗi:

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;
}

Mã này chứa chính xác một chữ 1. Nếu nó được thay đổi thành -1, thì các bản sao sẽ bị xóa. Nó có thể được sử dụng trên bất kỳ giá trị so sánh.


5

APL 22/23

Nhắc nhở cho màn hình nhập qua ← và trả về một danh sách được hợp nhất theo thứ tự với hoặc, nếu danh sách hàng đầu được đặt âm, không có trùng lặp.

(~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

Bộ đếm byte xin lưu ý rằng các ký tự APL byte đơn đã được chuyển đổi thành UTF8 để hiển thị đúng trên trang web này.


Làm thế nào để -1 thay đổi mọi thứ?
Julian Kuhn

@Johannes Kuhn Với ví dụ trên, mã 0, -2 = / v mang lại vectơ 0 0 1 0 với ¯1 chỉ vị trí của một mục trùng lặp. Kiểm tra vectơ này với 1 và yield1 mang lại 0 0 0 0 hoặc 0 0 1 0 đảo ngược các phần tử boolean cho 1 1 1 1 hoặc 1 1 0 1. Các vectơ này được sử dụng để chọn các phần tử thích hợp từ vectơ hợp nhất.
Graham

4

k (18)

Nên làm việc cho bất kỳ loại danh sách hợp lệ

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

Thí dụ:

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

3

Con trăn

def merge(a, b):
    return a + [i for i in b if i not in a*- 1]

2

Bash

Theo tinh thần của bối cảnh, chương trình này sẽ loại bỏ các bản sao nếu bạn thêm một dấu trừ trước chữ thường ltrên grepdòng. Nếu bạn thêm một dấu trừ trước chữ hoa Itrên dòng trước hoặc trước chữ số 1trên dòng tiếp theo, chương trình sẽ không hoạt động khác.

Các tệp đầu vào chứa một số nguyên trên mỗi dòng (đây là biểu diễn thông thường của danh sách dưới dạng tệp văn bản). Chúng phải được thông qua như hai đối số. Danh sách kết quả được viết theo tiêu chuẩn ouptut.

# 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

Hãy sử dụng chương trình này như một ví dụ về mã tốt nhất của bạn trong một cuộc phỏng vấn. Tất cả tôi yêu cầu là bạn không nói rằng đó là mã tốt nhất của tôi.


1

Tcl

Trong tinh thần của trích dẫn

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

Nếu nó là một bản sao, nhân nó với (-) 1, sau đó lọc ra các giá trị âm.


Câu trả lời này được viết theo cách đó trước khi câu hỏi thay đổi. Trong tinh thần của trích dẫn, tôi vẫn thích làm cho các mục tiêu cực.
Julian Kuhn

-1

Tôi mới bắt đầu học PHP Tôi không biết nó có đúng không

$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
Nó không giống như điều này thực sự trả lời cho thách thức - Tôi không thấy chữ 1 ở bất cứ đâu trong mã của bạn.
Đạp xe
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.