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.


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


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.


¿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

3

Pitón

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

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.


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.


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

77
No parece que esto realmente responda al desafío: no veo un 1 literal en ninguna parte de su código.
Riking
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.