Czy te identyfikatory są równoważne?

20

W języku Nim zasady rozróżniania identyfikatorów są nieco łagodniejsze niż w większości innych języków. Dwa identyfikatory są równoważne lub odnoszą się do tej samej zmiennej, jeśli są zgodne z tymi zasadami :

  • pierwszy znak obu znaków jest taki sam ( wielkość liter ma znaczenie)
  • oba ciągi są takie same (przypadek w czuły) po usunięciu wszystkich wystąpień bohaterów -i_

Wyzwanie

Napisz program / funkcję, która pobiera dwa ciągi znaków, które reprezentują identyfikatory Nim i generują wartość true lub falsey na podstawie tego, czy są one równoważne z powyższymi regułami.

Dane techniczne

  • Zasady Standard I / O zastosowania .
  • Standardowe lukizabronione .
  • Ciągi będą zawierać tylko pliki do wydruku ASCII . Państwo nie trzeba sprawdzić, czy jest to poprawny identyfikator.
  • Ciągi mogą być traktowane jako dwa osobne dane wejściowe, lista ciągów itp. (Znasz ćwiczenie)
  • Puste łańcuchy nie muszą być obsługiwane.
  • Wynik musi być spójny zarówno dla wartości zgodnych z prawdą, jak i falsey.
  • Wyzwanie to nie polega na znalezieniu najkrótszego podejścia we wszystkich językach, chodzi raczej o znalezienie najkrótszego podejścia w każdym języku .
  • Twój kod będzie oceniany w bajtach , zwykle w kodowaniu UTF-8, chyba że określono inaczej.
  • Wbudowane funkcje wykonujące to zadanie są dozwolone, ale zalecane jest rozwiązanie, które nie opiera się na wbudowanym.
  • Zachęca się do wyjaśnień, nawet w przypadku „praktycznych” języków .

Przypadki testowe

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

Implementacja referencji bez golfisty

Jest to napisane w samym Nim.

import strutils, re

proc sameIdentifier(a, b: string): bool =
  a[0] == b[0] and
    a.replace(re"_|–", "").toLower == b.replace(re"_|–", "").toLower
całkowicie ludzki
źródło
3
Sugeruję przypadek testowy f("_test", "test").
Klamka
@Doorknob Dodano.
całkowicie ludzki,
1
Sugeruję dodanie f("test", "tset"), ponieważ myślę, że jedna odpowiedź daje nieoczekiwany wynik.
Ørjan Johansen
@ ØrjanJohansen Gotowe.
całkowicie ludzki,
Poczekaj, więc dane wejściowe to ciągi, które „reprezentują identyfikatory Nim”, a my „nie musimy sprawdzać, czy jest to prawidłowy identyfikator”, ale wtedy jeden z przykładów zawiera >?
aschepler

Odpowiedzi:

7

JavaScript (ES6), 62 61 bajtów

Zapisano 1 bajt dzięki @JohanKarlsson

Pobiera dane wejściowe w składni curry (a)(b). Zwraca wartość logiczną.

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

Przypadki testowe

Arnauld
źródło
1
/-|_/gzapisuje bajt
Johan Karlsson
6

Python 3 , 76 bajtów

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

Wypróbuj online!

-1 bajt dzięki notjagan
-3 bajty dzięki Kreator pszenicy

HyperNeutrino
źródło
-1 bajt.
notjagan
@notjagan Neat trick; dzięki!
HyperNeutrino,
@notjagan Nie wiedziałem, że możesz to zrobić, ale myślę, że to ma sens, fajnie
Stephen
-14 bajtów!
notjagan
1
jeszcze krótszy
Wheat Wizard
4

Właściwie 15 bajtów

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

Wypróbuj online!

Ciekawostka: działa z dowolną liczbą danych wejściowych (zawsze zwraca wartość true dla mniej niż 2 danych wejściowych).

Wyjaśnienie:

⌠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
źródło
3

Pyth , 13 bajtów

qFm[hd-r0d"-_

Wypróbuj online!

Wyjaśnienie

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
źródło
3

05AB1E , 12 bajtów

εćs„-_SKl«}Ë

Wypróbuj online!

-1 dzięki Adnan .

Teoretycznie εćs„-_-«}Ëpowinien był działać przez 10 bajtów, ale niestety to zachowanie jest na razie przestarzałe.

Erik the Outgolfer
źródło
O tak lol, wciąż muszę to naprawić. Możesz zapisać bajt, używając „-_SKzamiast '-K'_K.
Adnan
@Adnan I wiedziałem, że jest sposób. Dzięki!
Erik the Outgolfer
11 bajtów, jeśli zmienisz SKna м.
Kevin Cruijssen
@KevinCruijssen Hm, zaktualizuję tę odpowiedź. Nie sądzę, żeby wtedy мistniał. : P
Erik the Outgolfer
3

Galaretka , 11 bajtów

ḟ⁾-_Œl,Ḣµ€E

Wypróbuj online!

-2 bajty dzięki Erikowi Outgolfer
-1 bajt dzięki Jonathanowi Allanowi

HyperNeutrino
źródło
Weź listę dwóch ciągów jak ["symbolsAre_too>_>", "symbols_areTOO>>"]i użyj Ḣ;ḟ⁾-_Œl$µ€Ezamiast tego dla -2. Pokonaj tego Pytha!
Erik the Outgolfer
... a nawet tylko ḟ⁾-_Œl,Ḣµ€Ena 11 bajtów.
Jonathan Allan
Nie ma problemu, może kredyt Erika za 2 i mnie za 1 :)
Jonathan Allan
@JathanathanAllan Ah. Dobry pomysł; Zrobię to :)
HyperNeutrino
3

Rubinowy , 86 64 63 61 51 bajtów

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

Wypróbuj online!

To wydaje się naprawdę długie, wciąż wydaje się trochę długie. Byłbym wdzięczny za pomoc każdego guru Ruby, który uczynił to co najmniej nieco krótszym.

Kreator pszenicy
źródło
Nie jestem guru, ale zainspirowałem się do sprawdzenia listy metod String . .delete("_-")jest krótszy.
Ørjan Johansen
f[x]jest zawsze ważnym zamiennikiem, f.call(x)gdy w grę wchodzą dźgnięcia lambdas.
Wartość tuszu
@ValueInk Thanks! Próbowałem dowiedzieć się, jak grać w golfa w Ruby na podstawie odpowiedzi Stack Overflow, więc nie wiedziałem, że to była opcja.
Wheat Wizard
3

C ++, 288 248 bajtów

-5 bajtów dzięki Zacharýowi

#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;}

Dziękuję, Preprocesorze. Ponadto ten kod wykorzystuje fakt, że w C ++ reguła rzucania int na bool jestint_var!=0

HatsuPointerKun
źródło
Dodaj ;po definicji F. Następnie zmień pierwszą returninstrukcję na return 0;E(a,45)E(b,45)E(a,95)E(b,95)F(a)F(b).
Zacharý
2

CJam, 20 bajtów

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

Pobiera dane wejściowe w postaci [„string1”, „string2”].

Wypróbuj online (wersja testowa)

{
_      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
źródło
2

Haskell , 85 78 76 71 68 bajtów

2 bajty zapisane dzięki Ørjan Johansen

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

Wypróbuj online!

Błędy w pustym ciągu.

Kreator pszenicy
źródło
all(/=a)"-_". Również po ostatniej edycji fmusi zostać operatorem.
Ørjan Johansen
@ ØrjanJohansen Ah dzięki. Myślałem, że jest krótszy sposób, notElemale nie pamiętałem tego przez całe życie.
Wheat Wizard
2

Python 2 , 72 bajty

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

Wypróbuj online!

Nie działa z Python 3 z powodu nowej translateskładni.

Jferard
źródło
2

Excel, 105 bajtów

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

CODE () zwraca kod numeryczny pierwszego znaku.

Porównanie ciągów w programie Excel nie uwzględnia wielkości liter.

Wernisch
źródło
2

Łuska , 13 bajtów

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

Wypróbuj online!

Tworzy dla każdego łańcucha parę składającą się z pierwszego znaku łańcucha i całego łańcucha pisanego małymi literami i po usunięciu wszystkich wystąpień - / _. Następnie sprawdza, czy dwie pary są równe.

Szczególną -cechą jest to, że w Łusce ustawiana jest różnica (tzn. Usuwa tylko pierwsze znalezione wystąpienie): w celu usunięcia wszystkich wystąpień znajduje się stały punkt -"-_z ω-"-_.

Lew
źródło
2

Japt , 14 25 bajtów

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

Sprawdza równość ciągów znaków bez rozróżniania wielkości liter, usuwając wszystkie znaki ze słowa 2 ze słowa 1 i usuwając -_znaki; powoduje to pusty ciąg ( ""), jeśli słowa są równe.
Dzięki Ørjan Johansen za wskazanie problemu z tym.

Sprawdza równość pierwszego znaku i czy po usunięciu wejściowe wielkie litery są równe _-.

Wypróbuj online!

Wyjaśnienie

Dane niejawne: Ui Vsą łańcuchami wejściowymi

g ¥Vg

Sprawdź, czy pierwsza litera U(niejawna) jest równa ( ¥) pierwszemu znakowi V.

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

I ( ©) sprawdź, czy Uwielkie litery ( u) i _-usunięte ( k) są równe ( ¥) dla V. Domyślnie zwróć wynik boolowski.

Justin Mariner
źródło
Nie mogę uzyskać linku do pracy, ale to wyjaśnienie brzmi, jakby robiło to źle. Co to dać do testvs tset?
Ørjan Johansen
@ØrjanJohansen Good point... it'll fail for that case. As for the link, I've tested it and it works fine.
Justin Mariner
Yeah the link is my own fault - one of these days I need to change to a modern browser. I had better luck with Try it online!
Ørjan Johansen
@ØrjanJohansen Could I ask what browser you're using? I'm in the process of improving that CodePen and would like to make it as compatible as TIO.
Justin Mariner
cough still using Internet Explorer.
Ørjan Johansen
1

Python 2, 79 73 bytes

-6 bytes thanks to @notjagan: check the length of set of all reduced names is 1 or not.

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

Try it online!

officialaimm
źródło
2
-6 bytes.
notjagan
Oczywiście, ustawiłem, zapomniałem o jego istnieniu !! Wielkie dzięki!!
officialaimm
1

Perl 5 , 67 bajtów

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

Wypróbuj online!

Pobiera identyfikatory jako dane wejściowe w oddzielnych wierszach.

Wyjaśnienie:

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
źródło
1

Węgiel drzewny , 29 bajtów

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

Wypróbuj online!

To drukuje -na prawdę i nic na falsey.

Link to the verbose version. It first compares the first character of both input strings (⁼§θ⁰§η⁰) and then compares the rest of both strings after removing the underscores and the hyphens (⪫⪪⪫⪪θ_ω-ω) and converting to lowercase ().

Charlie
źródło
1

C#, 101 89 bytes

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

Saved 12 bytes thanks to @kusi581.

TheLethalCoder
źródło
if you use a local function for string.Concat(...) you can save 2 bytes ;)
kusi581
1
@kusi581 Thanks, saved 12 bytes.
TheLethalCoder
1

Java (OpenJDK 8), 95 bytes

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

Try it online! Pretty straight forward.

Roman Gräf
źródło
1

Pyke, 13 bytes

F'hl1"-_"-)Xq

Try it online!

F         )   -  for i in input():
 'hl1         -   i[0], i.lower()
     "-_"-    -         ^.remove("-_")
           Xq - equal(^)
Blue
źródło
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')
}
aschepler
źródło
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
Zacharý
źródło
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)))))
Renzo
źródło
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)

Giuseppe
źródło
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 "_-".
Unrelated String
źródło
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.
JoshRagem
źródło
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.

bcsb1001
źródło