Hindari entri duplikat menggunakan perubahan tanda

14

Anekdot ini berisi pertukaran yang menarik berikut:

"Baik, Fred," potong Avi. "Lalu bagaimana kamu akan mengubah ini untuk menghindari duplikat entri?"

"Oh, ubah saja yang di sana menjadi negatif."

Meskipun klaim ini tidak akurat dalam konteks, saya bertanya-tanya apakah ada beberapa kode yang masuk akal yang masuk akal.

Tantangan Anda adalah menulis kode (program, fungsi, apa pun) yang sesuai dengan kriteria ini:

  1. Menggabungkan dua daftar input menjadi satu, menjaga duplikat. [sunting: Anda dapat secara opsional menganggap bahwa mereka adalah bilangan bulat, dan / atau daftar itu sendiri unik. Anda tidak dapat menganggap bilangan bulat itu positif (satu jawaban yang melakukannya adalah kakek).]
  2. "1" literal muncul di suatu tempat dalam kode. Jika Anda mengubahnya ke literal "-1", kode melakukan hal yang sama tetapi menghapus duplikat.
  3. Kode tidak hanya bercabang dari 1 / -1. Kami tidak mencari if (1 < 1) removeDuplicates()atau [do_nothing, merge_with_dups, merge_without_dups][1].call(), misalnya.

Input dan output dapat dalam format apa pun yang Anda pilih. Salah satu contohnya mungkin

[1,2],[2,3]->[1,2,2,3]sebelum tanda berubah, dan [1,2,3]setelah.

Ini adalah kontes popularitas. Ini bukan kode golf , kecuali jika Anda ingin pamer. Saya akan menerima jawaban dengan suara tertinggi dalam waktu sekitar dua minggu.

histokrat
sumber
Apa bilangan bulat input - saja? Positif dan / atau negatif? Jika daftar input berisi duplikat, haruskah mereka dihapus dalam -1kasus ini?
Pasang kembali Monica
1
Haruskah kita menganggap daftar input diurutkan dan tidak mengandung duplikat sendiri?
ugoren
Pikiran pertama saya ketika saya melihat bahwa di DailyWTF adalah bahwa mereka perlu mendefinisikan "penggabungan". Pertanyaan ini juga membutuhkan definisi tentangnya.
Peter Taylor
"Mereka memanggilnya Boris the Bullet Dodger" "Mengapa mereka memanggilnya begitu?" "... Karena dia menghindari peluru, Avi". Adakah penggemar Snatch di CodeGolf?
Bojangles

Jawaban:

11

JavaScript

Ambil algoritma konvensional dan tulis dengan bug:

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

Kode ini mengandung tepat satu literal 1. Jika diubah menjadi -1, maka duplikat akan dihapus. Ini dapat digunakan pada nilai yang sebanding.

Kevin Reid
sumber
5

APL 22/23

Meminta input layar melalui ← ⎕ dan mengembalikan daftar gabungan yang dipesan dengan atau, jika yang memimpin ditetapkan negatif, tanpa duplikat.

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

Penghitung byte harap dicatat bahwa karakter APL byte tunggal telah dikonversi ke UTF8 untuk ditampilkan dengan benar di situs ini.

Graham
sumber
Bagaimana -1 mengubah segalanya?
Johannes Kuhn
@Johannes Kuhn Untuk contoh di atas kode 0, -2 = / v menghasilkan vektor 0 0 ¯1 0 dengan ¯1 menunjukkan posisi entri duplikat. Pengujian vektor ini terhadap 1 dan ¯1 menghasilkan 0 0 0 0 atau 0 0 1 0 membalikkan elemen boolean menghasilkan 1 1 1 1 atau 1 1 0 1. Vektor ini digunakan untuk memilih elemen yang sesuai dari vektor yang digabungkan.
Graham
4

k (18)

Harus bekerja untuk semua jenis daftar yang valid

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

Contoh:

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
skeevey
sumber
3

Python

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

Pesta

Dalam semangat konteks, program ini menghapus duplikat jika Anda menambahkan tanda minus sebelum huruf kecil ldi greptelepon. Jika Anda menambahkan tanda minus sebelum huruf besar Ipada baris sebelumnya, atau sebelum digit 1pada baris berikutnya, program tidak berperilaku berbeda.

File input berisi satu bilangan bulat per baris (ini adalah representasi daftar yang biasa sebagai file teks). Mereka harus disahkan sebagai dua argumen. Daftar yang dihasilkan ditulis ke standar 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

Jangan ragu untuk menggunakan program ini sebagai contoh kode terbaik Anda dalam sebuah wawancara. Yang saya minta adalah Anda tidak mengatakan bahwa itu adalah kode terbaik saya.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
1

Tcl

Dalam semangat kutipan

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

Jika itu adalah duplikat, gandakan dengan (-) 1, setelah itu saring keluar nilai negatif.

Johannes Kuhn
sumber
Jawaban ini ditulis seperti itu sebelum pertanyaan berubah. Dalam semangat kutipan, saya masih lebih suka membuat entri menjadi negatif.
Johannes Kuhn
-1

Saya pemula dalam PHP, saya tidak tahu apakah itu benar

$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);
Sasori
sumber
7
Sepertinya ini tidak benar-benar menjawab tantangan - saya tidak melihat 1 literal dalam kode Anda.
Bersepeda