Determinar se Strings são iguais

29

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 !expnã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.

David Chen
fonte
11
É necessário gerar o resultado ou simplesmente escrever uma função para retornar um bool? Se for necessário escrever um programa completo, isso pode dar respostas erradas em linguagens com clichê (relativamente) significativo para criar um executável funcional como Java e C # (tal é a natureza da besta, mas esse desafio tem pouco caminho) diretrizes concretas, deixando muito a interpretação / escolha). E como devemos levar as cordas? A codificação codificada, lendo STDIN, passa como argumentos da linha de comando?
Tony Ellis
Isso é [código-golfe] ou [concurso de popularidade]? Não pode ser os dois.
Gareth
Desculpe, modifiquei minhas perguntas para refletir os dois comentários.
David Chen
Então a desigualdade é permitida?
user80551
Se as seqüências de caracteres tiverem de ser codificadas mais de uma vez (cada uma), tenho que contar seu comprimento?
user80551

Respostas:

34

Python 49 45 18 22 15 14

(+ 3 se variáveis ​​de string forem consideradas)

print{a:0,b:1}[a]

A cadeia deve ser codificada nas duas ocorrências de ae uma ocorrência entre baspas.

ae bdeve ser pré-inicializado para as strings.


Shell Python, 9

(+ 3 se variáveis ​​de string forem consideradas)

{a:0,b:1}[a]

Saída com casca

>>> a = 'string'
>>> b = 'string'
>>> {a:0,b:1}[a]
1
>>> a = 'string'
>>> b = 'stringgg'
>>> {a:0,b:1}[a]
0
>>> {'string':0,'string':1}['string']
1
>>> {'stringggg':0,'string':1}['stringggg']
0
>>> 

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.

user80551
fonte
@manatwork Golfscript e perl abaixo usam 0/1, não posso usar isso?
user80551
@manatwork Concluído
user80551
Estou contando 16 em vez de 13, para sua segunda solução.
Abhijit 12/03
@Abhijit a ae bnão devem ser incluídos, as cordas deve ser codificado lá, é por isso que eu adicionei + 2 * len (str1) + len (str2) + 6 ( ')
user80551
+1 para clevernesse mas este é, de longe, não o mais curto mais;)
avalancha
20

Python ( 17 11):

b in a in b

(Verifica se b está contido em ae a está contido em b, se isso não ficou claro no código.)

Python alternativo: ( 8 7)

derivado da solução Go de Tom Verelst:

b in[a]

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 ( 5 4):

(obrigado Claudiu)

"string"in["string"]

original:

"string" in["string"]

Alternativa Alternativa Alternativa Python Bendy-ruly (2):

"string"is"string"

Nada foi dito sobre palavras-chave de comparação (este não é um envio sério, apenas algo que me ocorreu ...)

ɐɔıʇǝɥʇuʎs
fonte
2
Você poderia usar b in a in b. O e um não é necessário ... #
George
2
Agora é duplicado da resposta de willem .
manatwork
Você pode reduzi-lo a sete caracteres removendo o espaço em branco entre ine [a]. ou seja, b in[a]deve funcionar.
user3002473
Oh, não sabia disso. Obrigado :)
Marıʇǝɥʇuʎs
Impressionante! Também não sabia disso #
Willem
14

JavaScript, 11 10

As strings devem ser armazenadas em a e b.

!(a>b|a<b)

Edit: obrigado Danny por apontar, |é suficiente em vez de||

Adam Szabo
fonte
5
Não, estou usando operadores maiores e menores que. Aqueles não foram proibidos no concurso.
Adam Szabo
2
+1. Isso também funcionará de maneira idêntica em muitos outros idiomas.
The Paul Archetypal
3
Posso estar errado, mas você não pode remover um |?
21714 Danny
3
Definitivamente uma supervisão de regras - as funções de comparação são proibidas, assim como os operadores de igualdade e desigualdade , mas os operadores de comparação não são mencionados.
User2357112 suporta Monica
2
@philcolbourn Sim, as regras foram alteradas ontem, mas a resposta tem 2 dias.
Bakuriu 15/03/14
8

Ruby, 11

s = 'string'
t = 'string'
!!s[t]&t[s]

Verifica se cada sequência está contida na outra.

histocrata
fonte
11
!(a<b||b<a)seria o mesmo ...
David Herrmann
exceto que você não pode usar <>
philcolbourn
8

Python - 11 (sem as cordas)

>>> a = 'ss'
>>> b = 's'
>>> a in b in a
False
Willem
fonte
No mesmo espírito: a<=b<=asã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 <=.
Bakuriu
Sim, isso é bom @Bakuriu, e eu concordo, não é totalmente claro quando as regras são violadas ou não. 'in', afinal, também como contém uma declaração igual.
Willem
6

GolfScript (5 caracteres)

'string1''string1'].&,(

Porta bastante direta da implementação de referência do PHP. Deixa 0(= false) na pilha se as strings forem iguais ou 1(= true) se forem diferentes.

Peter Taylor
fonte
não funciona para mim: 1se a string é a mesma e 2se é diferente. 'string1''string1'].&,1&trabalha #
guy777 13/03
@ guy777, isso pressupõe que a pilha esteja vazia no início. A questão é bastante vaga nos fragmentos do programa. Você provavelmente está testando o programa como um todo e começando com uma string vazia na pilha do stdin.
Peter Taylor
5

Javascript (45 bytes):

Aqui está outra solução em Javascript.

var a='string',b='string',c=!a.replace(b,'');

O espaço é importante.

cdeveria ser true.

Ismael Miguel
fonte
Somente !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.
N
5

C ++, 63 58 56

const char* a = "string";
const char* b = "string";
int main(){while(*a**b*!(*a^*b))++a,++b;return!(*a^*b);}
mattnewport
fonte
2
Você poderia se safar em autovez de const char*?
Aldo
Acho que sim, mas como as regras dizem que as variáveis ​​de string não são contadas na contagem de caracteres, eu não me incomodei em jogá-las.
mattnewport
Você poderia dobrar incrementos no teste while e deixar o corpo vazio? E se você optar por c em vez de c ++, remova int no início.
1313 orion
Não vejo nenhuma maneira de reduzir a contagem de caracteres dobrando os incrementos no teste while sem atingir o mesmo bug de acessar uma string após o fim que apontei na resposta C de Abhijit. Você só deseja incrementar aeb se ambos os testes passarem (nem a nem b estão apontando para o terminador nulo e a é igual a b). Provavelmente existe uma maneira de melhorar isso, mas não consegui encontrá-lo!
22814 Mattnewport
3

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 ... uniqidioma próprio!

Na verdade, uniq -dimprimirá uma linha se as duas strings forem idênticas e nada se as forem diferentes.

Thomas Baruchel
fonte
3

As strings devem ser armazenadas em a e b. Não funcionará se for null.

C #, 53

string.IsNullOrEmpty(a.Replace(b,"")+b.Replace(a,""))

C #, 28

a.Contains(b)&&b.Contains(a)
Adam Szabo
fonte
3

PHP - 49 caracteres

!(strlen($a)^strlen($b)|strlen(trim($a^$b,"\0")))
Jack
fonte
Não poderia algo parecido com este trabalho: !strlen(str_replace($a,'',$b));ele deve retornar 1 se duas strings forem iguais?
Damir Kasipovic 17/03/14
@ D.Kasipovic Interessante, mas eu acho que falha por $a == 'foo'e $b = 'foofoo':)
Jack
É verdade que tal isso limita a substituição a um !strlen(preg_replace("/{$a}/", '', $b, 1));e tem 45 caracteres?
Damir Kasipovic 17/03/2014
Suponho que você possa usar âncoras, mas o mais importante é que isso também exigiria preg_quote () :)
Jack
3

APL ( 8 9)

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ógica and 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)
marinus
fonte
3

Python - 12

not({a}-{b})

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.

>>> a="string1"
>>> b="string2"
>>> not({a}-{b})
False

>>> a="string"
>>> b="string"
>>> not({a}-{b})
True

Edit: Obrigado a Peter Taylor por apontar o espaço em branco desnecessário.

Varicus
fonte
Que saída isso oferece a="s", b="ss"?
Peter Taylor
@ PeterTaylor: Desde então "s"!="ss", ele será exibido False. A distinção entre maiúsculas e minúsculas também é preservada. Até funciona a="", b="s". O código não converte cadeias de caracteres em conjuntos, mas cria conjuntos contendo as cadeias.
Varicus 13/03
Ah, {}não é o mesmo que set(). Você pode salvar 1 caractere removendo o espaço em branco.
Peter Taylor
@ PeterTaylor: Obrigado por apontar o espaço em branco desnecessário. {a}é equivalente a set([a]).
Varicus
Que tal not {a}-{b}?
Winston Ewert 28/03
3

C - 62

e(char*p,char*q){for(;*p&*q&&!(*p^*q);q++,p++);return!(*p^*q);}

Testado. Ligar comoe(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 :)

Emmet
fonte
Bem vindo ao site! Para desafios de código-golfe, recomendamos que você apare o máximo de bytes possível do seu código e publique a contagem de bytes no cabeçalho da resposta. Confira as dicas para jogar golfe no segmento C para obter algumas boas idéias.
22416 Jonathan Van Matre
Você realmente não precisa npe nq. Um loop serve, porque se você chegar ao final de uma string antes da outra, eles terão um valor diferente.
Peter Taylor
Obrigado. Eu percebo isso. Eu estava trabalhando na minha versão abreviada (acima). Voltando para ver se posso reduzi-lo ainda mais.
Emmet
*p&*qpode parar o ciclo demasiado cedo (por exemplo '0'&'A'==0)
ugoren
@ugoren: Se *p=='0'& *q=='A', queremos que o loop pare mais cedo, pois sabemos que as strings não são iguais.
Emmet
2

Haskell - 9

elem a[b]

Observe que isso, assim como muitas entradas aqui, é apenas uma expressão. Este não é um programa Haskell.

Rhymoid
fonte
2

Java - 162 147 caracteres

A idéia é comparar a diferença de cada byte, os mesmos bytes terão diferença 0. O programa lançará java.lang.ArrayIndexOutOfBoundsExceptionpara 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:

String a = "12345";
String b = "12345";
byte[]x=a.getBytes(),y=b.getBytes();int z,i=a.length()-b.length();try{for(byte d:x){z=d-y[i];z=x[-z*z];i++;}}catch(Exception e){return 0;}return 1;

Normal:

String a = "12345";
String b = "12345";
byte[] byteArrA = a.getBytes();
byte[] byteArrB = b.getBytes();

int byteDifference = 0;
int i = a.length() - b.length();

try {
    for (byte aByte : byteArrA) {
        byteDifference = aByte - byteArrB[i];
        byteDifference = byteArrA[-byteDifference*byteDifference];
        i++;
    }
} catch (Exception e){
    return 0;
}

return 1;
Hopper Hunter
fonte
Existem operadores de comparação no loop.
ζ--
Obrigado @hexafraction, atualizei a resposta para não incluí-los.
Hopper Hunter
2

PHP

    $string = 'string';
    isset( ${'string'} );

Esse script pode não ter nenhum utilitário, mas pelo menos isso fornece uma maneira de comparar seqüências de caracteres.

PHP

Outro:

    $string = 'something';
    $text   = 'something';
    return count( array( $string => 1 , $text => 1 ) ) % 2;
Hamid Sarfraz
fonte
11
Uau, muito adorável. E fazê-lo dessa maneira pode possibilitar o uso de qualquer string (com espaços e unicode).
David Chen
2

Prolog 7

e(A,A).

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:

?- e("abcd", "Abcd").
false.

?- e("abcd", "abcd").
true.

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á truequando a unificação for bem-sucedida. Em comparação, ==/2comparará a ordem do termo sem unificação.

n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳
fonte
2

PHP, 21

Este está fazendo o trabalho usando variável indireta.

$$a=$b;!!$$b;

Ou, se você não precisa ser booleano

$$a=$b;$$b;

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 é

$$a=$b;!($a.$b)||$$b;

que são 21 caracteres.

Flonk
fonte
Eu esperava que isso desse erros quando recebidas strings que não são identificadores válidos, mas, para minha surpresa, não.
Peter Taylor
Dois problemas: 1. Retorna true ao comparar "0" e "". 2. Retorna true quando $ b é o nome de uma variável existente (na tabela de símbolos atual) com um valor que se converte em true (por exemplo, "GLOBALS" ou "_SERVER" no escopo global ou "b" em qualquer escopo), mesmo quando $ b não for igual a $ a.
precisa saber é o seguinte
2

CPython: 6

a is b

>>> a = 'string'
>>> b = 'string'
>>> c = 'STRING'
>>> a is b
True
>>> a is c
False

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, e isapenas 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.

Henry Keiter
fonte
2

Linguagem Mathematica / Wolfram, 15 bytes

2 - Length[{a} ∪ {b}]

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.

Michael Stern
fonte
2

C 342 golfed

#include <stdio.h>
#define N 100
#define P(x) printf("%s\n",x)
#define G(x) gets(x)
void e(int x){x?P("y"):P("n");}
int main(){
char s[N],t[N];char *p,*q;int r=0; int n=0,m=0;int i=1;p=s,q=t;
if((p=G(s))&&(q=G(t))){while (*p){n+=i*(int)*p;m+=i*(int)*q;i++;p++;q++;if(!(*q)){break;}}
if(!*p&!*q){if(!(m-n)){r=1;}}e(r);}
return 0;
}

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:

    #include <stdio.h>
#define N 100
#define P(x) printf(x)
#define G(x) gets_s(x)

void e(int x){ x ? P("equal\n") : P("not equal\n"); }
int main()
{
    char s[N], t[N];//words
    char *p = 0, *q = 0;
    int r = 0; //result 0=false
    int n=0, m=0; //weighted sums
    int i = 1; //char pos start at 1
    if ((p=gets_s(s)) &&
        (q=gets_s(t)))
    {
        while (*p)
        {
            n += i*(int)*p;
            m += i*(int)*q;
            i++;
            p++;
            q++;
            if (!(*q)){
                break;
            }
        }

        if (!*p && !*q){ //both same length strings
            if (!(m - n)){ r = 1; } //weighted sums are equal           
        }//else r=0, false=>not equal

        e(r);
    }
    else{
        P("error\n");
    }
    getchar();
}
bacchusbeale
fonte
Bom trabalho, mas você provavelmente deveria jogar golfe.
Hosch250
Não consigo compilar sua inscrição. Eu recebo "símbolos indefinidos para a arquitetura x86_64: "_gets_s", referenciados a partir de: _main no golfe-310cf2.o ld: Símbolo (s) não foi encontrado para a arquitetura x86_64"
Stephen Melvin
2

Python

É longo e não é bonito, mas esta é a minha primeira entrada!

def is_equal(a,b):
    i=0
    a,b=list(a),list(b)
    if len(a)>len(b):
        c=a
        lst=b
    else:
        c=b
        lst=a
    try:
        while i<len(c):
            for j in c:
                if j not in lst[i]:
                    return False
                i+=1
    except IndexError:
        return False
    return True
yung gálbano
fonte
2

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 xornão produzirá um resultado, disponível para operações adicionais no PHP. Por isso unpack()foi usado. Então, o código seria:

return !(strlen($a)^strlen($b)) & !array_filter(unpack('c*', $a^$b))

É 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 em false). 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 com trim()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 for 0(tratado de todos os bytes resultantes) - então nossas strings são iguais . É muito fácil e ainda mais simples do que <ou >material.

Alma Do
fonte
1

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

$ echo -e 'string\nstring' | grep -cPzo "(?s)^(\N*).\1$"
1
$ echo -e 'string\nstring1' | grep -cPzo "(?s)^(\N*).\1$"
0
$ echo -e 'string1\nstring' | grep -cPzo "(?s)^(\N*).\1$"
0
Thomas Baruchel
fonte
1

Matlab: 12 caracteres (após as strings estarem em variáveis)

~(x*x'-y*y')

O código, incluindo atribuições, seria:

x='string1'
y='string2'
~(x*x'-y*y')
Dennis Jaheruddin
fonte
1

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.

$ echo -e 'string\nstring1' | sed -e '1s/^/#define /' | cpp | sh 2>/dev/null && echo true
$ echo -e 'string\nstring' | sed -e '1s/^/#define /' | cpp | sh 2>/dev/null && echo true
true
$ echo -e 'string1\nstring' | sed -e '1s/^/#define /' | cpp | sh 2>/dev/null && echo true

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.

Thomas Baruchel
fonte
1

JavaScript [18 bytes]

(_={})[a]=1,!!_[b]

OU

!!((_={})[a]=_)[b]

Isso retornará truese a == be falsese a =/= b. A lógica subjacente é criar um objeto com um valor de acomo uma propriedade e retornar 1ou undefined, caso bexista ou não uma propriedade de valor nesse objeto.

Visão
fonte
As regras dizem que você está autorizado a retornar um objeto que é avaliada como verdadeira ou falsa, de modo a !!não é necessário
James_pic
@ James_pic Sim, mas, caso contrário, ele retornará 1ou undefined(ou objeto / undefinedpara o segundo caso).
VisioN
Interpretei as regras como dizendo que os valores de verdade-e-falso-y funcionariam no lugar de verdadeiro e falso, então acho que 1 ou indefinido são bons o suficiente.
James_pic
@ James_pic Eu só queria estar do lado seguro :) Se sim, então 18-2 = 16 bytes.
VisioN
1

JavaScript [15 bytes]

![a].indexOf(b)

Isso retornará truese a == be falsese a =/= b. O script está procurando o valor de bna matriz que contém um único elemento de valor de a.

Visão
fonte
1

C - 86 83

main(int i,char**v){return*v[1]&!(*v[1]++^*v[2]++)?main(3,v):!(*--v[1]^*--v[2]);}

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

SBI
fonte
Você não precisa de espaços em torno de muitos operadores. Por exemplo, char** vpode ser escrito como char**v. Existem algumas exceções (como 42 / *pointer), mas na maioria dos casos, os espaços podem ser removidos com segurança perto de caracteres especiais.
Konrad Borowski
E um apersand demais. Hoje não está no topo.
SBI