หลีกเลี่ยงรายการที่ซ้ำกันโดยใช้การเปลี่ยนเครื่องหมาย


14

เรื่องเล็ก ๆ น้อยนี้มีการแลกเปลี่ยนที่น่าสนใจดังต่อไปนี้:

"ดีเฟรด" Avi ขัดจังหวะ "แล้วคุณจะเปลี่ยนแปลงสิ่งนี้อย่างไรเพื่อหลีกเลี่ยงรายการที่ซ้ำกัน"

"โอ้แค่เปลี่ยนอันนั้นตรงนั้นเป็นลบ"

ในขณะที่การเรียกร้องนี้ไม่ถูกต้องในบริบทฉันสงสัยว่ามีบางรหัสที่เป็นไปได้ที่เหมาะสม

ความท้าทายของคุณคือการเขียนโค้ด (โปรแกรมฟังก์ชั่นอะไรก็ได้) ที่ตรงกับเกณฑ์นี้:

  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หรือไม่?
Reinstate Monica

1
เราควรถือว่ารายการอินพุตถูกเรียงลำดับและไม่มีการซ้ำซ้อนกันหรือไม่?
ugoren

ความคิดแรกของฉันเมื่อฉันเห็นว่าใน DailyWTF คือสิ่งที่พวกเขาต้องการเพื่อกำหนด "ผสาน" คำถามนี้ยังต้องการคำนิยามของมัน
Peter Taylor

"พวกเขาเรียกเขาว่า Boris the Bullet Dodger" "ทำไมพวกเขาถึงเรียกเขาว่า" "... เพราะเขาหลบกระสุน, Avi" แฟน ๆ ฉก ๆ ใน CodeGolf?
Bojangles

คำตอบ:


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

@Johannes Kuhn สำหรับตัวอย่างข้างต้นโค้ด 0, -2 = / v ให้ผลเวกเตอร์ 0 0 ¯1 0 กับ¯1เพื่อระบุตำแหน่งของรายการที่ซ้ำกัน การทดสอบเวกเตอร์นี้กับ 1 และ¯1ให้ผลตอบแทน 0 0 0 0 หรือ 0 0 1 0 ย้อนกลับองค์ประกอบบูลีนให้ 1 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

ทุบตี

ในเจตนารมณ์ของบริบทโปรแกรมนี้จะลบสิ่งที่ซ้ำกันถ้าคุณเพิ่มเครื่องหมายลบก่อนตัวพิมพ์เล็กlบนgrepบรรทัด หากคุณเพิ่มเครื่องหมายลบหน้าตัวพิมพ์ใหญ่Iในบรรทัดก่อนหน้าหรือก่อนหน้าตัวเลข1บนบรรทัดถัดไปโปรแกรมจะไม่ทำงานแตกต่างกัน

ไฟล์อินพุตมีจำนวนเต็มหนึ่งตัวต่อบรรทัด (นี่เป็นการแสดงรายการตามปกติเป็นไฟล์ข้อความ) พวกเขาจะต้องถูกส่งผ่านเป็นสองข้อโต้แย้ง รายการผลลัพธ์ถูกเขียนไปยัง 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

รู้สึกอิสระที่จะใช้โปรแกรมนี้เป็นตัวอย่างของรหัสที่ดีที่สุดของคุณในการสัมภาษณ์ ทั้งหมดที่ฉันถามคือคุณไม่ได้บอกว่ามันเป็นรหัสที่ดีที่สุดของฉัน


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 หลังจากนั้นกรองค่าลบออก


คำตอบนี้ถูกเขียนขึ้นก่อนที่คำถามจะเปลี่ยนไป ในจิตวิญญาณของคำพูดฉันยังคงชอบที่จะทำให้รายการเป็นลบ
Johannes Kuhn

-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.