Compare dois números dados como cadeias


21

Eu tenho um problema no trabalho. Eu preciso comparar dois números que vêm como seqüências de caracteres de dois bancos de dados diferentes. Os números podem vir com zeros à esquerda e / ou espaços à esquerda / à direita. Então eu posso ter "0001 "de um banco de dados e " 1 "do outro.

Resolvi o problema em C # com o seguinte código:

Func<string, string, bool> f = (a,b) => int.Parse(a.Trim()) == int.Parse(b.Trim())

O desafio

Este é um desafio realmente simples, adequado para iniciantes e qualquer tipo de linguagem esotérica. Dado dois números como cadeias que podem vir com zeros à esquerda e / ou espaços à esquerda / à direita, escreva o código mais curto que verifica se as duas cadeias representam o mesmo número.

  • As entradas precisam ter duas strings ou o equivalente no seu idioma (uma matriz de caracteres é OK) e sempre representam valores inteiros maiores que zero.
  • A saída deve ter quaisquer dois valores consistentes que representem um valor de verdade e um valor de falsey.

Exemplos

A          B          Result
----------------------------
"0001"     "1    "    true
"1450"     "1450 "    true
"0010001 " " 10001  " true
"0010000"  "  10  "   false
"101023"   "101024"   false

Este é o , portanto, pode ganhar o código mais curto para cada idioma!



8
Como menos não é inspirada por seus filhos desta vez ...
Caird coinheringaahing

2
@cairdcoinheringaahing meu próprio trabalho é minha segunda fonte de inspiração. Sei que este é um desafio muito simples, mas acho que esses desafios fáceis também são necessários algumas vezes. Vou tentar pensar em algo mais difícil da próxima vez.
Charlie

By the way, parece que meus desafios de inspiração de trabalho são demasiado fácil ou muito difícil ...
Charlie

@ JonathanAllan não, cada sequência de entrada representará apenas um número. Não haverá espaços entre as strings.
Charlie

Respostas:


22

Javascript , 11 bytes

a=>b=>+a==b

Abusando um pouco das regras de elenco do Javascript; +acoage aem um tipo numérico.

-6 bytes graças a Shaggy e Martin Ender ♦

Também uma tomada legal por LiefdeWen :

a=>b=>~~a==~~b

2
Bem-vindo ao PPCG. Você pode fazer isso em 11 bytes usando currying e convertendo apenas uma das entradas em um número inteiro: tio.run/##y0osSyxOLsosKNHNy09J/… Observe também que, a menos que uma função faça referência, não é necessário incluir a variável atribuição na sua contagem de bytes.
Shaggy

2
Bem-vindo ao PPCG! As funções sem nome são boas, então você não precisa c=, e o curry também é bom, para que você possa usar em a=>b=>...vez de (a,b)=>. Finalmente, meu JavaScript está um pouco enferrujado, mas acho que algo como !(a-b)também funcionaria?
Martin Ender

1
Consulte as dicas de golfe no ES6 (e dicas gerais sobre golfe em JS ) para obter mais truques para extrair bytes de suas soluções.
Shaggy

1
O versiopn legal é legal, mas de escopo limitado, tente as entradas '9123456789' e '533522197'. Estes são cordas rapresentation de valores inteiros, estão bem dentro do intervalo válido de números inteiros em javascript (mas mais de 32 bit)
edc65

1
Seu texto não corresponde mais ao código; não há subtração. Você está coagindo apara um tipo numérico com unário +.
Peter Cordes


18

Linguagem de script da operação Flashpoint , 33 bytes

f={call format(["%1==%2"]+_this)}

Ligue para:

hint format["%1\n%2\n%3\n%4\n%5",
    ["0001", "1    "] call f,
    ["1450", "1450 "] call f,
    ["0010001 ", " 10001  "] call f,
    ["0010000", "  10  "] call f,
    ["101023", "101024"] call f]

Saída:

Versão alternativa (41 bytes):

f={{t=call _x;r=t==s;s=t}forEach _this;r}

Ainda 5 bytes mais curto que o mais simples f={t=_this;call(t select 0)==call(t select 1)}

39 bytes:

f={{t=call _x;r=t==s;s=t}count _this;r}

count(que retorna o tamanho de uma matriz) funciona em vez de forEach, porque você pode atribuir um "lambda" usado como condição para contar apenas os elementos da matriz que atendem a essa condição. A "condição" usada neste caso não é uma condição válida, mas não importa aqui porque não causa um erro e o valor de retorno do countnão é necessário.


7
Eu gosto da variedade de situações em que você captura capturas de tela do seu código.
Οurous

11

Táxi , 488 bytes

Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to The Babelfishery.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:s 1 l 1 r.Pickup a passenger going to Equal's Corner.Pickup a passenger going to Equal's Corner.Go to Equal's Corner:n 1 l 1 l 1 l.Switch to plan "b" if no one is waiting.'1' is waiting at Writer's Depot.[b]'0' is waiting at Writer's Depot.Go to Writer's Depot:n 1 l 1 r.Pickup a passenger going to Post Office.Go to Post Office:n 1 r 2 r 1 l.

Experimente online!

Ungolfed:

Go to Post Office: west 1st left 1st right 1st left.
Pickup a passenger going to The Babelfishery.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: south 1st left 1st right.
Pickup a passenger going to Equal's Corner.
Pickup a passenger going to Equal's Corner.
Go to Equal's Corner: north 1st left 1st left 1st left.
Switch to plan "b" if no one is waiting.
'1' is waiting at Writer's Depot.
[b]
'0' is waiting at Writer's Depot.
Go to Writer's Depot: north 1st left 1st right.
Pickup a passenger going to Post Office.
Go to Post Office: north 1st right 2nd right 1st left.

O táxi é (relativamente) adequado para esse desafio, porque as strings são o único tipo de entrada ou saída permitido. The Babelfisheryé o que converte seqüências de caracteres em número (e vice-versa) e lida com a remoção de todos os espaços e zeros à esquerda. Ele também manipulará números negativos se o -for imediatamente antes do primeiro dígito. Depois disso, Equal's Cornerverifica os dois valores entre si e Writer's Depotfornece a saída no formato de sequência. A saída é 1para verdade e 0para falsey.


1
Agradável! Por curiosidade, por que a janela de depuração está mostrando a mensagem error: The boss couldn't find your taxi in the garage. You're fired!?
Charlie

6
O @Charlie Taxi exige que você volte para a garagem de táxis quando terminar sua rota. Se você não devolver o carro, será demitido. (Você também precisa parar e reabastecer de vez em quando ou fica sem combustível.) Nas perguntas sobre código de golfe que não proíbem a saída para STDERR, geralmente não me preocupo em ser demitido. Você pode adicionar isso para se livrar do erro se não quiser perder o emprego:Go to Taxi Garage:n 1 r 1 l 1 r.
Engineer Toast

Esta resposta e seus comentários são totalmente surrealistas. Eu amo essa comunidade.
Perna Direita

@RightLeg Meu programa de táxi favorito que eu escrevi levou duas semanas e muita depuração. Você quer mesmo uma viagem? Confira Shakespeare .
Engenheiro Toast

10

C (gcc) , 27 bytes

f(s,t){s=atoi(s)==atoi(t);}

Com -O0(que é a configuração padrão).

Experimente online!

C, 32 bytes

f(s,t){return atoi(s)==atoi(t);}

Experimente online!


2
@Charlie Em C, strings são matrizes de char, e quando você passa uma matriz para uma função, na verdade você passa o ponteiro para o primeiro elemento da matriz. Aqui, os ponteiros para as charmatrizes são implicitamente convertidos em números inteiros quando passados ​​para a função, e os números inteiros são convertidos novamente em ponteiros ao chamar atoi.
Steadybox

1
o que poderia explodir terrivelmente em uma plataforma onde os ponteiros são mais largas do que ints ... apenas dizendo, é claro que é bom para os padrões site aqui :)
Felix Palmen

2
Se você quiser usar porcarias ridículas como, em s=foo;vez de return foo;precisar rotular isso como "x86 gcc com otimização desativada", não apenas "C", porque esse código não retorna um valor, exceto como um artefato de implementação.
Peter Cordes

2
Procurei ver se havia alguma arquitetura em s=retval;vez de return retval;realmente quebrar. Parece que a lógica interna do gcc (com -O0apenas) trata a última expressão como o valor de retorno, talvez da mesma maneira que uma expressão de instrução GNU C funciona. (Mas requer s=). No ARM32, calcula o ==resultado em r3e, em seguida, usa um extra mov r0, r3para tornar esse o valor de retorno! Portanto, não é um hack específico para x86, é um gcc -O0hack que o gcc parece se esforçar para oferecer suporte.
Peter Cordes

2
@ KenY-N Você está perdendo todo o ponto do código c de golfe. Trata-se de encontrar casos específicos de hacky edge onde você pode inserir a quantidade mínima de código e obter os resultados desejados, sem fornecer uma experiência portátil.

8

J , 4 bytes

=&do

Compare =depois de &avaliar do. Também pode ser =&". Experimente online!


Curiosamente, isso funcionará tanto para os negativos quanto as outras línguas os entendem (por exemplo -10) e negativos como J os entende (por exemplo _10) devido à maneira como a monádica -funciona.
cole

6

Retina , 11 bytes

.+
$*
D`
¶$

Experimente online!

A entrada é separada por avanço de linha, mas o conjunto de testes usa separação por vírgula por conveniência. Imprime 1pela igualdade e 0pela desigualdade.

Explicação

.+
$*

Converta cada linha em unário. Isso ignora zeros e espaços à esquerda.

D`

Desduplicar: limpe a segunda linha se ambas forem iguais.

¶$

Verifique se a sequência agora termina em um avanço de linha.




3

Triangularidade , 17 bytes

..)..
.Ii).
@Ii=.

Experimente online!

A triangularidade é, pela primeira vez, competitiva!

Como funciona

A triangularidade exige que o código tenha uma distribuição triangular dos pontos. Ou seja, o comprimento de cada linha deve ser igual ao número de linhas multiplicado por 2 e decrementado, e cada linha deve ter (em cada lado) um número de pontos igual à sua posição no programa (a linha inferior é a linha 0, o acima é a linha 1 e assim por diante). Tendo isso em mente, vamos analisar como o código funciona:

..).. || Push a 0 onto the stack.
.Ii   || Get the 0th input and cast it to an integer.
   ). || Push another 0 onto the stack.
@I    || Increment the ToS => 1. Get the first input.
  i=. || Then cast it to an integer and compare their equality.

3

Alice , 7 bytes

X/n
o@i

Experimente online!

Qualquer separador sem dígito funciona. Imprime 1para igualdade ou 0não.

Explicação

X   XOR, does nothing.
/   Switch to Ordinal mode.
i   Read all input as a string.
/   Switch to Cardinal mode.
X   XOR. Implicitly finds all integers in the string and pushes them separately
    onto the stack. The XOR gives 0 if the values are identical.
n   Logical NOT. Gives 1 for equal inputs and 9 otherwise.
/   Switch to Ordinal.
o   Print the 0 or 1 as a string.
/   Switch to Cardinal.
@   Terminate the program.

3

Japonês , 3 bytes

¥Vn

Tente

Converte a segunda entrada em um número inteiro e compara a igualdade com a primeira.



3

jq, 24 caracteres

map(tonumber)|.[0]==.[1]

As 2 strings são passadas como itens de uma matriz.

Exemplo de execução:

bash-4.4$ jq 'map(tonumber)|.[0]==.[1]' <<< '["0010001 ", " 10001  "]'
true

bash-4.4$ jq 'map(tonumber)|.[0]==.[1]' <<< '["0010000", "  10  "]'
false

Experimente online! ( Todos os casos de teste )



3

PowerShell , 20 bytes

param($a,$b)+$a-eq$b

Semelhante à resposta JavaScript, apenas mais porque o PowerShell não tem currying. Usa +para converter a primeira string em número inteiro e, em seguida, os -equals convertem automaticamente a segunda string em número inteiro. A saída é verdadeira / falsa.

Experimente online!


3

PowerShell , 19 bytes

$args-join'-eq'|iex

Experimente online!

-joino array de argumentos ( $args) com a representação de string do operador de comparação ( -eq) e avalie a expressão com Invoke-Expression( iex).


Interessante. Gostaria de saber como você +passa sem a necessidade de converter para inteiro, enquanto o meu quebra se eu remover o, uma vez que está fazendo verificação de igualdade de string.
AdmBorkBork 12/01

@AdmBorkBork porque estou basicamente gerando o código do PowerShell e depois executando-o, e como os zeros à esquerda e os espaços à esquerda / à direita não importam para o intérprete, ele "simplesmente funciona". Se os 2 números forem 00009 e 077 o código resultante for 00009 -eq077 , um trecho de código perfeitamente válido. Você está lidando diretamente com a string no tempo de execução, portanto, deve convertê-la primeiro para que a operação seja feita numérica.
Briantist

Certo, sim, isso faz sentido. Obrigada pelo esclarecimento.
AdmBorkBork

3

Q (Kdb +), 13 bytes

=/["J"$(x;y)]

Explicação

(x; y): uma lista das duas entradas.

"J" $: convertendo cada entrada para um tipo longo (7j) da string (10c), que pode interpretar corretamente
o espaço em branco e os 0s iniciais.

= /: verifica a igualdade sobre os elementos em uma lista (cada par subsequente).
Como existe apenas um par, retorna um único booliano 0b / 1b.


Bem-vindo ao PPCG! Geralmente, um link para um intérprete / compilador on-line é apreciado e, se não óbvio, também uma explicação.
FantaC

Obrigado! Explicação adicionada lá. Duvido que exista um intérprete on-line para q, fiz uma rápida olhada e não consegui encontrar um.
Sidney

Eu diria que isso deve ser escrito como um lambda, incluindo chaves, ou seja, {=/["J"$(x;y)]}para 15 bytes ... Embora para 8 bytes você possa ter isso: (~/)"J"$se você estiver apenas usando o REPL e passando as entradas como uma lista de strings .. . ou {(~/)"J"$x}para 11 como uma função.
Streetster

3

T-SQL, 35 bytes

De acordo com nossos padrões , os dados são inseridos por meio de tabela preexistente tcom varcharcampos ae b.

    SELECT IIF(ABS(a)=ABS(b),1,0)FROM t

Retorna 1se eles corresponderem,0 se não corresponderem.

Algumas funções matemáticas do SQL (incluindo ABS, FLOORe CEILING) farão uma conversão implícita em numérico se forem fornecidos parâmetros de string, isso é mais curto que um explícitoCAST(a AS INT) ou CONVERT(INT,b)e funciona nesse caso, pois sabemos que os valores de entrada são sempre positivos.

IIF é específico para o MS SQL 2012 e superior, portanto, não há garantia sobre outras implementações.


3

Excel VBA, 27 16 bytes

-9 Obrigado a @Nayrb e @TaylorScott

[C1]=[A1]-[B1]=0

Onde você insere os valores nas células com 'string .

Onde xe ysão as seqüências de entrada e zé uma saída booleana.

Se CInt (x) = CInt (y) Então z = 1

Usando CInt


1
Por que não: z = xy = 0?
Nayrb

Infelizmente, esta solução é inválido, pois não leva entrada e, em vez depende de ter valores predefinidos ( que foi considerado contra as regras da comunidade ) e outputing a uma variável ( que também é contra as regras da comunidade )
Taylor Scott

Quanto a uma solução válida, talvez, uma função janela imediata vbe, como ?[Int(A1)=Int(B1)]que leva a entrada dos intervalos A1e B1e saídas para a janela imediata o VBE
Taylor Scott




2

Gema , 21 caracteres

*\n*=@cmpn{*;*;0;1;0}

Não é booleano no Gema. Enquanto o@get-switch{} /@set-switch{} funções usam 0 e 1 para representar os status da chave, também são usados ​​0 e 1.

As 2 strings são passadas em linhas de entrada separadas.

Exemplo de execução:

bash-4.4$ gema '*\n*=@cmpn{*;*;0;1;0}' <<< $'0010001\n10001  '
1

bash-4.4$ gema '*\n*=@cmpn{*;*;0;1;0}' <<< $'0010000\n  10  '
0



2

Anexo , 11 bytes

Same@Map&:N

Experimente online!

Isso requer uma matriz de seqüências de caracteres, como V["0001", "1 "]. Em termos simples, Map&:Né uma função que mapeia Nseu argumento e Sameverifica se a matriz contém apenas membros iguais. (Curiosidade: essa função funciona para mais de 2 argumentos de string).


2

SNOBOL4 (CSNOBOL4) , 42 bytes

	OUTPUT =EQ(EVAL(INPUT),EVAL(INPUT)) 1
END

Experimente online!

Saídas 1 para verdade, nada para falsey. Como (space) é o operador de concatenação no SNOBOL, EVALum número com espaços à esquerda / à direita gera o próprio número e também cuida de todos os zeros à esquerda. EQtesta a igualdade numérica, configurando condicionalmente OUTPUTcomo 1 ativado Success.


2

Sinclair ZX81 / Timex TS1000 / 1500 BASIC, ~ 29 bytes BASIC tokenizados

Nova solução graças a Neil (obrigado pela dica).

 1 INPUT A$
 2 INPUT B$
 3 PRINT VAL A$=VAL B$

Essa solução requer entrada do usuário; portanto, insira duas strings com espaços em branco e / ou zeros à esquerda, ou insira duas strings de valor numérico não igual; 0é falso e1 verdadeiro quando a linha três compara o valor de cada sequência inserida.

Solução antiga: Sinclair ZX81 / Timex TS1000 / 1500 BASIC, ~ 46 bytes BASIC tokenizados

 1 LET A$=" 001 "
 2 LET B$="1"
 3 PRINT (VAL A$=VAL B$)

A verificação real é feita na linha três, que tem apenas ~ 16 bytes BASIC tokenizados; portanto, inserir cada par de casos de teste usando o modo direto economizará ~ 30 bytes da listagem. Observe que essa contagem de bytes não inclui o var stack.


1
Você não deveria usar INPUT A$e INPUT B$? Também não acho que você precise dos ().
Neil

Sim, eu poderia usar isso também - eu só queria uma prova de conceito
Shaun Bebbers

2

APL (NARS2000) , 7 bytes

=⍥⍎

Bem, sim, eu sei que o NARS2000 não pode competir com o Dyalog aqui, pois usa Unicode, mas achei que preferia me exibir (chamado Composition no NARS2000, mesmo que não esteja relacionado à composição da função), algo que o Dyalog não faz. tem como um built-in e eu nunca vi usado aqui. No Dyalog, ele deve ser implementado como{(⍵⍵⍺)⍺⍺⍵⍵ ⍵} . O que ele faz é chamar a função monádica do operando da direita no argumento esquerdo e direito e, em seguida, chamar a função diádica do operando da esquerda nos resultados.

Aqui, o operando direito é ( Executar , ou seja, eval) e o operando esquerdo é =( Igual a , ou seja, verifique se seus argumentos são iguais).


A composição e a execução devem renderizar como espaço em branco?
John Dvorak

@JohnDvorak hum, não? Eles não são espaços em branco, o segundo caractere é U + 2365 APL SÍMBOLO FUNCIONAL DIATERÉSICO DO CÍRCULO e o terceiro é U + 234E APL SÍMBOLO FUNCIONAL SÍMBOLO PARA BAIXO.
Erik the Outgolfer

@JohnDvorak Qualquer fonte que você esteja visualizando pode não ter símbolos para esses pontos de código.
Οurous

@ Ousurous Eu suspeito que esse também seja o caso, mas se você estiver usando um software bem atualizado, não deverá ter nenhum problema para visualizar esses caracteres.
Erik the Outgolfer
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.