이 식별자는 동일합니까?


20

Nim 언어에서는 식별자를 구별하는 규칙 이 대부분의 다른 언어보다 약간 완화 됩니다. 다음 규칙 을 따르는 경우 두 식별자가 동일하거나 동일한 변수를 처리합니다 .

  • 두 문자의 첫 문자 는 동일합니다 (대소 문자 구분)
  • 두 문자열이 동일 (경우 구분) 제거한 후 모든 인스턴스 문자를 -하고_

도전

Nim 식별자를 나타내는 두 개의 문자열 을 사용 하는 프로그램 / 함수 를 작성하고 위의 규칙 과 같은지 여부에 따라 진실 또는 거짓 값을 출력하십시오 .

명세서

  • 표준 I / O 규칙이 적용됩니다 .
  • 표준 허점금지되어 있습니다.
  • 문자열 에는 ASCII 인쇄 가능 파일 만 포함 됩니다 . 당신은 하지 않는 유효한 식별자인지 확인해야합니다.
  • 문자열은 두 개의 개별 입력, 문자열 목록 등으로 간주 될 수 있습니다 (드릴을 알고 있음).
  • 빈 문자열을 처리 할 필요가 없습니다 .
  • 결과 진실과 거짓 값 모두에 일관성이 있어야 합니다.
  • 이 과제는 모든 언어에서 가장 짧은 방법을 찾는 것이 아니라 각 언어에서 가장 짧은 방법을 찾는 것입니다 .
  • 달리 지정하지 않는 한 코드는 일반적으로 인코딩 UTF-8 에서 바이트 단위점수매겨 집니다.
  • 이 작업을 수행하는 내장 기능은 허용 되지만 내장 기능에 의존하지 않는 솔루션을 포함하는 것이 좋습니다.
  • "실제적인"언어에 대한 설명도 권장 됩니다.

테스트 사례

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

비 골격 참조 구현

이것은 Nim 자체로 작성되었습니다.

import strutils, re

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

3
의 테스트 사례를 제안합니다 f("_test", "test").
Doorknob

@Doorknob가 추가되었습니다.
완전히 인간적인

1
f("test", "tset")하나의 답변이 예상치 못한 결과를 가져 온다고 생각 하므로을 추가하는 것이 좋습니다 .
Ørjan Johansen

@ ØrjanJohansen 님.
완전히 인간적인

잠깐, 입력은 "Nim 식별자를 나타내는"문자열이며 "유효한 식별자인지 확인할 필요는 없지만"예제 중 하나에 >?
aschepler

답변:


7

자바 스크립트 (ES6), 62 61 바이트

@JohanKarlsson 덕분에 1 바이트 절약

카레 구문으로 입력을 (a)(b)받습니다. 부울을 반환합니다.

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

테스트 사례


1
/-|_/g바이트 절약
Johan Karlsson

6

파이썬 3 , 76 바이트

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

온라인으로 사용해보십시오!

notjagan 덕분에 -1 바이트,
Wheat Wizard 덕분에 -3 바이트



@notjagan 깔끔한 트릭; 감사!
HyperNeutrino

@notjagan 나는 당신이 그렇게 할 수 있다는 것을 몰랐지만, 그것이 타당하다고 생각합니다
Stephen



4

실제로 15 바이트

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

온라인으로 사용해보십시오!

재미있는 사실 : 이것은 많은 입력에서 작동합니다 (2 입력 미만의 경우 항상 진실을 반환합니다).

설명:

⌠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 바이트

qFm[hd-r0d"-_

온라인으로 사용해보십시오!

설명

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 바이트

εćs„-_SKl«}Ë

온라인으로 사용해보십시오!

Adnan 에게 -1 감사합니다 .

이론적 εćs„-_-«}Ë으로 10 바이트 동안 작동했지만 불행히도이 동작은 더 이상 사용되지 않습니다.


아 그래, 아직도 고쳐야 해 „-_SK대신을 사용하여 바이트를 저장할 수 있습니다 '-K'_K.
Adnan

@Adnan 그리고 나는 방법이 있다는 것을 알았습니다. 감사!
Outgolfer Erik

11 바이트 당신은 변경하는 경우 SKм.
Kevin Cruijssen

@KevinCruijssen Hm,이 답변을 업데이트하겠습니다. 당시에는 м존재 하지 않았다고 생각 합니다. : P
아웃 골퍼 Erik

3

젤리 , 11 바이트

ḟ⁾-_Œl,Ḣµ€E

온라인으로 사용해보십시오!

Outgolfer Erik에게
-2 바이트 감사합니다 Jonathan Allan에게 -1 바이트 감사합니다


두 개의 문자열 목록을 가져 와서 -2 대신 ["symbolsAre_too>_>", "symbols_areTOO>>"]사용하십시오 Ḣ;ḟ⁾-_Œl$µ€E. 그 Pyth를 이길!
Outgolfer Erik

... 또는 심지어 ḟ⁾-_Œl,Ḣµ€E11 바이트입니다.
Jonathan Allan

문제 없습니다. 어쩌면 Erik은 2, 1은 나에게 크레딧을 줄 것입니다.
Jonathan Allan

@JonathanAllan 아. 좋은 생각; 나는 그것을 할 것이다 :)
HyperNeutrino

3

루비 , 86 64 63 61 51 바이트

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

온라인으로 사용해보십시오!

느낌은 정말 길게 느낀다. 루비 전문가의 도움을 받아 조금 더 짧게 만들었습니다.


전문가는 아니지만 String 메소드 목록 을 확인하도록 영감을 얻었습니다 . .delete("_-")더 짧습니다.
Ørjan Johansen

f[x]f.call(x)스테 비 람다가 관련된 경우 항상 올바른 대체입니다 .
Value Ink

@ValueInk 감사합니다! Stack Overflow 답변을 기반으로 Ruby에서 골프를 치는 방법을 알아 내려고 노력했기 때문에 이것이 옵션이라는 것을 몰랐습니다.
밀 마법사

3

C ++, 288248 바이트

Zacharý 덕분에 -5 바이트

#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 ++에서 int를 bool로 캐스팅하는 규칙이int_var!=0


;의 정의 뒤에 a 를 추가하십시오 F. 그런 다음 첫 번째 return문을로 변경하십시오 return 0;E(a,45)E(b,45)E(a,95)E(b,95)F(a)F(b).
Zacharý

2

CJam, 20 바이트

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

[ "string1", "string2"] 형식으로 입력을받습니다.

온라인으로 사용해보십시오 (테스트 버전)

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

하스켈 , 85 78 76 71 68 바이트

Ørjan Johansen 덕분에 2 바이트 절약

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

온라인으로 사용해보십시오!

빈 문자열에 오류가 있습니다.


all(/=a)"-_". 또한 최신 편집 후 f운영자가되어야합니다.
Ørjan Johansen

@ ØrjanJohansen 아 감사합니다. 나는 더 짧은 방법이 있다고 생각 notElem했지만 내 인생에서 그것을 기억하지 못했습니다.
밀 마법사


2

엑셀, 105 바이트

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

CODE ()는 첫 문자의 숫자 코드를 반환합니다.

Excel에서 문자열 비교는 대소 문자를 구분하지 않습니다.


2

껍질 , 13 바이트

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

온라인으로 사용해보십시오!

각 문자열에 대해 문자열의 첫 문자와 전체 문자열을 소문자로 구성하고-/ _를 모두 제거하여 한 쌍을 만듭니다. 그런 다음 두 쌍이 같은지 확인합니다.

-특이점은 Husk에서 차이가 설정 된다는 것 입니다 (즉, 처음 발견 된 항목 만 제거함). 모든 발생을 제거하기 위해의 고정 점은 -"-_로 발견됩니다 ω-"-_.


2

Japt , 14 25 바이트

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

단어 1에서 단어 2의 모든 문자를 제거하고 문자를 제거하여 대소 문자를 구분하지 않는 문자열 동등성을 검사 -_합니다. ""단어가 같으면 빈 문자열 ( )이됩니다.
이 문제를 지적한 Ørjan Johansen에게 감사드립니다.

첫 번째 문자가 같은지, 제거 후 대문자 입력이 같은지 확인합니다 _-.

온라인으로 사용해보십시오!

설명

암시 적 입력 : UV입력 문자열은

g ¥Vg

U(암시 적 ¥)의 첫 문자가의 첫 번째 문자 ( ) 와 같은지 확인하십시오 V.

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

그리고 ( ©)가 U대문자 ( u)이고 _-제거 된 ( k)이 ( ¥)와 같은지 확인하십시오 V. 부울 결과를 내재적으로 리턴합니다.


링크를 작동시킬 수는 없지만 잘못된 설명처럼 들립니다. 그것은 무엇을주지 않는 testtset?
Ørjan Johansen

@ ØrjanJohansen 좋은 지적은 ... 그 경우에는 실패 할 것입니다. 링크는 테스트를 거쳤으며 정상적으로 작동합니다.
저스틴 마리너

예, 링크는 내 잘못입니다. 요즘에는 최신 브라우저로 변경해야합니다. 나는 그것을 온라인
Ørjan Johansen

@ ØrjanJohansen 사용중인 브라우저를 물어볼 수 있습니까? CodePen을 개선하는 과정에 있으며 TIO와 호환되도록하고 싶습니다.
저스틴 마리너

기침은 여전히 Internet Explorer를 사용하고 있습니다.
Ørjan Johansen


1

펄 5 , 67 바이트

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

온라인으로 사용해보십시오!

식별자를 별도의 줄에 입력으로 사용합니다.

설명:

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

, 29 바이트

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

온라인으로 사용해보십시오!

이것은 -진실을 위해 인쇄하고 거짓을 위해 아무것도 인쇄 하지 않습니다.

자세한 버전으로 연결합니다 . 먼저 두 입력 문자열 ( ⁼§θ⁰§η⁰) 의 첫 문자 를 비교 한 다음 밑줄과 하이픈 ( ⪫⪪⪫⪪θ_ω-ω) 을 제거하고 소문자 ( ) 로 변환 한 후 나머지 두 문자열을 비교합니다 .


1

C #, 101 89 바이트

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

@ kusi581 덕분에 12 바이트를 절약했습니다.


로컬 함수를 사용 string.Concat(...)하면 2 바이트를 절약 할 수 있습니다.)
kusi581

1
@ kusi581 감사합니다. 12 바이트가 절약되었습니다.
TheLethalCoder



1

C (gcc) , 126114 바이트

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

온라인으로 사용해보십시오!

공백과 주석으로 :

#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')
}

질문은 ASCII 인쇄 가능 항목을 지정하므로 (1) 첫 번째 while테스트를로 단축 할 수 있습니다 *s%50==45. (2) 그러나 소문자가 잘못되었습니다 (예 : t~대 소문자 오류) t^.
Ørjan Johansen

@ ØrjanJohansen 입력이 모두 유효한 식별자라고 가정 할 수 있다고 생각했습니다. 그러나 그 예가 >추가되었습니다.
aschepler

허. 나도 그 예를 들었다. Nim 매뉴얼 에서 지금 볼 수도 -있지만 실제로는 허용되지 않지만 알고리즘에는 여전히 포함되어 있습니다.
Ørjan Johansen

@ ØrjanJohansen 그래, 나는 -식별자에 대한 문법 설명에없는 것으로 나타 났지만 그 문서의 다른 부분은 그것이 허용된다는 것을 암시한다.
aschepler

1

Dyalog APL, 47 32 28 27 26 22 바이트

Kritixi Lithos 덕분에 -4 바이트

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

문자열 목록으로 입력을받습니다.

온라인으로 사용해보십시오!

방법?

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

⊃⍺=⍵대신 당신이 대신 할 수 있다고 생각합니다⍺[1]=⍵[1]
Kritixi Lithos

인수의 길이가 다를 수 있기 때문에 아닙니다!
Zacharý

1
이 경우에 ⊃⍵대신 ⍵[1]작동해야합니다
Kritixi Lithos

1
아마 그 ⊃⍺=⊃⍵대신⍺[1]=⍵[1]
Kritixi Lithos

1

공통 리스프, 98 바이트

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

온라인으로 사용해보십시오!

Ungolfed (슈퍼 솔직!) 버전 :

(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 바이트

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

두 개의 문자열 목록으로 입력을받는 익명 함수. R의 문자열 연산은 문자 수가 상당히 길지만 벡터화된다는 사실을 이용합니다. 또한 괄호로 대입을 줄 바꿈하면 변수가 바인드되므로 (g=substr(l,1,1))나중에 다시 사용할 수 있도록 변수를 유지합니다 h.

R은 마지막으로 평가 된 표현식을 함수 출력으로 리턴합니다.

언 골프 드 :

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

온라인으로 사용해보십시오! (모든 테스트 사례)


1

Brachylog , 17 바이트

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

온라인으로 사용해보십시오!

술어 성공 / 실패를 통한 출력.

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

얼랭 113 바이트

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

두 목록을 비교하는 한 쌍의 익명 함수 erlang 쉘에 붙여 넣기를 의미합니다.

더 읽기 쉬운 :

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

클립 , 25 바이트

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

설명 :

x, y그리고 z암시 적으로 3 개 개의 입력까지 걸릴 수있는 클립 프로그램에서 참조 할 수있다. 이 때문에 프로그램만을 참조 x하고 y, 그에게 할당 된 두 개의 입력 얻어 xy.

 =(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 '_'

표준 입력, 출력 10각각 true 및 false 에서 두 개의 문자열을 가져옵니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.