Evite entradas duplicadas usando uma alteração de sinal


14

Esta anedota contém a seguinte troca intrigante:

"Tudo bem, Fred", Avi interrompeu. "Então, como você mudaria isso para evitar entradas duplicadas?"

"Oh, apenas mude esse lá para um negativo."

Embora essa alegação não seja precisa no contexto, pergunto-me se há algum código plausível para o qual isso faça sentido.

Seu desafio é escrever um código (um programa, uma função, qualquer que seja) que atenda a este critério:

  1. Mescla duas listas de entrada em uma, mantendo duplicatas. [editar: Você pode opcionalmente assumir que eles são números inteiros e / ou que as próprias listas são únicas. Você não pode assumir que os números inteiros são positivos (a única resposta que faz isso é o avô).]
  2. Um literal "1" aparece em algum lugar do código. Se você alterar isso para um literal "-1", o código fará a mesma coisa, mas removerá duplicatas.
  3. O código não se ramifica simplesmente de 1 / -1. Não estamos procurando if (1 < 1) removeDuplicates()ou [do_nothing, merge_with_dups, merge_without_dups][1].call(), por exemplo.

A entrada e a saída podem estar em qualquer formato razoável que você escolher. Um exemplo pode ser

[1,2],[2,3]->[1,2,2,3]antes da mudança do sinal e [1,2,3]depois.

Este é um concurso de popularidade. Não é um código de golfe , a menos que você queira se exibir. Aceito a resposta mais votada em cerca de duas semanas.


Qual é a entrada - apenas números inteiros? Positivo e / ou negativo? Se as listas de entrada contiverem duplicatas, elas devem ser removidas no -1caso?
Reintegrar Monica

1
Devemos assumir que as listas de entrada são classificadas e não contêm duplicatas?
Ugoren

Meu primeiro pensamento quando vi isso no DailyWTF foi que eles precisavam definir "mesclagem". Esta questão também precisa de uma definição.
Peter Taylor

"Eles o chamam de Boris, o Dodger da bala" "Por que o chamam assim?" "... Porque ele evita balas, Avi". Algum fã do Snatch no CodeGolf?
Bojangles

Respostas:


11

Javascript

Pegue um algoritmo convencional e escreva-o com um bug:

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 contém exatamente um literal 1. Se for alterado para -1, as duplicatas serão removidas. Pode ser usado em quaisquer valores comparáveis.


5

APL 22/23

Solicita a entrada da tela via ← ⎕ e retorna uma lista mesclada ordenada com ou, se a primeira for definida como negativa, sem duplicatas.

(~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, observe que os caracteres APL de byte único foram convertidos em UTF8 para renderizar corretamente neste site.


Como o -1 muda tudo?
Johannes Kuhn

@Johannes Kuhn No exemplo acima, o código 0, -2 = / v produz o vetor 0 0 ¯1 0 com ¯1, indicando a posição de uma entrada duplicada. Testar esse vetor com relação a 1 e ¯1 produz 0 0 0 0 ou 0 0 1 0 invertendo os elementos booleanos, dando 1 1 1 1 ou 1 1 0 1. Esses vetores são usados ​​para selecionar os elementos apropriados do vetor mesclado.
Graham

4

k (18)

Deve funcionar para qualquer tipo válido de lista

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

Exemplo:

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ão

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

2

Bater

No espírito do contexto, este programa remove as duplicatas se você adicionar um sinal de menos antes da minúscula lna greplinha. Se você adicionar um sinal de menos antes das maiúsculas Ina linha anterior ou antes do dígito 1na próxima linha, o programa não se comportará de maneira diferente.

Os arquivos de entrada contêm um número inteiro por linha (esta é a representação usual de listas como arquivos de texto). Eles devem ser passados ​​como dois argumentos. A lista resultante é gravada na saída padrão.

# 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

Sinta-se livre para usar este programa como um exemplo do seu melhor código em uma entrevista. Tudo o que peço é que você não diga que é o meu melhor código.


1

Tcl

No espírito da citação

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

Se for uma duplicata, multiplique-a por (-) 1, depois filtre os valores negativos.


Essa resposta foi escrita dessa maneira antes que a pergunta mudasse. No espírito da citação, ainda prefiro deixar as entradas negativas.
Johannes Kuhn

-1

Eu sou iniciante em PHP, não sei se está correto

$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
Parece que isso realmente responde ao desafio - não vejo um literal 1 em nenhum lugar do seu código.
Riking
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.