Vermeiden Sie doppelte Einträge mit einem Vorzeichenwechsel

14

Diese Anekdote enthält den folgenden interessanten Austausch:

"Gut, Fred", unterbrach Avi. "Wie würden Sie dies dann ändern, um doppelte Einträge zu vermeiden?"

"Oh, ändere diesen hier einfach in einen negativen."

Obwohl diese Behauptung im Kontext nicht korrekt ist, frage ich mich, ob es plausiblen Code gibt, für den dies Sinn macht.

Ihre Herausforderung besteht darin, Code zu schreiben (ein Programm, eine Funktion, was auch immer), der diese Kriterien erfüllt:

  1. Führt zwei Eingabelisten zu einer zusammen und behält Duplikate bei. [Bearbeiten: Sie können optional annehmen, dass es sich um Ganzzahlen handelt und / oder dass die Listen selbst eindeutig sind. Sie können nicht davon ausgehen, dass die ganzen Zahlen positiv sind (die einzige Antwort, die dies tut, ist grandfathered in).]
  2. Irgendwo im Code wird eine wörtliche "1" angezeigt. Wenn Sie dies in ein Literal "-1" ändern, führt der Code dasselbe aus, entfernt jedoch Duplikate.
  3. Der Code verzweigt sich nicht einfach vom 1 / -1. Wir suchen zum Beispiel nicht if (1 < 1) removeDuplicates()oder [do_nothing, merge_with_dups, merge_without_dups][1].call().

Die Ein- und Ausgabe kann in einem beliebigen Format erfolgen. Ein Beispiel könnte sein

[1,2],[2,3]->[1,2,2,3]vor dem zeichenwechsel und [1,2,3]danach.

Dies ist ein Beliebtheitswettbewerb. Es ist kein Code-Golf , es sei denn, Sie möchten angeben. Ich werde die Antwort mit den meisten Stimmen in ungefähr zwei Wochen annehmen.

Histokrat
quelle
Was ist die Eingabe - nur Ganzzahlen? Positiv und / oder negativ? Sollten die Eingabelisten Duplikate enthalten, sollten sie in dem -1Fall entfernt werden?
Setzen Sie Monica
1
Sollen wir davon ausgehen, dass die Eingabelisten sortiert sind und selbst keine Duplikate enthalten?
ugoren
Mein erster Gedanke, als ich das auf der DailyWTF sah, war, dass sie "Zusammenführung" definieren mussten. Diese Frage muss ebenfalls definiert werden.
Peter Taylor
"Sie nennen ihn Boris den Bullet Dodger" "Warum nennen sie ihn so?" "... Weil er Kugeln ausweicht, Avi". Gibt es Snatch-Fans bei CodeGolf?
Bojangles

Antworten:

11

JavaScript

Nehmen Sie einen herkömmlichen Algorithmus und schreiben Sie ihn mit einem Fehler:

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

Dieser Code enthält genau ein Literal 1. Wenn es in geändert wird -1, werden Duplikate entfernt. Es kann auf alle vergleichbaren Werte angewendet werden.

Kevin Reid
quelle
5

APL 22/23

Fordert zur Bildschirmeingabe über ← screen auf und gibt eine geordnete zusammengeführte Liste mit oder, falls die führende negativ eingestellt ist, ohne Duplikate zurück.

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

Bytezähler beachten Sie bitte, dass die Einzelbyte-APL-Zeichen in UTF8 konvertiert wurden, um auf dieser Site korrekt dargestellt zu werden.

Graham
quelle
Wie ändert das -1 alles?
Johannes Kuhn
@Johannes Kuhn Für das obige Beispiel ergibt der Code 0, -2 = / v den Vektor 0 ¯1 0, wobei ¯1 die Position eines doppelten Eintrags angibt. Das Testen dieses Vektors gegen 1 und 1 ergibt 0 0 0 0 oder 0 0 1 0 das Umkehren der Booleschen Elemente ergibt 1 1 1 1 oder 1 1 0 1. Diese Vektoren werden verwendet, um die geeigneten Elemente aus dem zusammengeführten Vektor auszuwählen.
Graham
4

k (18)

Sollte für jeden gültigen Listentyp funktionieren

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

Beispiel:

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
quelle
3

Python

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

Bash

Im Geiste des Kontexts entfernt dieses Programm die Duplikate, wenn Sie vor dem Kleinbuchstaben lin der grepZeile ein Minuszeichen einfügen . Wenn Sie ein Minuszeichen vor dem Großbuchstaben Iin der vorherigen Zeile oder vor der Ziffer einfügen1 in der nächsten Zeile einfügen, verhält sich das Programm nicht anders.

Die Eingabedateien enthalten eine Ganzzahl pro Zeile (dies ist die übliche Darstellung von Listen als Textdateien). Sie müssen als zwei Argumente übergeben werden. Die resultierende Liste wird in das Standardoutput geschrieben.

# 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

Fühlen Sie sich frei, dieses Programm als Beispiel für Ihren besten Code in einem Interview zu verwenden. Ich bitte nur darum, dass Sie nicht sagen, dass es mein bester Code ist.

Gilles 'SO - hör auf böse zu sein'
quelle
1

Tcl

Im Geiste des Zitats

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

Wenn es sich um ein Duplikat handelt, multiplizieren Sie es mit (-) 1, und filtern Sie anschließend negative Werte heraus.

Johannes Kuhn
quelle
Diese Antwort wurde so geschrieben, bevor sich die Frage änderte. Im Sinne des Zitats ziehe ich es immer noch vor, die Einträge negativ zu machen.
Johannes Kuhn
-1

Ich bin Anfänger in PHP und weiß nicht, ob es richtig ist

$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
quelle
7
Es sieht nicht so aus, als würde dies tatsächlich die Herausforderung beantworten. Ich sehe nirgendwo in Ihrem Code eine 1.
Riking