Comparez deux nombres donnés sous forme de chaînes


21

J'ai un problème au travail. J'ai besoin de comparer deux nombres provenant de chaînes de deux bases de données différentes. Les nombres peuvent être accompagnés de zéros de tête et / ou d'espaces de début / fin. Je peux donc avoir "0001 "d'une base de données et " 1 "de l'autre.

J'ai résolu le problème en C # avec le code suivant:

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

Le défi

Il s'agit d'un défi très simple, adapté aux débutants et à tout type de langues ésotériques. Étant donné deux nombres sous forme de chaînes pouvant être accompagnés de zéros de début et / ou d'espaces de début / de fin, écrivez le code le plus court qui vérifie si les deux chaînes représentent le même nombre.

  • Les entrées doivent être deux chaînes ou l'équivalent dans votre langue (un tableau de caractères est OK), et elles représenteront toujours des valeurs entières supérieures à zéro.
  • La sortie doit être deux valeurs cohérentes quelconques qui représentent une valeur véridique et une valeur de falsey.

Exemples

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

Il s'agit de , de sorte que le code le plus court pour chaque langue gagne!



8
Au moins, elle n'est pas inspirée par vos enfants cette fois ...
caird coinheringaahing

2
@cairdcoinheringaahing mon propre travail est ma deuxième source d'inspiration. Je sais que c'est un défi très simple, mais je pense que ces défis faciles sont parfois nécessaires. J'essaierai de trouver quelque chose de plus difficile la prochaine fois.
Charlie

Soit dit en passant, il semble que mes défis inspirés par le travail soient trop faciles ou trop difficiles ...
Charlie

@JonathanAllan non, chaque chaîne d'entrée ne représentera qu'un seul nombre. Il n'y aura pas d'espace entre les chaînes.
Charlie

Réponses:


22

Javascript , 11 octets

a=>b=>+a==b

Abuser un peu des règles de casting de Javascript; +acontraint aen un type numérique.

-6 octets grâce à Shaggy et Martin Ender ♦

Aussi une prise cool de LiefdeWen :

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

2
Bienvenue chez PPCG. Vous pouvez le faire en 11 octets en utilisant le curry et en convertissant uniquement l'une des entrées en un entier: tio.run/##y0osSyxOLsosKNHNy09J/… Notez également que, à moins qu'une fonction ne se référence elle-même, vous n'avez pas besoin d'inclure la variable affectation dans votre nombre d'octets.
Shaggy

2
Bienvenue chez PPCG! Les fonctions sans nom sont très bien, donc vous n'avez pas besoin c=, et le curry est également très bien, vous pouvez donc les utiliser à la a=>b=>...place de (a,b)=>. Enfin, mon JavaScript est un peu rouillé, mais je pense que quelque chose comme ça !(a-b)fonctionnerait aussi?
Martin Ender

1
Consultez les conseils pour jouer au golf dans ES6 (et les conseils généraux de golf JS ) pour plus d'astuces pour extraire des octets de vos solutions.
Shaggy

1
Le versiopn cool est cool mais de portée limitée, essayez les entrées '9123456789' et '533522197'. Ce sont des représentations de chaînes de valeurs entières, bien à l'intérieur de la plage valide d'entiers en javascript (mais plus de 32 bits)
edc65

1
Votre texte ne correspond plus au code; il n'y a pas de soustraction. Vous contraignez aà un type numérique avec unaire +.
Peter Cordes


18

Langage de script Operation Flashpoint , 33 octets

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

Appeler avec:

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]

Sortie:

Version alternative (41 octets):

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

Encore 5 octets de moins que le plus simple f={t=_this;call(t select 0)==call(t select 1)}

39 octets:

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

count(qui renvoie la taille d'un tableau) fonctionne à la place de forEach, car vous pouvez lui donner un "lambda" qui est utilisé comme condition pour ne compter que les éléments du tableau qui remplissent cette condition. La "condition" utilisée dans ce cas n'est pas une condition valide, mais elle n'a pas d'importance ici car elle ne provoque pas d'erreur et la valeur de retour de la countn'est pas nécessaire.


7
J'aime la variété des situations dans
lesquelles

11

Taxi , 488 octets

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.

Essayez-le en ligne!

Non golfé:

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.

Taxi est (relativement) bien adapté à ce défi car les chaînes sont le seul type d'entrée ou de sortie autorisé. The Babelfisheryest ce qui convertit les chaînes en nombre (et vice versa) et gère la suppression de tous les espaces et des zéros non significatifs. Il gérera également les nombres négatifs si le -est immédiatement avant le premier chiffre. Après cela, Equal's Cornervérifie les deux valeurs l'une par rapport à l'autre et Writer's Depotfournit la sortie au format chaîne. La sortie est 1pour truey et 0pour falsey.


1
Joli! Par curiosité, pourquoi la fenêtre de débogage affiche-t-elle le message error: The boss couldn't find your taxi in the garage. You're fired!?
Charlie

6
@Charlie Taxi vous oblige à retourner au garage de taxi lorsque vous avez terminé votre itinéraire. Si vous ne ramenez pas la voiture, vous êtes viré. (Vous devez également vous assurer d'arrêter et de faire le plein de temps en temps ou si vous manquez d'essence.) Dans les questions de code-golf qui n'interdisent pas la sortie vers STDERR, je ne m'inquiète généralement pas de me faire virer. Vous pouvez ajouter ceci pour vous débarrasser de l'erreur si vous ne voulez pas perdre votre emploi:Go to Taxi Garage:n 1 r 1 l 1 r.
Engineer Toast

Cette réponse et ses commentaires sont totalement surréalistes. J'adore cette communauté.
Jambe droite

@RightLeg Mon programme de taxi préféré que j'ai écrit m'a pris deux semaines et beaucoup de débogage. Mais tu veux vraiment un voyage? Découvrez Shakespeare .
Engineer Toast

10

C (gcc) , 27 octets

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

Avec -O0(qui est le paramètre par défaut).

Essayez-le en ligne!

C, 32 octets

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

Essayez-le en ligne!


2
@Charlie En C, les chaînes sont des tableaux de char, et lorsque vous passez un tableau à une fonction, vous passez simplement le pointeur au premier élément du tableau. Ici, les pointeurs vers les chartableaux sont implicitement convertis en entiers lorsqu'ils sont passés à la fonction, et les entiers sont reconvertis en pointeurs lors de l'appel atoi.
Steadybox

1
qui pourrait exploser horriblement sur une plate-forme où les pointeurs sont plus larges que les entiers ... juste pour dire, bien sûr, c'est bien pour les normes du site ici :)
Felix Palmen

2
Si vous voulez utiliser de la merde ridicule comme s=foo;au lieu de return foo;vous devez l'étiqueter comme "x86 gcc avec optimisation désactivée", pas seulement "C", car ce code ne renvoie pas de valeur sauf comme un artefact d'implémentation.
Peter Cordes

2
Je suis allé chercher s'il y avait des architectures où s=retval;au lieu de return retval;se briser. Il semble que la logique interne de gcc (avec -O0seulement) traite réellement la dernière expression comme la valeur de retour, peut-être de la même manière qu'une expression-instruction GNU C fonctionne. (Mais cela nécessite s=). Sur ARM32, il calcule le ==résultat dans r3, puis utilise un supplément mov r0, r3pour en faire la valeur de retour! Ce n'est donc pas un hack spécifique à x86, c'est un gcc -O0hack que gcc semble se mettre en quatre.
Peter Cordes

2
@ KenY-N Vous manquez tout le point de golf de code c. Il s'agit de trouver ces cas de bord hacky spécifiques où vous pouvez entrer la quantité minimale de code et obtenir les résultats que vous souhaitez, sans fournir une expérience portable.

8

J , 4 octets

=&do

Comparez =après &évaluation do. Peut également être =&". Essayez-le en ligne!


Il est intéressant de noter que cela fonctionnera à la fois pour les négatifs que d'autres langues les comprennent (par exemple -10) et les négatifs comme J les comprend (par exemple _10) en raison de la façon dont -fonctionne le monadisme .
cole

6

Rétine , 11 octets

.+
$*
D`
¶$

Essayez-le en ligne!

L'entrée est séparée par saut de ligne, mais la suite de tests utilise la séparation par virgule pour plus de commodité. Imprime 1pour l'égalité et 0pour l'inégalité.

Explication

.+
$*

Convertissez chaque ligne en unaire. Cela ignore les zéros et les espaces en tête.

D`

Dédupliquer: effacer la deuxième ligne si les deux sont identiques.

¶$

Vérifiez que la chaîne se termine maintenant par un saut de ligne.




3

Triangularité , 17 octets

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

Essayez-le en ligne!

La triangulation est, pour une fois, compétitive!

Comment ça marche

La triangularité nécessite que le code ait une distribution triangulaire des points. Autrement dit, la longueur de chaque ligne doit être égale au nombre de lignes multiplié par 2 et décrémenté, et chaque ligne doit avoir (de chaque côté) un nombre de points égal à sa position dans le programme (la ligne du bas est la ligne 0, celui au-dessus est la ligne 1 et ainsi de suite). Gardant cela à l'esprit, analysons le fonctionnement du code:

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

X/n
o@i

Essayez-le en ligne!

Tout séparateur non numérique fonctionne. Imprime 1pour l'égalité et 0autrement.

Explication

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

jq, 24 caractères

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

Les 2 chaînes sont passées en tant qu'éléments d'un tableau.

Exemple d'exécution:

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

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

Essayez-le en ligne! ( Tous les cas de test )



3

PowerShell , 20 octets

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

Semblable à la réponse JavaScript, juste plus longtemps car PowerShell n'a pas de curry. Utilise +pour convertir la première chaîne en entier, puis l' -equals convertit automatiquement la deuxième chaîne en entier. La sortie est True / False.

Essayez-le en ligne!


3

PowerShell , 19 octets

$args-join'-eq'|iex

Essayez-le en ligne!

-joinl'argument array ( $args) avec la représentation sous forme de chaîne de l'opérateur de comparaison ( -eq) puis évaluer l'expression avec Invoke-Expression( iex).


Intéressant. Je me demande comment vous vous en sortez sans avoir besoin de convertir en entier, alors que le mien se brise si je supprime le +car il vérifie l'égalité des chaînes.
AdmBorkBork du

@AdmBorkBork parce que je génère essentiellement du code PowerShell et que je l'exécute, et comme les zéros de tête et les espaces de tête / de queue n'ont pas d'importance pour l'interpréteur, cela "fonctionne juste". Si les 2 nombres sont 00009 et 077 le code résultant est 00009 -eq077 , un morceau de code parfaitement valide. Vous traitez directement avec la chaîne au moment de l'exécution, vous devez donc la convertir en premier afin que l'opération se fasse sur un numérique.
briantist

Oui, c'est logique. Merci pour l'explication.
AdmBorkBork du

3

Q (Kdb +), 13 octets

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

Explication

(x; y): une liste des deux entrées.

"J" $: conversion de chaque entrée en un type long (7j) à partir de la chaîne (10c), qui peut interpréter correctement
les espaces blancs et les 0 en tête.

= /: vérifie l'égalité sur les éléments d'une liste (chaque paire suivante).
Comme il n'y a qu'une seule paire, retourne un booléen unique 0b / 1b.


Bienvenue chez PPCG! Habituellement, un lien vers un interprète / compilateur en ligne est apprécié, et sinon évident, une explication également.
FantaC

Merci! Explication ajoutée ici. Je doute qu'il y ait un interprète en ligne pour q, j'ai fait un rapide coup d'œil et je n'ai pas pu en trouver un.
Sidney

Je dirais que cela devrait être écrit comme un lambda, y compris les accolades, c'est- {=/["J"$(x;y)]}à- dire pour 15 octets ... Bien que pour 8 octets, vous pourriez avoir ceci: (~/)"J"$si vous utilisez simplement le REPL et passez les entrées comme une liste de chaînes .. ou {(~/)"J"$x}pour 11 en fonction.
streetster

3

T-SQL, 35 octets

Selon nos normes , les données sont entrées via une table préexistante tavec des varcharchamps aet b.

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

Renvoie 1s'ils correspondent, 0sinon.

Quelques-unes des fonctions mathématiques de SQL (y compris ABS, FLOORet CEILING) effectueront une conversion implicite en numérique si des paramètres de chaîne donnés sont plus courts qu'un explicite CAST(a AS INT)ou CONVERT(INT,b), et fonctionnent dans ce cas car nous savons que les valeurs d'entrée sont toujours positives.

IIF est spécifique à MS SQL 2012 et supérieur, donc aucune garantie sur les autres implémentations.


3

Excel VBA, 27 16 octets

-9 Merci à @Nayrb et @TaylorScott

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

Où vous entrez les valeurs sur les cellules avec 'string.

xet ysont les chaînes d'entrée et zest une sortie booléenne.

Si CInt (x) = CInt (y) Alors z = 1

Utilisation de CInt


1
Pourquoi pas: z = xy = 0?
Nayrb

Malheureusement, cette solution n'est pas valide car elle ne prend pas d'entrée et repose plutôt sur le fait d'avoir des valeurs prédéfinies ( qui ont été jugées contraires aux règles de la communauté ) et de sortir vers une variable ( qui est également contraire aux règles de la communauté )
Taylor Scott

Quant à une solution valide, peut-être une fonction de fenêtre immédiate vbe telle que ?[Int(A1)=Int(B1)]celle qui prend les entrées des plages A1et B1et les sorties vers la fenêtre immédiate VBE
Taylor Scott




2

Gema , 21 personnages

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

Pas de booléen à Gema. Comme les fonctions @get-switch{}/ @set-switch{}utilisent 0 et 1 pour représenter les états des commutateurs, également utilisées 0 et 1.

Les 2 chaînes sont passées sur des lignes d'entrée distinctes.

Exemple d'exécution:

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

Attaché , 11 octets

Same@Map&:N

Essayez-le en ligne!

Cela prend un tableau de chaînes, comme V["0001", "1 "]. En termes simples, Map&:Nest une fonction qui mappe Nson argument et Samevérifie que le tableau ne contient que des membres égaux. (Fait amusant: cette fonction fonctionne pour plus de 2 arguments de chaîne.)


2

SNOBOL4 (CSNOBOL4) , 42 octets

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

Essayez-le en ligne!

Sorties 1 pour véridique, rien pour falsey. Puisque (espace) est l'opérateur de concaténation dans SNOBOL, EVALing un nombre avec des espaces de début / fin donne le nombre lui-même, et il prend également soin de tous les zéros de tête. EQtests d'égalité numérique, conditionnellement OUTPUTà 1 activé Success.


2

Sinclair ZX81 / Timex TS1000 / 1500 BASIC, ~ 29 octets BASIC à jeton

Nouvelle solution grâce à Neil (merci pour l'astuce).

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

Cette solution nécessite une entrée utilisateur, donc entrez deux chaînes avec des espaces blancs et / ou des zéros non significatifs, ou entrez deux chaînes de valeur numérique non égale; 0est faux et 1vrai une fois que la ligne trois a comparé la valeur de chaque chaîne entrée.

Ancienne solution: Sinclair ZX81 / Timex TS1000 / 1500 BASIC, ~ 46 octets BASIC tokenisés

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

La vérification proprement dite est effectuée sur la troisième ligne, qui ne représente que ~ 16 octets BASIC à jeton; donc la saisie de chaque paire de cas de test en mode direct permettra d'économiser environ 30 octets de la liste. Notez que ce nombre d'octets n'inclut pas le var stack.


1
Ne devriez-vous pas utiliser INPUT A$et INPUT B$? De plus, je ne pense pas que vous ayez besoin du par ().
Neil

Oui, je pourrais aussi l'utiliser - je voulais juste une preuve de concept
Shaun Bebbers

2

APL (NARS2000) , 7 octets

=⍥⍎

Eh bien, oui, je sais que NARS2000 ne peut pas rivaliser avec Dyalog ici car il utilise Unicode, mais je pensais que je préfèrerais me montrer (appelé Composition dans NARS2000, même si cela n'est en fait pas lié à la composition des fonctions), ce que Dyalog ne fait pas avoir comme intégré et je n'ai jamais vu utilisé ici. Dans Dyalog, il doit être mis en œuvre comme{(⍵⍵⍺)⍺⍺⍵⍵ ⍵} . Ce qu'il fait, c'est appeler la fonction monadique de l'opérande droit sur les arguments gauche et droit, puis appeler la fonction dyadique de l'opérande gauche sur les résultats.

Ici, l'opérande de droite est ( Execute , ie eval) et l'opérande de gauche est =( Equal To , c'est-à-dire vérifier si ses arguments sont égaux).


La composition et l'exécution sont-elles censées être rendues en espace blanc?
John Dvorak

@JohnDvorak euh, non? Ce ne sont pas des espaces, le deuxième caractère est U + 2365 APL FONCTIONAL SYMBOL CIRCLE DIAERESIS et le troisième est U + 234E APL FUNCTIONAL SYMBOL DOWN TACK JOT.
Erik the Outgolfer le

@JohnDvorak Quelle que soit la police dans laquelle vous affichez ceci, il se peut qu'il n'y ait pas de symboles pour ces points de code.
Οurous

@ Οurous Je soupçonne fortement que c'est le cas également, mais si vous utilisez un logiciel bien mis à jour, vous ne devriez pas avoir de problème pour afficher ces caractères.
Erik the Outgolfer
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.