これらの識別子は同等ですか?


20

言語Nimでは、識別子を区別するための規則は、他のほとんどの言語よりもわずかに緩和されています。これらのルールに従う場合、2つの識別子は同等であるか、同じ変数に対応します

  • 両方の最初の文字は同じです (大文字と小文字が区別されます)
  • 両方の文字列が同じである(場合敏感な)除去した後、すべてのインスタンスの文字を-_

チャレンジ

Nim識別子を表す2つの文字列を受け取り、上記のルールで同等であるかどうかに基づいてtrueまたはfalseの値を出力するプログラム/関数を作成します。

仕様書

  • 標準のI / Oルールが 適用されます
  • 標準的な抜け穴禁止されています。
  • 文字列にはASCII印刷可能文字のみが含まれます。あなたはしていない、それは有効な識別子だかどうかを確認する必要があります。
  • 文字列は、2つの個別の入力、文字列のリストなどとして使用できます(ドリルを知っています)。
  • 空の文字列を処理する必要はありません。
  • 出力、真偽値と偽値の両方で一貫している必要があります。
  • この課題は、すべての言語で最短のアプローチを見つけることではなく、各言語で最短のアプローチを見つけることです
  • あなたのコードがされるバイト数で得点特に指定がない限り、通常はエンコーディング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

Ungolfedリファレンス実装

これは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が追加されました。
完全に人間

1
を追加することをお勧めしf("test", "tset")ます。1つの答えが予想外の結果をもたらすと思うからです。
Ørjanヨハンセン

@ØrjanJohansen完了。
完全に人間

入力は「Nim識別子を表す」文字列であるため、「有効な識別子であるかどうかを確認する必要はありません」が、例の1つに>
アシェプラー

回答:


7

JavaScript(ES6)、62 61バイト

@JohanKarlssonのおかげで1バイト節約

カリー化構文の入力を受け取ります(a)(b)。ブール値を返します。

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

テストケース


1
/-|_/gバイトを保存
ヨハンカールソン

6

Python 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バイト
小麦ウィザードのおかげで-3バイト



@notjaganきちんとしたトリック; ありがとう!
ハイパーニュートリノ

私はあなたがそれを行うことができます知りませんでしたが、私はそれが理にかなっていると思い、冷却@notjagan
スティーブン



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«}Ë

オンラインでお試しください!

-1 アドナンのおかげます。

理論的にεćs„-_-«}Ëは、10バイトで動作するはずでしたが、残念ながら、この動作は今のところ非推奨です。


そうそう、私はまだそれを修正する必要があります。の„-_SK代わりにを使用してバイトを保存できます'-K'_K
アドナン

@アドナンそして、私は方法があることを知っていました。ありがとう!
エリックアウトゴルファー

に変更SKする場合は11バイトм
ケビンCruijssen

@KevinCruijssen Hm、この答えを更新します。м当時は存在していなかったと思います。:P
エリック・ザ・アウトゴルファー

3

ゼリー、11バイト

ḟ⁾-_Œl,Ḣµ€E

オンラインでお試しください!

Erik the Outgolferのおかげで2バイト
ジョナサンアランのおかげで-1バイト


のような2つの文字列のリストを取得し、代わりに-2 ["symbolsAre_too>_>", "symbols_areTOO>>"]を使用しますḢ;ḟ⁾-_Œl$µ€E。そのPythを打ち負かす!
エリックアウトゴルファー

...またはḟ⁾-_Œl,Ḣµ€E11バイトでも。
ジョナサンアラン

問題ありません、おそらく2をエリックに、1を私にクレジットしてください:)
ジョナサンアラン

@JonathanAllanああ。良いアイデア; 私はそれをやる:)
HyperNeutrino

3

ルビー86 64 63 61 51バイト

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

オンラインでお試しください!

これは本当に長く感じますが、それでも少し長く感じます。これを少なくとも少し短くするために、Rubyの達人の助けをいただければ幸いです。


第一人者ではありませんが、String method listを確認することに触発されました。.delete("_-")短いです。
Ørjanヨハンセン

f[x]f.call(x)スタビーラムダが関係する場合は、常に有効な代替です。
値インク

@ValueInkありがとう!Stack Overflowの回答に基づいてRubyでゴルフをする方法を見つけようとしていたので、それがオプションだとは知りませんでした。
小麦ウィザード

3

C ++、288 248バイト

ザカリーのおかげで-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


;の定義の後にを追加しFます。次に、最初のreturnステートメントをに変更しreturn 0;E(a,45)E(b,45)E(a,95)E(b,95)F(a)F(b)ます。
ザカリー

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

Haskell85 78 76 71 68バイト

ØrjanJohansenのおかげで2バイト節約

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

オンラインでお試しください!

空の文字列のエラー。


all(/=a)"-_"。また、最新の編集の後f、オペレーターになる必要があります。
Ørjanヨハンセン

@ØrjanJohansenああありがとう。もっと短い方法があると思いましたが、notElem私の人生でそれを思い出せませんでした。
小麦ウィザード


2

Excel、105バイト

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

CODE()は、最初の文字の数値コードを返します。

Excelの文字列比較では大文字と小文字が区別されません。


2

、13バイト

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

オンラインでお試しください!

各文字列に対して、文字列の最初の文字と小文字の文字列全体から成るペアを構築し、-/ _のすべての出現を削除します。次に、2つのペアが等しいかどうかを確認します。

特殊性は-、ハスクでは差が設定されていることです(つまり、最初に見つかったもののみを削除-"-_ω-"-_ます)。


2

Japt14 25バイト

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

ワード1からワード2のすべての文字を削除し、-_文字を削除することにより、大文字と小文字を区別しない文字列の等価性をチェックします。""単語が等しい場合、空の文字列()になります。
この問題を指摘してくれたØrjanJohansenに感謝します。

最初の文字が等しいかどうか、および削除後に大文字の入力が等しいかどうかをチェックします _-た。

オンラインでお試しください!

説明

暗黙的な入力:UおよびVは入力文字列です

g ¥Vg

U(暗黙)の最初の文字が(¥)の最初の文字と等しいかどうかを確認しVます。

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

そして(©U、大文字(u)で_-削除(k)が等しいか(¥)が等しいかどうかを確認しますV。暗黙的にブール値の結果を返します。


リンクを機能させることはできませんが、その説明は間違っているようです。testvs.にtset何を与えますか?
Ørjanヨハンセン

@ØrjanJohansen良い点...その場合は失敗します。リンクに関しては、私はそれをテストしましたが、うまく動作します。
ジャスティンマリナー

ええ、リンクは私自身のせいです-最近の1つは、最新のブラウザーに変更する必要があります。オンライン
Ørjanヨハンセン

@ØrjanJohansen使用しているブラウザを聞いてもいいですか?私はそのCodePenを改善する過程にあり、TIOと同等の互換性を持たせたいと考えています。
ジャスティンマリナー

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.

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.