Evite entradas duplicadas usando un cambio de signo

14

Esta anécdota contiene el siguiente intercambio intrigante:

"Bien, Fred," interrumpió Avi. "Entonces, ¿cómo cambiarías esto para evitar entradas duplicadas?"

"Oh, solo cambia ese de allí a uno negativo".

Si bien esta afirmación no es precisa en su contexto, me pregunto si hay algún código plausible para el que tenga sentido.

Su desafío es escribir código (un programa, una función, lo que sea) que se ajuste a este criterio:

  1. Fusiona dos listas de entrada en una, manteniendo duplicados. [editar: Opcionalmente, puede suponer que son enteros y / o que las listas en sí mismas son únicas. No se puede suponer que los enteros son positivos (la única respuesta que hace esto está protegida).]
  2. Aparece un literal "1" en algún lugar del código. Si cambia esto a un literal "-1", el código hace lo mismo pero elimina los duplicados.
  3. El código no se ramifica simplemente del 1 / -1. No estamos buscando if (1 < 1) removeDuplicates()o [do_nothing, merge_with_dups, merge_without_dups][1].call(), por ejemplo.

La entrada y la salida pueden estar en cualquier formato razonable que elija. Un ejemplo podría ser

[1,2],[2,3]->[1,2,2,3]antes del cambio de signo, y [1,2,3]después.

Este es un concurso de popularidad. No es código golf , a menos que quieras presumir. Aceptaré la respuesta más votada en unas dos semanas.

histocrat
fuente
¿Cuál es la entrada - solo enteros? Positivo y / o negativo? Si las listas de entrada contienen duplicados, ¿deberían eliminarse en el -1caso?
Restablece a Mónica
1
¿Deberíamos suponer que las listas de entrada están ordenadas y no contienen duplicados?
Ugoren
Lo primero que pensé cuando vi eso en el DailyWTF fue que necesitaban definir "fusionar". Esta pregunta también necesita una definición de la misma.
Peter Taylor
"Lo llaman Boris el Dodger Bullet" "¿Por qué lo llaman así?" "... Porque él esquiva las balas, Avi". ¿Algún fanático de Snatch en CodeGolf?
Bojangles

Respuestas:

11

JavaScript

Tome un algoritmo convencional y escríbalo con un error:

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

Este código contiene exactamente un literal 1. Si se cambia a -1, se eliminarán los duplicados. Se puede usar en cualquier valor comparable.

Kevin Reid
fuente
5

APL 22/23

Solicita la entrada de pantalla a través de ← ⎕ y devuelve una lista combinada ordenada con o, si la principal se establece negativa, sin duplicados.

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

Contadores de bytes, tenga en cuenta que los caracteres APL de un solo byte se han convertido a UTF8 para representarlos correctamente en este sitio.

Graham
fuente
¿Cómo cambia todo -1?
Johannes Kuhn
@Johannes Kuhn Para el ejemplo anterior, el código 0, -2 = / v produce el vector 0 0 ¯1 0 con ¯1 que indica la posición de una entrada duplicada. Probar este vector contra 1 y ¯1 produce 0 0 0 0 o 0 0 1 0 invirtiendo los elementos booleanos da 1 1 1 1 o 1 1 0 1. Estos vectores se utilizan para seleccionar los elementos apropiados del vector fusionado.
Graham
4

k (18)

Debería funcionar para cualquier tipo válido de lista

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

Ejemplo:

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

Pitón

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

Golpetazo

En el espíritu del contexto, este programa elimina los duplicados si agrega un signo menos antes de la minúscula len la greplínea. Si agrega un signo menos antes de las mayúsculas Ien la línea anterior, o antes del dígito 1en la línea siguiente, el programa no se comporta de manera diferente.

Los archivos de entrada contienen un número entero por línea (esta es la representación habitual de las listas como archivos de texto). Deben pasarse como dos argumentos. La lista resultante se escribe en la salida estándar.

# 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

Siéntase libre de usar este programa como ejemplo de su mejor código en una entrevista. Todo lo que pido es que no digas que es mi mejor código.

Gilles 'SO- deja de ser malvado'
fuente
1

Tcl

En el espíritu de la cita

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

Si es un duplicado, multiplíquelo con (-) 1, luego filtre los valores negativos.

Johannes Kuhn
fuente
Esta respuesta fue escrita de esa manera antes de que la pregunta cambiara. En el espíritu de la cita, todavía prefiero que las entradas sean negativas.
Johannes Kuhn
-1

Soy principiante en PHP, no sé si es correcto

$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
fuente
77
No parece que esto realmente responda al desafío: no veo un 1 literal en ninguna parte de su código.
Riking