Esses identificadores são equivalentes?

20

No idioma Nim , as regras para diferenciar identificadores são um pouco mais relaxadas do que na maioria dos outros idiomas. Dois identificadores são equivalentes ou endereçam a mesma variável se seguirem estas regras :

  • o primeiro caractere de ambos é o mesmo (diferencia maiúsculas de minúsculas)
  • tanto cadeias são os mesmos (caso em minúsculas) após a remoção de todas as ocorrências dos caracteres -e_

Desafio

Escreva um programa / função que use duas cadeias que representam os identificadores Nim e produza um valor de verdade ou falsey com base no fato de serem equivalentes ou não pelas regras acima.

Especificações

  • Aplicam- se as regras de E / S padrão .
  • As brechas padrão são proibidas .
  • As seqüências conterão apenas imprimíveis ASCII . Você não precisa verificar se é um identificador válido.
  • As seqüências de caracteres podem ser tomadas como duas entradas separadas, lista de seqüências de caracteres etc. (você conhece a broca)
  • Cadeias de caracteres vazias não precisam ser manipuladas.
  • A saída deve ser consistente para os valores de verdade e falsey.
  • Esse desafio não é encontrar a abordagem mais curta em todos os idiomas, mas sim encontrar a abordagem mais curta em cada idioma .
  • Seu código será pontuado em bytes , geralmente na codificação UTF-8, a menos que especificado de outra forma.
  • Funções internas que executam essa tarefa são permitidas, mas é recomendável incluir uma solução que não dependa de uma incorporada.
  • Explicações, mesmo para idiomas "práticos", são incentivadas .

Casos de teste

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

Implementação de referência ungolfed

Isso está escrito em Nim, em si.

import strutils, re

proc sameIdentifier(a, b: string): bool =
  a[0] == b[0] and
    a.replace(re"_|–", "").toLower == b.replace(re"_|–", "").toLower
totalmente humano
fonte
3
Eu sugiro um caso de teste de f("_test", "test").
Maçaneta
@Doorknob Adicionado.
totallyhuman
1
Sugiro acrescentar f("test", "tset"), pois acho que uma resposta fornece um resultado inesperado.
Ørjan Johansen
@ ØrjanJohansen Concluído.
totallyhuman
Espere, então a entrada é uma string que "representa identificadores Nim", e nós "não precisamos verificar se é um identificador válido", mas um dos exemplos contém >?
aschepler

Respostas:

7

JavaScript (ES6), 62 61 bytes

Guardado 1 byte graças a @JohanKarlsson

Recebe entrada na sintaxe de currying (a)(b). Retorna um booleano.

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

Casos de teste

Arnauld
fonte
1
/-|_/gsalva um byte
Johan Karlsson
6

Python 3 , 76 bytes

lambda a,b:f(*a)==f(*b)
f=lambda f,*r:[f+k.lower()for k in r if~-(k in'-_')]

Experimente online!

-1 byte graças a notjagan
-3 bytes graças a Wheat Wizard

HyperNeutrino
fonte
-1 byte.
notjagan
@notjagan Neat trick; obrigado!
HyperNeutrino
@notjagan Eu não sabia que você poderia fazer isso, mas eu acho que faz sentido, arrefecer
Stephen
-14 bytes!
notjagan
1
ainda mais curto
Wheat Wizard
4

Na verdade , 15 bytes

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

Experimente online!

Curiosidade: isso funciona com qualquer número de entradas (sempre retorna verdade para menos de 2 entradas).

Explicação:

⌠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?
Mego
fonte
3

Pitão , 13 bytes

qFm[hd-r0d"-_

Experimente online!

Explicação

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
notjagan
fonte
3

05AB1E , 12 bytes

εćs„-_SKl«}Ë

Experimente online!

-1 graças a Adnan .

Teoricamente, εćs„-_-«}Ëdeveria ter funcionado por 10 bytes, mas infelizmente esse comportamento está obsoleto por enquanto.

Erik, o Outgolfer
fonte
Ah, sim, lol, ainda preciso consertar isso. Você pode salvar um byte usando em „-_SKvez de '-K'_K.
Adnan
@ Adnan E eu sabia que havia um caminho. Obrigado!
Erik the Outgolfer
11 bytes se você mudar SKpara м.
Kevin Cruijssen
@KevinCruijssen Hm, vou atualizar esta resposta. Eu não acho que мexistia naquela época. : P
Erik the Outgolfer
3

Gelatina , 11 bytes

ḟ⁾-_Œl,Ḣµ€E

Experimente online!

-2 bytes graças a Erik, o Outgolfer
-1 byte graças a Jonathan Allan

HyperNeutrino
fonte
Pegue uma lista de duas seqüências de caracteres como ["symbolsAre_too>_>", "symbols_areTOO>>"]e use Ḣ;ḟ⁾-_Œl$µ€Epara -2. Bata esse Pyth!
Erik the Outgolfer
... ou mesmo apenas ḟ⁾-_Œl,Ḣµ€Epor 11 bytes.
Jonathan Allan
Não tem problema, talvez creditar Erik para 2 e me por 1 :)
Jonathan Allan
@JonathanAllan Ah. Boa ideia; Eu vou fazer isso :)
HyperNeutrino
3

Ruby , 86 64 63 61 51 bytes

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

Experimente online!

Isso parece muito longo ainda parece um pouco longo. Eu apreciaria a ajuda de qualquer guru Ruby por aí, tornando isso pelo menos um pouco mais curto.

Assistente de Trigo
fonte
Não é um guru, mas me inspirei para verificar a lista de métodos String . .delete("_-")é mais curto.
Ørjan Johansen
f[x]é sempre uma substituição válida para f.call(x)quando estão envolvidas lambdas stabby.
Value Ink
@ValueInk Thanks! Eu tenho tentado descobrir como jogar golfe no Ruby com base nas respostas do Stack Overflow, então não sabia que isso era uma opção.
Assistente de trigo
3

C ++, 288 248 bytes

-5 bytes graças a 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;}

Obrigado, pré-processador. Além disso, esse código aproveita o fato de que em C ++ a regra para converter int para bool éint_var!=0

HatsuPointerKun
fonte
Adicione um ;após a definição de F. Em seguida, altere a primeira returninstrução para return 0;E(a,45)E(b,45)E(a,95)E(b,95)F(a)F(b).
Zacharý
2

CJam, 20 bytes

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

Recebe entrada na forma de ["string1", "string2"].

Experimente on-line (versão de teste)

{
_      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)
}
geokavel
fonte
2

Haskell , 85 78 76 71 68 bytes

2 bytes salvos graças a Ørjan Johansen

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

Experimente online!

Erros na cadeia vazia.

Assistente de Trigo
fonte
all(/=a)"-_". Além disso, após a edição mais recente, você fprecisa se tornar um operador.
Ørjan Johansen
@ ØrjanJohansen Ah, obrigado. Eu pensei que havia uma maneira mais curta de fazer, notElemmas não conseguia me lembrar disso pela vida toda.
Assistente de trigo
2

Python 2 , 72 bytes

lambda x,y:r(x)==r(y)
r=lambda x:x[0]+x[1:].lower().translate(None,"-_")

Experimente online!

Não funcionará com o Python 3 por causa da nova translatesintaxe.

jferard
fonte
2

Excel, 105 bytes

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

CODE () retorna o código numérico do primeiro caractere.

A comparação de cadeias no Excel não diferencia maiúsculas de minúsculas.

Wernisch
fonte
2

Casca , 13 bytes

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

Experimente online!

Cria para cada sequência um par que consiste no primeiro caractere da sequência e a sequência inteira em minúsculas e com todas as ocorrências de - / _ removidas. Em seguida, verifica se os dois pares são iguais.

Uma particularidade é que -em Husk é definida a diferença (isto é, remove somente a primeira ocorrência encontrada): para remover todas as ocorrências, o ponto fixo de -"-_é encontrado com ω-"-_.

Leo
fonte
2

Japonês , 14 25 bytes

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

Verifica a igualdade de cadeias sem distinção entre maiúsculas e minúsculas removendo todos os caracteres na palavra 2 da palavra 1 e removendo os -_caracteres; isso resulta em uma string vazia ( "") se as palavras forem iguais.
Obrigado Ørjan Johansen por apontar o problema com isso.

Verifica a igualdade do primeiro caractere e se as entradas em maiúsculas são iguais após a remoção _-.

Experimente online!

Explicação

Entrada implícita: Ue Vsão cadeias de entrada

g ¥Vg

Verifique se a primeira letra de U(implícita) é igual a ( ¥) o primeiro caractere de V.

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

E ( ©) verifique se U, em maiúsculas ( u) e com _-removido ( k), igual ( ¥) é o mesmo para V. Retornar implicitamente o resultado booleano.

Justin Mariner
fonte
Não consigo fazer o link funcionar, mas essa explicação parece estar errada. O que isso dá para testvs. tset?
Ørjan Johansen
@ ØrjanJohansen Bom ponto ... falhará nesse caso. Quanto ao link, eu testei e funciona bem.
23717 Justin Mariner
Sim, o link é culpa minha - um dia desses eu preciso mudar para um navegador moderno. Tive mais sorte com o Experimente online!
Ørjan Johansen
@ ØrjanJohansen Posso perguntar qual navegador você está usando? Estou no processo de melhorar esse CodePen e gostaria de torná-lo tão compatível quanto o TIO.
Justin Mariner
tosse ainda usando o Internet Explorer.
Ørjan Johansen
1

Python 2 , 79 73 bytes

-6 bytes graças a @notjagan: verifique se o comprimento do conjunto de todos os nomes reduzidos é 1 ou não.

lambda*l:len({x[0]+re.sub('-|_','',x[1:].lower())for x in l})<2
import re

Experimente online!

officialaimm
fonte
2
-6 bytes.
notjagan
Claro, pronto, eu esqueci sua existência !! Muito obrigado!!
officialaimm
1

Perl 5 , 67 bytes

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

Experimente online!

Leva os identificadores como entrada em linhas separadas.

Explicação:

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
Xcali
fonte
1

Carvão , 29 bytes

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

Experimente online!

Isso imprime um -para verdade e nada para falsey.

Link para a versão detalhada . Primeiro, ele compara o primeiro caractere das duas strings de entrada ( ⁼§θ⁰§η⁰) e, em seguida, o restante das duas strings após remover os sublinhados e os hífens ( ⪫⪪⪫⪪θ_ω-ω) e converter para minúsculas ( ).

Charlie
fonte
1

C #, 101 89 bytes

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

Economizou 12 bytes graças a @ kusi581.

TheLethalCoder
fonte
se você usar uma função local para string.Concat(...)que você pode salvar 2 bytes;)
kusi581
1
@ kusi581 Obrigado, salvou 12 bytes.
TheLethalCoder
1

Java (OpenJDK 8) , 95 bytes

a->b->a.charAt(0)==b.charAt(0)&&a.replaceAll("_|-","").equalsIgnoreCase(b.replaceAll("_|-",""))

Experimente online! Bem direto.

Roman Gräf
fonte
1

Pyke , 13 bytes

F'hl1"-_"-)Xq

Experimente online!

F         )   -  for i in input():
 'hl1         -   i[0], i.lower()
     "-_"-    -         ^.remove("-_")
           Xq - equal(^)
Azul
fonte
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;}

Experimente online!

Com espaço em branco e comentários:

#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')
}
aschepler
fonte
A pergunta especifica os imprimíveis ASCII, portanto (1) o primeiro whileteste pode ser abreviado para *s%50==45. (2) No entanto, o lowercasing está errado, por exemplo, ele falha na t~vs t^.
Ørjan Johansen
@ ØrjanJohansen Pensei que poderíamos assumir que as entradas eram identificadores válidos. Mas então esse exemplo >foi adicionado, hmm.
aschepler
Hã. Eu também estava seguindo esse exemplo. Olhando agora no manual Nim , mesmo- não é permitido, mas o algoritmo ainda o inclui ... #
Ørjan Johansen
@ ØrjanJohansen Sim, notei que -não está na descrição gramatical do identificador - mas outras partes desse documento sugerem que é permitido.
Aschepler
1

Dyalog APL, 47 32 28 27 26 22 bytes

-4 bytes graças a Kritixi Lithos

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

Recebe entrada como uma lista das seqüências de caracteres.

Experimente online!

Quão?

{(=/⊃¨⍵)∧≡/819⌶⍵~'-_'}
               ⍵~'-_'   Remove '-' and '_'
           819⌶         Lowercase
         ≡/             Equality between elements
        ∧               And
 (=/⊃¨⍵)                The first element of each element is equal
Zacharý
fonte
Eu acho que você pode fazer ⊃⍺=⍵em vez de, em vez de⍺[1]=⍵[1]
Kritixi Lithos
Não, porque os argumentos podem ter um comprimento diferente!
Zacharý 29/07
1
Nesse caso, ⊃⍵em vez de ⍵[1]deve funcionar
Kritixi Lithos
1
Talvez até em ⊃⍺=⊃⍵vez de⍺[1]=⍵[1]
Kritixi Lithos
1

Lisp comum, 98 bytes

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

Experimente online!

Versão ungolfed (super direta!):

(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)))))
Renzo
fonte
1

R , 76 bytes

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

Função anônima que recebe entrada como uma lista de duas seqüências de caracteres. Aproveita o fato de que as operações de string de R, embora bastante longas em # de caracteres, são vetorizadas. Além disso, agrupar uma atribuição entre parênteses vinculará a variável, portanto(g=substr(l,1,1)) mantendo uma variável a ser reutilizada posteriormente na linha e da mesma forma para h.

R retorna a última expressão avaliada como saída da função.

Ungolfed:

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

Experimente online! (todos os casos de teste)

Giuseppe
fonte
1

Braquilog , 17 bytes

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

Experimente online!

Saídas através do predicado de sucesso / falha.

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 "_-".
String não relacionada
fonte
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.

um par de funções anônimas que comparam as duas listas. destinado a ser colado na concha erlang.

mais legível:

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.
JoshRagem
fonte
0

Clipe , 25 bytes

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

Explicação :

x, yE zpode ser referenciado em um programa Clipe tomar implicitamente até três entradas. Como este programa apenas faz referência a xe y, são necessárias duas entradas atribuídas a xe 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 '_'

Toma duas strings da entrada padrão, saídas 1e 0para true e false, respectivamente.

bcsb1001
fonte