Là những định danh tương đương?


20

Trong ngôn ngữ Nim , các quy tắc phân biệt định danh thoải mái hơn một chút so với hầu hết các ngôn ngữ khác. Hai định danh tương đương hoặc địa chỉ cùng một biến nếu chúng tuân theo các quy tắc sau:

  • ký tự đầu tiên của cả hai đều giống nhau (phân biệt chữ hoa chữ thường)
  • cả hai chuỗi đều giống nhau (trường hợp trong nhạy cảm) sau khi loại bỏ tất cả các trường trong những nhân vật -_

Thử thách

Viết chương trình / hàm lấy hai chuỗi đại diện cho mã định danh Nim và đưa ra giá trị trung thực hoặc falsey dựa trên việc chúng có tương đương với các quy tắc ở trên hay không.

Thông số kỹ thuật

  • Quy tắc I / O tiêu chuẩn được áp dụng .
  • Sơ hở chuẩn bị cấm .
  • Các chuỗi sẽ chỉ chứa các bản in ASCII . Bạn không cần kiểm tra xem đó có phải là định danh hợp lệ không.
  • Các chuỗi có thể được lấy làm hai đầu vào riêng biệt, danh sách các chuỗi, v.v. (bạn biết cách khoan)
  • Chuỗi rỗng không cần phải xử lý.
  • Đầu ra phải phù hợp với cả giá trị trung thực và giá trị falsey.
  • Thách thức này không phải là tìm ra cách tiếp cận ngắn nhất trong tất cả các ngôn ngữ, mà là tìm cách tiếp cận ngắn nhất trong mỗi ngôn ngữ .
  • Mã của bạn sẽ được ghi theo byte , thường là trong mã hóa UTF-8, trừ khi được quy định khác.
  • Các chức năng tích hợp thực hiện nhiệm vụ này được cho phép nhưng bao gồm giải pháp không dựa vào tích hợp được khuyến khích.
  • Giải thích, ngay cả đối với các ngôn ngữ "thực tế", được khuyến khích .

Các trường hợp thử nghiệm

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

Thực hiện tham chiếu Ungolfed

Điều này được viết bằng Nim.

import strutils, re

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

3
Tôi đề nghị một trường hợp thử nghiệm của f("_test", "test").
Doorknob

@Doorknob Đã thêm.
hoàn toàn

1
Tôi đề nghị thêm f("test", "tset"), vì tôi nghĩ rằng một câu trả lời mang lại một kết quả bất ngờ cho nó.
Ørjan Johansen

@ ØrjanJohansen Xong.
hoàn toàn

Đợi đã, vì vậy, đầu vào là các chuỗi "đại diện cho số nhận dạng Nim" và chúng tôi "không cần kiểm tra xem đó có phải là số nhận dạng hợp lệ không", nhưng sau đó một trong các ví dụ có chứa >không?
aschepler

Câu trả lời:


7

JavaScript (ES6), 62 61 byte

Đã lưu 1 byte nhờ @JohanKarlsson

Đưa đầu vào theo cú pháp currying (a)(b). Trả về một boolean.

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

Các trường hợp thử nghiệm


1
/-|_/gtiết kiệm một byte
Johan Karlsson


4

Trên thực tế , 15 byte

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

Hãy thử trực tuyến!

Thực tế thú vị: điều này hoạt động với bất kỳ số lượng đầu vào (nó luôn trả về sự thật cho ít hơn 2 đầu vào).

Giải trình:

⌠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

Bình thường , 13 byte

qFm[hd-r0d"-_

Hãy thử trực tuyến!

Giải trình

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 byte

εćs„-_SKl«}Ë

Hãy thử trực tuyến!

-1 cảm ơn Ad Nam .

Về mặt lý thuyết, đáng εćs„-_-«}Ëlẽ phải làm việc với 10 byte, nhưng không may là hành vi này không được chấp nhận ngay bây giờ.


Oh yeah lol, tôi vẫn cần phải sửa nó. Bạn có thể lưu một byte bằng cách sử dụng „-_SKthay vì '-K'_K.
Ad Nam

@Ad Nam Và tôi biết có một cách. Cảm ơn!
Erik the Outgolfer 28/07/17

11 byte nếu bạn thay đổi SKthành м.
Kevin Cruijssen

@KevinCruijssen Hừm, tôi sẽ cập nhật câu trả lời này. Tôi không nghĩ rằng мđã tồn tại trước đó. : P
Erik the Outgolfer

3

Thạch , 11 byte

ḟ⁾-_Œl,Ḣµ€E

Hãy thử trực tuyến!

-2 byte nhờ Erik the Outgolfer
-1 byte nhờ Jonathan Allan


Lấy danh sách hai chuỗi like ["symbolsAre_too>_>", "symbols_areTOO>>"]và sử dụng Ḣ;ḟ⁾-_Œl$µ€Ethay cho -2. Đánh bại Pyth đó!
Erik the Outgolfer 28/07/17

... hoặc thậm chí chỉ ḟ⁾-_Œl,Ḣµ€Evới 11 byte.
Jonathan Allan

Không có vấn đề gì, có thể ghi có Erik cho 2 và tôi cho 1 :)
Jonathan Allan

@Jonathan Allan Ah. Ý tưởng tốt; Tôi sẽ làm điều đó :)
HyperNeutrino

3

Ruby , 86 64 63 61 51 byte

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

Hãy thử trực tuyến!

Cảm giác này thực sự dài vẫn cảm thấy hơi dài. Tôi sẽ đánh giá cao sự giúp đỡ của bất kỳ bậc thầy Ruby nào ngoài kia trong việc làm điều này ít nhất một chút ngắn hơn.


Không phải là một bậc thầy, nhưng tôi đã có cảm hứng để kiểm tra danh sách phương thức String . .delete("_-")ngắn hơn
Ørjan Johansen

f[x]luôn luôn là sự thay thế hợp lệ f.call(x)khi có liên quan đến lambdas.
Mực giá trị

@ValueInk Cảm ơn! Tôi đã cố gắng tìm ra cách chơi golf trong Ruby dựa trên các câu trả lời của Stack Overflow, vì vậy tôi không biết đó là một lựa chọn.
Thuật sĩ lúa mì

3

C ++, 288 248 byte

-5 byte nhờ 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;}

Cảm ơn bạn, Tiền xử lý. Ngoài ra, mã này lợi dụng thực tế là trong C ++, quy tắc truyền int thành bool làint_var!=0


Add a ; after the definition of F. Then, change the first return statement to 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:=*}

Takes input in the form of ["string1","string2"].

Try it Online (testing version)

{
_      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 bytes

2 bytes saved thanks to Ørjan Johansen

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

Try it online!

Errors on the empty string.


all(/=a)"-_". Also after your latest edit, f needs to become an operator.
Ørjan Johansen

@ØrjanJohansen Ah thanks. I thought there was a shorter way to do notElem but I couldn't remember it for the life of me.
Wheat Wizard

2

Python 2, 72 bytes

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

Try it online!

Won't work with Python 3 because of the new translate syntax.


2

Excel, 105 bytes

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

CODE() returns numeric code of first character.

String comparison in Excel is case insensitive.


2

Husk, 13 bytes

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

Try it online!

Builds for each string a pair consisting of the first character of the string and the whole string lowercased and with all occurrences of -/_ removed. Then checks if the two pairs are equal.

A particularity is that - in Husk is set difference (i.e. it removes only the first occurrence found): in order to remove all occurrences, the fixed point of -"-_ is found with ω-"-_.


2

Japt, 14 25 bytes

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

Checks case-insensitive string equality by removing all characters in word 2 from word 1, and removing the -_ characters; that results in an empty string ("") if the words are equal.
Thanks Ørjan Johansen for pointing out the problem with this.

Checks first-char equality and if the uppercased inputs are equal after removing _-.

Try it online!

Explanation

Implicit input: U and V are input strings

g ¥Vg

Check if first letter of U (implicit) equals (¥) the first char of V.

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

And (©) check if U, uppercased (u) and with _- removed (k), equals (¥) the same for V. Implicitly return the boolean result.


I cannot get the link to work, but that explanation sounds like it does the wrong thing. What does it give for test vs. 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

Perl 5, 67 bytes

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

Try it online!

Takes the identifiers as input on separate lines.

Explanation:

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

Charcoal, 29 bytes

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

Try it online!

This prints a - for truthy and nothing for 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 ().


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.


if you use a local function for string.Concat(...) you can save 2 bytes ;)
kusi581

1
@kusi581 Thanks, saved 12 bytes.
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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.