साइन परिवर्तन का उपयोग करके डुप्लिकेट प्रविष्टियों से बचें


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
क्या हमें यह मान लेना चाहिए कि इनपुट सूचियों को क्रमबद्ध किया गया है और इसमें स्वयं डुप्लिकेट शामिल नहीं हैं?
बदसूरत

मेरा पहला विचार जब मैंने देखा कि डेलीडब्ल्यूटीएफ पर था कि उन्हें "मर्ज" को परिभाषित करने की आवश्यकता थी। इस प्रश्न की भी एक परिभाषा है।
पीटर टेलर

"वे उसे बोरिस द बुलेट डोजर कहते हैं" "वे उसे क्यों कहते हैं?" "... क्योंकि वह गोलियों को चकमा देता है, एवी"। CodeGolf पर कोई स्नैच प्रशंसक?
बोजैंगल्स

जवाबों:


11

जावास्क्रिप्ट

एक पारंपरिक एल्गोरिथ्म लें और इसे बग के साथ लिखें:

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

एपीएल 22/23

स्क्रीन इनपुट के लिए pts pts के माध्यम से संकेत देता है और यदि कोई डुप्लिकेट के बिना अग्रणी सेट नकारात्मक है, तो एक मर्ज की गई सूची देता है या।

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

बाइट काउंटर कृपया ध्यान दें कि इस साइट पर ठीक से प्रस्तुत करने के लिए एकल बाइट एपीएल वर्णों को यूटीएफ 8 में बदल दिया गया है।


-1 सब कुछ कैसे बदलता है?
जोहान्स कुह्न

@ जोहान्सन कुह्न उपरोक्त उदाहरण के लिए कोड 0, -2 = / v पैदावार वेक्टर 0 0 the1 0 के साथ the1 एक डुप्लिकेट प्रविष्टि की स्थिति का संकेत देता है। 1 और 01 पैदावार के खिलाफ इस वेक्टर का परीक्षण करना बूलियन तत्वों को उलट कर 1 1 1 1 या 1 1 0 0 देता है। ये वैक्टर मर्ज किए गए वेक्टर से उपयुक्त तत्वों का चयन करने के लिए उपयोग किया जाता है।
ग्राहम

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 से गुणा करें, उसके बाद नकारात्मक मानों को फ़िल्टर करें।


इस उत्तर को प्रश्न बदलने से पहले लिखा गया था। उद्धरण की भावना में, मैं अभी भी प्रविष्टियों को नकारात्मक बनाना पसंद करता हूं।
जोहान्स कुह्न

-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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.