Sua tarefa é simples . Determinar se uma cadeia é igual ao outro (não endereço, o valor) sem o uso de operadores de igualdade (como ==
, ===
ou .equal()
) ou desigualdade ( !=
, !==
) algo semelhante para outros idiomas. Isso significa em qualquer lugar! Você não pode usar esses operadores em qualquer lugar do código. No entanto, você pode usar alternâncias como !exp
não comparar diretamente o exp != with something else
.
Além disso, você não pode usar funções como strcmp , strcasecmp , etc.
Tal como para os operadores de comparação ( >=
, <=
, >
, <
), eles são também anulado . Sei que algumas respostas incluem isso, mas eu realmente gostaria de ver mais respostas que não fazem fronteira com o operador de igualdade.
Um exemplo usando PHP é mostrado:
<?php
$a = 'string';
$b = 'string';
$tmp = array_unique(array($a, $b));
return -count($tmp) + 2;
Simplesmente retorne verdadeiro ou falso (ou algo que avalie no idioma como verdadeiro ou falso como 0 ou 1) para indicar se as cadeias correspondem. As strings devem ser codificadas como no exemplo acima. As seqüências de caracteres não devem ser contadas no golfe; portanto, se você declarar a variável antes da mão, não conte a declaração.
Respostas:
Python
49 45 18 22 1514(+ 3 se variáveis de string forem consideradas)
A cadeia deve ser codificada nas duas ocorrências dea
e uma ocorrência entreb
aspas.a
eb
deve ser pré-inicializado para as strings.Shell Python, 9
(+ 3 se variáveis de string forem consideradas)
Saída com casca
Explicação
Cria um ditado (tabela de hash) com a chave da primeira e da segunda string. Se a segunda sequência for a mesma, o valor da primeira será substituído pelo valor da segunda. Finalmente, imprimimos o valor da primeira chave.
EDIT: OP permitiu 0/1 em vez de False / True, além de usar variáveis pré-inicializadas.
fonte
a
eb
não devem ser incluídos, as cordas deve ser codificado lá, é por isso que eu adicionei + 2 * len (str1) + len (str2) + 6 ( ')Python (
1711):(Verifica se b está contido em ae a está contido em b, se isso não ficou claro no código.)
Python alternativo: (
87)derivado da solução Go de Tom Verelst:
Bônus: isso funciona para qualquer tipo.
EDITAR:
Espere um segundo, apenas leia que você também pode programar diretamente nas strings e não precisa contar aspas ... (ou pelo menos o que o golfscript faz). Então ... Python a par com golfscript? Oh meu!
Alternativa alternativa em Python (
54):(obrigado Claudiu)
original:
Alternativa Alternativa Alternativa Python Bendy-ruly (2):
Nada foi dito sobre palavras-chave de comparação (este não é um envio sério, apenas algo que me ocorreu ...)
fonte
b in a in b
. O e um não é necessário ... #in
e[a]
. ou seja,b in[a]
deve funcionar.JavaScript,
1110As strings devem ser armazenadas em a e b.
Edit: obrigado Danny por apontar,
|
é suficiente em vez de||
fonte
|
?Ruby, 11
Verifica se cada sequência está contida na outra.
fonte
!(a<b||b<a)
seria o mesmo ...Python - 11 (sem as cordas)
fonte
a<=b<=a
são apenas 7 caracteres. Embora eu não saiba se a comparação<=
seria considerada uma "desigualdade". A partir da pergunta, parece que qualquer comparação que não seja uma verificação de igualdade está correta, o que permitiria<=
.GolfScript (5 caracteres)
Porta bastante direta da implementação de referência do PHP. Deixa
0
(= false) na pilha se as strings forem iguais ou1
(= true) se forem diferentes.fonte
1
se a string é a mesma e2
se é diferente.'string1''string1'].&,1&
trabalha #Javascript (45 bytes):
Aqui está outra solução em Javascript.
O espaço é importante.
c
deveria sertrue
.fonte
!a.replace(b,'')
é contado. Portanto, a contagem de caracteres deve ser 16. Na verdade, algumas pessoas contam até 14, já que você pode especificar a sequência diretamente.C ++,
635856fonte
auto
vez deconst char*
?coreutils: uniq -d
Basta digitar suas duas seqüências como a entrada padrão de um tubo e
uniq -d | grep -q .
não imprimirá nada, mas terá um valor de retorno de sucesso ou erro. Se você deseja imprimir o booleano, substitua-o poruniq -d | grep -c .
Quantos caracteres? Eu deixo você contar;
uniq -d|grep -q .
sem espaços extras tem 17 caracteres, mas como todo o trabalho é realizado pela uniq, eu diria que esta solução é de 0 caracteres em ...uniq
idioma próprio!Na verdade,
uniq -d
imprimirá uma linha se as duas strings forem idênticas e nada se as forem diferentes.fonte
As strings devem ser armazenadas em a e b. Não funcionará se for
null
.C #, 53
C #, 28
fonte
PHP - 49 caracteres
fonte
!strlen(str_replace($a,'',$b));
ele deve retornar 1 se duas strings forem iguais?$a == 'foo'
e$b = 'foofoo'
:)!strlen(preg_replace("/{$a}/", '', $b, 1));
e tem 45 caracteres?APL (
89)Atualização: o antigo não funciona para strings de comprimentos diferentes.
↑⍺⍵
: faça uma matriz com⍺
na primeira linha e⍵
na segunda linha, preenchendo espaços em branco com espaços.∊⌿
: Para cada coluna, veja se a linha superior contém a linha inferior (como na versão antiga).∧/
: Pegue a lógicaand
de todos os valores.Antigo:
⍺∊¨⍵
: para cada combinação de elementos em⍺
e⍵
, veja se o elemento de⍺
contém o elemento de⍵
. Como em uma string, todos serão caracteres únicos e uma string contém a si mesma, isso basicamente compara cada par de caracteres.∧/
: pegue o lógico e todos os valores (se todos os caracteres corresponderem, as seqüências de caracteres serão iguais)fonte
Python - 12
Esta solução usa conjuntos. Subtrair conjuntos iguais resultará em um conjunto vazio, que possui um valor booleano False. Negar isso resultará em um valor Verdadeiro para a e b sendo cadeias iguais.
Edit: Obrigado a Peter Taylor por apontar o espaço em branco desnecessário.
fonte
a="s", b="ss"
?"s"!="ss"
, ele será exibidoFalse
. A distinção entre maiúsculas e minúsculas também é preservada. Até funcionaa="", b="s"
. O código não converte cadeias de caracteres em conjuntos, mas cria conjuntos contendo as cadeias.{}
não é o mesmo queset()
. Você pode salvar 1 caractere removendo o espaço em branco.{a}
é equivalente aset([a])
.not {a}-{b}
?C - 62
Testado. Ligar como
e(str1, str2)
Venha para pensar sobre isso, se você não conta
char*p,char*q
, o que parece justo, são apenas 49 bytes :)fonte
np
enq
. Um loop serve, porque se você chegar ao final de uma string antes da outra, eles terão um valor diferente.*p&*q
pode parar o ciclo demasiado cedo (por exemplo'0'&'A'==0
)*p=='0'
&*q=='A'
, queremos que o loop pare mais cedo, pois sabemos que as strings não são iguais.Haskell - 9
Observe que isso, assim como muitas entradas aqui, é apenas uma expressão. Este não é um programa Haskell.
fonte
Java -
162147 caracteresA idéia é comparar a diferença de cada byte, os mesmos bytes terão diferença 0. O programa lançará
java.lang.ArrayIndexOutOfBoundsException
para quando os bytes forem diferentes (tente acessar um índice negativo) ou quando as strings tiverem comprimento diferente. Ele capturará a exceção e retornará 0 (cadeias não iguais) ou retornará 1 caso contrário (cadeias iguais).Comprimido:
Normal:
fonte
PHP
Esse script pode não ter nenhum utilitário, mas pelo menos isso fornece uma maneira de comparar seqüências de caracteres.
PHP
Outro:
fonte
Prolog 7
Isso usa o recurso de correspondência de padrões no Prolog para unificar os 2 argumentos ao predicado, que efetivamente testa a equivalência igual quando não há variável não acoplada .
Uso da amostra:
Tecnicamente falando, o comportamento dessa solução é o de operador de unificação
=/2
, e não o de==/2
, que verifica a equivalência de termos. A diferença mostra quando variáveis não acopladas estão envolvidas. Nesta solução, quando a variável não acoplada for fornecida, o predicado retornarátrue
quando a unificação for bem-sucedida. Em comparação,==/2
comparará a ordem do termo sem unificação.fonte
PHP, 21
Este está fazendo o trabalho usando variável indireta.
Ou, se você não precisa ser booleano
Edição : Eu esqueci de lidar com o caso em que você tenta comparar duas seqüências de caracteres vazias, então o código agora é
que são 21 caracteres.
fonte
CPython: 6
O uso de
is
é obviamente bastante suspeito, mas como a tarefa especifica especificamente que devemos determinar a igualdade de valor em vez de referenciar a igualdade, eis
apenas comparar a identidade do objeto, acho que pode não estar na lista de operadores proibidos.É claro que há também uma dúvida sobre se isso é válido; funciona em todos os meus sistemas, mas é específico da implementação e provavelmente nem sempre funcionará se as seqüências de caracteres não forem definidas manualmente no intérprete interativo.
fonte
Linguagem Mathematica / Wolfram, 15 bytes
Bastante auto-explicativo, define cada string como um conjunto e depois verifica o comprimento da união dos dois conjuntos. Se as seqüências de caracteres forem iguais, retorna 1, caso contrário, retorna 0. Se for permitido retornar '2' para "diferente" e '1' para "igual", subtraia dois bytes.
fonte
C 342 golfed
Nota: O Visual Studio reclama se você não usar seus métodos seguros, por exemplo, gets_s. CodeBlocks com mingw compila sem avisos.
C 655 não jogou golfe
O código cria uma soma ponderada de caracteres para cada sequência. Se a diferença for zero, eles serão iguais, incluindo duas cadeias vazias:
fonte
Python
É longo e não é bonito, mas esta é a minha primeira entrada!
fonte
PHP, 68 bytes
Eu suponho que você está proibido de usar quaisquer operadores de comparação. Então,
<
ou>
estão incluídos.A idéia é usar o XOR bit a bit. Em linguagens diferentes, este operador possui sintaxe diferente - mostrarei um exemplo para PHP. Lá está disponível com
^
. Infelizmente, seu comportamento com as strings não é tão bom quanto poderia ser, portanto, você precisará verificar o comprimento da string antes. Isso ocorre porque, no PHP, o xor reduz a cadeia mais longa até o comprimento da cadeia mais curta.O próximo passo é trabalhar com as strings corretamente, porque uma única
xor
não produzirá um resultado, disponível para operações adicionais no PHP. Por issounpack()
foi usado. Então, o código seria:É mais longo que a opção com
<
/>
mas não os usará. Além disso, o importante é o malabarismo do tipo PHP (para que a matriz vazia seja convertida emfalse
). Ou talvez haja uma maneira mais simples de verificar se uma matriz contém membros diferentes de zero ( Edit : enquanto eu estiver digitando isso, há uma boa captura comtrim()
outra resposta, para que possamos nos livrar das operações da matriz)Mas acredito que existem idiomas, onde podemos fazer exatamente
a ^ b
- literalmente, obter o resultado. Se for0
(tratado de todos os bytes resultantes) - então nossas strings são iguais . É muito fácil e ainda mais simples do que<
ou>
material.fonte
grep 14 caracteres
Claro, eu apenas conto o código grep; as duas strings estão em duas linhas consecutivas na entrada (um pipe ou um arquivo ou mesmo uma sessão interativa).
fonte
Matlab: 12 caracteres (após as strings estarem em variáveis)
O código, incluindo atribuições, seria:
fonte
O jeito muito louco
Apenas por diversão, mas muitas maneiras de fazê-lo falhar se alguém pensar sobre isso. Além disso, não esqueça que as cordas serão EXECUTADAS pelo shell.
Um bom contra-exemplo é comparar "string" como primeira string e "rm -Rf /" como segunda string; basta verificar como root e ver: ele dirá "true", embora ambas as strings obviamente não sejam iguais.
fonte
JavaScript [18 bytes]
OU
Isso retornará
true
sea == b
efalse
sea =/= b
. A lógica subjacente é criar um objeto com um valor dea
como uma propriedade e retornar1
ouundefined
, casob
exista ou não uma propriedade de valor nesse objeto.fonte
!!
não é necessário1
ouundefined
(ou objeto /undefined
para o segundo caso).18-2 = 16 bytes
.JavaScript [15 bytes]
Isso retornará
true
sea == b
efalse
sea =/= b
. O script está procurando o valor deb
na matriz que contém um único elemento de valor dea
.fonte
C -
8683Obvioulsy não é o menor, mas isso não funciona com variáveis de string e, em vez disso, pega as strings como entrada do console. Além disso, eu meio que gosto do main recursivo, mesmo que obviamente não seja a versão mais curta. Mas certamente o menos aconselhável.
fonte
char** v
pode ser escrito comochar**v
. Existem algumas exceções (como42 / *pointer
), mas na maioria dos casos, os espaços podem ser removidos com segurança perto de caracteres especiais.