Ces identifiants sont-ils équivalents?


20

Dans la langue Nim , les règles de différenciation des identifiants sont légèrement plus souples que la plupart des autres langues. Deux identifiants sont équivalents ou adressent la même variable s'ils suivent ces règles :

  • le premier caractère des deux est le même (sensible à la casse)
  • les deux chaînes sont les mêmes (cas dans sensible) après le retrait de toutes les instances des caractères- et_

Défi

Écrivez un programme / fonction qui prend deux chaînes qui représentent des identifiants Nim et génère une valeur true ou falsey selon qu'elles sont ou non équivalentes selon les règles ci-dessus.

Caractéristiques

  • Les règles d'E / S standard s'appliquent .
  • Les failles standard sont interdites .
  • Les chaînes ne contiendront que des imprimables ASCII . Vous n'avez pas besoin de vérifier s'il s'agit d'un identifiant valide.
  • Les chaînes peuvent être considérées comme deux entrées distinctes, une liste de chaînes, etc. (vous connaissez l'exercice)
  • Les chaînes vides n'ont pas besoin d' être gérées.
  • La sortie doit être cohérente pour les valeurs true et falsey.
  • Ce défi ne consiste pas à trouver l'approche la plus courte dans toutes les langues, mais plutôt à trouver l' approche la plus courte dans chaque langue .
  • Votre code sera noté en octets , généralement dans le codage UTF-8, sauf indication contraire.
  • Les fonctions intégrées qui effectuent cette tâche sont autorisées, mais il est recommandé d' inclure une solution qui ne repose pas sur une fonction intégrée.
  • Des explications, même pour les langues "pratiques", sont encouragées .

Cas de test

Input                                    Output

count, Count                             falsey
lookMaNoSeparator, answer                falsey
_test, test                              falsey
test, tset                               falsey
aVariableName, a_variable_name           truthy
numbers_are_cool123, numbersAreCool123   truthy
symbolsAre_too>_>, symbols_areTOO>>      truthy

Implémentation de référence non golfée

Ceci est écrit en Nim lui-même.

import strutils, re

proc sameIdentifier(a, b: string): bool =
  a[0] == b[0] and
    a.replace(re"_|–", "").toLower == b.replace(re"_|–", "").toLower

3
Je suggère un cas de test de f("_test", "test").
Poignée de porte

@ Doorknob Added.
2017 totalement humain

1
Je suggère d'ajouter f("test", "tset"), car je pense qu'une réponse donne un résultat inattendu.
Ørjan Johansen

@ ØrjanJohansen Terminé.
2017 totalement humain

Attendez, donc l'entrée est des chaînes qui "représentent des identifiants Nim", et nous "n'avons pas besoin de vérifier si c'est un identifiant valide", mais alors l'un des exemples contient >?
aschepler

Réponses:


7

JavaScript (ES6), 62 61 octets

1 octet enregistré grâce à @JohanKarlsson

Prend une entrée dans la syntaxe de curry (a)(b). Renvoie un booléen.

a=>b=>(r=s=>s[0]+s.replace(/-|_/g,'').toUpperCase())(b)==r(a)

Cas de test


1
/-|_/genregistre un octet
Johan Karlsson


4

En fait , 15 octets

⌠p"-_"(-Σùo⌡M═Y

Essayez-le en ligne!

Fait amusant: cela fonctionne avec n'importe quel nombre d'entrées (il retourne toujours vrai pour moins de 2 entrées).

Explication:

⌠p"-_"(-Σùo⌡M═Y
⌠p"-_"(-Σùo⌡M    for each input:
 p                 separate the first character
  "-_"(-           remove all dashes and underscores from the rest of the string
        Σù         concatenate the list from the last operation and lowercase the string
          o        append it to the first character
             ═Y  are none of the elements unique?

3

Pyth , 13 octets

qFm[hd-r0d"-_

Essayez-le en ligne!

Explication

qFm[hd-r0d"-_
  m              For each value in the input (which is a list of two strings):
   [             Create a list consisting of
    hd               the first character of each value
      -r0d"-_        and the lowercase version of the value without "-" or "_"
qF               Fold over equivalence; checks to see if both lists are the same

3

05AB1E , 12 octets

εćs„-_SKl«}Ë

Essayez-le en ligne!

-1 merci à Adnan .

Théoriquement, εćs„-_-«}Ëaurait dû fonctionner pendant 10 octets, mais malheureusement ce comportement est déconseillé pour l'instant.


Oh ouais lol, j'ai encore besoin de réparer ça. Vous pouvez enregistrer un octet en utilisant „-_SKau lieu de '-K'_K.
Adnan

@Adnan Et je savais qu'il y avait un moyen. Merci!
Erik the Outgolfer le

11 octets si vous passez SKà м.
Kevin Cruijssen

@KevinCruijssen Hm, je mettrai à jour cette réponse. Je ne pense pas qu'il мexistait à l'époque. : P
Erik the Outgolfer

3

Gelée , 11 octets

ḟ⁾-_Œl,Ḣµ€E

Essayez-le en ligne!

-2 octets grâce à Erik the Outgolfer
-1 octet merci à Jonathan Allan


Prenez une liste de deux chaînes comme ["symbolsAre_too>_>", "symbols_areTOO>>"]et utilisez Ḣ;ḟ⁾-_Œl$µ€Eplutôt -2. Battez ce Pyth!
Erik the Outgolfer le

... ou même juste ḟ⁾-_Œl,Ḣµ€Epour 11 octets.
Jonathan Allan

Pas de problème, peut-être crédit Erik pour 2 et moi pour 1 :)
Jonathan Allan

@JonathanAllan Ah. Bonne idée; Je vais le faire :)
HyperNeutrino

3

Rubis , 86 64 63 61 51 octets

f=->x{x[0]+x.upcase.delete("-_")}
->x,y{f[x]==f[y]}

Essayez-le en ligne!

Cela semble vraiment long, semble encore un peu long. J'apprécierais l'aide de tous les gourous de Ruby pour rendre cela au moins un peu plus court.


Pas un gourou, mais je me suis inspiré de consulter la liste des méthodes String . .delete("_-")est plus court.
Ørjan Johansen

f[x]est toujours une substitution valable f.call(x)lorsque des lambdas stabby sont impliqués.
Value Ink

@ValueInk Merci! J'ai essayé de comprendre comment jouer au golf à Ruby en fonction des réponses de Stack Overflow, donc je ne savais pas que c'était une option.
Wheat Wizard

3

C ++, 288 248 octets

-5 octets grâce à Zacharý

#include<string>
#include<algorithm>
#define E(a,v)a.erase(std::remove(a.begin(),a.end(),v),a.end());
#define F(a)for(auto&c:a)c=toupper(c);
int e(std::string&a,std::string&b){if(a[0]!=b[0])return 0;E(a,45)E(b,45)E(a,95)E(b,95)F(a)F(b)return a==b;}

Merci, préprocesseur. En outre, ce code tire parti du fait qu'en C ++, la règle de transtypage int en bool estint_var!=0


Ajoutez un ;après la définition de F. Ensuite, remplacez la première returninstruction par return 0;E(a,45)E(b,45)E(a,95)E(b,95)F(a)F(b).
Zacharý

2

CJam, 20 octets

{_"-_"f-:el:=\:c:=*}

Prend l'entrée sous la forme de ["chaîne1", "chaîne2"].

Essayez-le en ligne (version de test)

{
_      e# make copy of input
"-_"f- e# remove all "-" and "_" from both words in copy
:el    e# convert words in copy to lowercase
:=     e# 1 if both words in copy are equal, 0 if not
\      e# move original version of input to top of stack
:c     e# convert each word in original input to only 1st character
:=     e# 1 if both characters from original input are equal, 0 if not
*      e# multply the two numbers we obtained. If and only if both are 1 (true) we return 1 (true)
}

2

Haskell , 85 78 76 71 68 octets

2 octets économisés grâce à Ørjan Johansen

import Data.Char
s(a:x)=a:[toLower a|a<-x,all(/=a)"-_"]
x!y=s x==s y

Essayez-le en ligne!

Erreurs sur la chaîne vide.


all(/=a)"-_". Aussi, après votre dernière modification, fdoit devenir opérateur.
Ørjan Johansen

@ ØrjanJohansen Ah merci. Je pensais qu'il y avait un moyen plus court de le faire notElemmais je ne m'en souvenais pas pour la vie de moi.
Wheat Wizard


2

Excel, 105 octets

=AND(CODE(A1)=CODE(B1),SUBSTITUTE(SUBSTITUTE(A1,"_",""),"-","")=SUBSTITUTE(SUBSTITUTE(B1,"_",""),"-",""))

CODE () renvoie le code numérique du premier caractère.

La comparaison de chaînes dans Excel n'est pas sensible à la casse.


2

Husk , 13 octets

¤=§,←(m_ω-"-_

Essayez-le en ligne!

Construit pour chaque chaîne une paire composée du premier caractère de la chaîne et de la chaîne entière en minuscules et avec toutes les occurrences de - / _ supprimées. Vérifie ensuite si les deux paires sont égales.

Une particularité est que -dans Husk est définie la différence (c'est-à-dire qu'elle supprime uniquement la première occurrence trouvée): pour supprimer toutes les occurrences, le point fixe de -"-_est trouvé avec ω-"-_.


2

Japt , 14 25 octets

g ¥Vg ©Uu k"_-" ¥Vu k"_-"

Vérifie l'égalité de chaîne insensible à la casse en supprimant tous les caractères du mot 2 du mot 1 et en supprimant les -_caractères; qui se traduit par une chaîne vide ( "") si les mots sont égaux.
Merci Ørjan Johansen d'avoir signalé le problème.

Vérifie l'égalité de premier caractère et si les entrées en majuscules sont égales après la suppression _-.

Essayez-le en ligne!

Explication

Entrée implicite: Uet Vsont des chaînes d'entrée

g ¥Vg

Vérifiez si la première lettre de U(implicite) est égale à ( ¥) le premier caractère de V.

©Uu k"_-" ¥Vu k"_-"

Et ( ©) vérifie si U, en majuscule ( u) et avec _-supprimé ( k), est égal à ( ¥) la même chose pour V. Renvoie implicitement le résultat booléen.


Je ne peux pas faire fonctionner le lien, mais cette explication sonne comme si elle faisait la mauvaise chose. Qu'est-ce que cela donne pour testvs tset?
Ørjan Johansen

@ ØrjanJohansen Bon point ... ça échouera pour ce cas. Quant au lien, je l'ai testé et il fonctionne très bien.
Justin Mariner

Oui, le lien est de ma faute - un de ces jours, je dois passer à un navigateur moderne. J'ai eu plus de chance avec Essayez-le en ligne!
Ørjan Johansen

@ ØrjanJohansen Puis-je demander quel navigateur vous utilisez? Je suis en train d'améliorer ce CodePen et je voudrais le rendre aussi compatible que TIO.
Justin Mariner

toux utilise toujours Internet Explorer.
Ørjan Johansen


1

Perl 5 , 67 octets

s/.//,push@a,$&,y/_-//dr for<>;say($a[0]eq$a[2]&&lc$a[3]eq lc$a[1])

Essayez-le en ligne!

Prend les identifiants en entrée sur des lignes distinctes.

Explication:

s/.//,             # remove the first character
push@a,            # storage space, even positions are first character
                   # odd positions are remainder
$&,                # implicit variable holding last matched pattern (first char)
y/_-//dr           # Remove _ and - from remainder of input
for<>;             # iterate over all input lines
say                # output
($a[0]eq$a[2]&&    # check that first character is identical and
lc$a[3]eq lc$a[1]) # so is the lowercase version of the rest


1

Fusain , 29 octets

∧⁼§θ⁰§η⁰⁼↧⪫⪪⪫⪪θ_ω-ω↧⪫⪪⪫⪪η_ω-ω

Essayez-le en ligne!

Cela imprime un - for truthy and nothing for falsey.

Lien vers la version détaillée . Il compare d'abord le premier caractère des deux chaînes d'entrée ( ⁼§θ⁰§η⁰), puis compare le reste des deux chaînes après avoir supprimé les traits de soulignement et les tirets ( ⪫⪪⪫⪪θ_ω-ω) et converti en minuscules ( ).


1

C #, 101 89 octets

string g(string s)=>string.Concat(s.ToUpper().Split('-','_'));f=>s=>f[0]==s[0]&g(f)==g(s)

Enregistré 12 octets grâce à @ kusi581.


si vous utilisez une fonction locale car string.Concat(...)vous pouvez économiser 2 octets;)
kusi581

1
@ kusi581 Merci, enregistré 12 octets.
TheLethalCoder



1

C (gcc), 126 114 bytes

#define p(s)do++s;while(*s==45||*s==95);*s>95?*s-=32:0;
f(char*a,char*b){while(*a&&*a==*b){p(a)p(b)}return*a==*b;}

Try it online!

With whitespace and comments:

#define p(s)                   // Define helper macro p           \
    do ++s;                    // Increment pointer at least once \
    while (*s==45 | *s==95);   // and past any '-' or '_'         \
    *s>95 ? *s -= 32 : 0;      // If lowercase letter, convert to upper

f(char* a, char* b) {          // Define main function f
    while (*a && *a == *b) {   // Loop until end of either string
                               // or a difference found
        p(a)                   // Transform pointer and one char
        p(b)                   // via helper p above
    }
    return *a==*b;             // Test chars equal (on success, both '\0')
}

The question specifies ASCII printables, so (1) The first while test can be shortened to *s%50==45. (2) However, the lowercasing is wrong, e.g. it fails on t~ vs. t^.
Ørjan Johansen

@ØrjanJohansen I thought we could assume the inputs were both valid identifiers. But then that example with > was added, hmm.
aschepler

Huh. I was going by that example too. Looking now in the Nim manual, even - isn't actually allowed, but the algorithm still includes it...
Ørjan Johansen

@ØrjanJohansen Yeah, I noticed - isn't in the grammar description of identifier - but then other parts of that document imply it is allowed.
aschepler

1

Dyalog APL, 47 32 28 27 26 22 bytes

-4 bytes thanks to Kritixi Lithos

{(=/⊃¨⍵)∧≡/819⌶⍵~'-_'}   

Takes input as a list of the strings.

Try it online!

How?

{(=/⊃¨⍵)∧≡/819⌶⍵~'-_'}
               ⍵~'-_'   Remove '-' and '_'
           819⌶         Lowercase
         ≡/             Equality between elements
        ∧               And
 (=/⊃¨⍵)                The first element of each element is equal

I think you can do ⊃⍺=⍵ instead instead of ⍺[1]=⍵[1]
Kritixi Lithos

No, because the arguments could be of a different length!
Zacharý

1
In that case, ⊃⍵ instead of ⍵[1] should work
Kritixi Lithos

1
Maybe even ⊃⍺=⊃⍵ instead of ⍺[1]=⍵[1]
Kritixi Lithos

1

Common Lisp, 98 bytes

(lambda(x y)(and(eql(elt x 0)(elt y 0))(string-equal(#1=remove #\-(#1##\_ y))(#1##\-(#1##\_ x)))))

Try it online!

Ungolfed (super straightforward!) version:

(defun f(x y)
  (and (eql (elt x 0) (elt y 0))         ; check if initial characters are identical
       (string-equal                     ; string comparison (case insensitive)
         (remove #\- (remove #\_ y))     ; remove from both strings the unwanted chars
         (remove #\- (remove #\_ x)))))

1

R, 76 bytes

function(l)(g=substr(l,1,1))[1]==g[2]&(h=tolower(gsub('-|_','',l)))[1]==h[2]

Anonymous function that takes input as a list of two strings. Takes advantage of the fact that R's string operations, while quite long in # of characters, are vectorized. Additionally wrapping an assignment in parentheses will bind the variable, so (g=substr(l,1,1)) retains a variable to be reused later in the line and similarly for h.

R returns the last evaluated expression as function output.

Ungolfed:

function(l){
  g <- substr(l,1,1)
  h <- tolower(gsub("_|-","",l))
  (g[1]==g[2])&(h[1]==h[2])
}

Try it online! (all test cases)


1

Brachylog, 17 bytes

hᵛ&{{¬∈"_-"&ụ}ˢ}ᵛ

Try it online!

Outputs through predicate success/failure.

h                    The first element
 ᵛ                   is the same for each element of the input,
  &                  and
   {           }ᵛ    for each element of the input the following are the same:
    {      &ụ}ˢ      every element uppercased which satisfies the condition that
     ¬∈              it is not an element of
       "_-"          the string "_-".

0

Erlang 113 bytes

A=fun(L)->string:to_lower(lists:flatten(string:tokens(L,"-_")))end,fun([C|D],[C|E])->A(D)==A(E);(_,_)->a==b end.

a pair of anonymous functions that compare the two lists. meant to be pasted in the erlang shell.

more readable:

A=fun(L) ->
    string:to_lower( % case insensitive
        lists:flatten( % squash all characters back into one list
            string:tokens(L,"-_") % return a list of list of characters
        )
    )
end.
fun([C|D],[C|E]) -> % are the first characters exactly the same?
    A(D)==A(E); % does the rest compare correctly?
   (_,_) -> % first chars not the same
    a==b % shorter than 'false'
end.

0

Clip, 25 bytes

&=(x(y=AxAy[Aa--m.L`a'-'_

Explanation:

x, y and z may be referenced in a Clip program to implicitly take up to three inputs. Since this program only references x and y, it takes two inputs which are assigned to x and y.

 =(x(y                    First characters of x and y are equal
&                         And
      =AxAy               A(x) == A(y)
           [Aa            Function A, takes parameter a
                m.L`a     Map all elements of a to lower case
              --     '-'_ Remove all occurrences of '-' and '_'

Takes two strings from standard input, outputs 1 and 0 for true and false respectively.

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.