Apakah pengidentifikasi ini setara?

20

Dalam bahasa Nim , aturan untuk membedakan pengidentifikasi sedikit lebih santai daripada kebanyakan bahasa lainnya. Dua pengidentifikasi setara atau alamat variabel yang sama jika mereka mengikuti aturan ini :

  • karakter pertama keduanya sama (case sensitive)
  • kedua string adalah sama (kasus di sensitive) setelah menghapus semua contoh dari karakter -dan_

Tantangan

Tulis program / fungsi yang mengambil dua string yang mewakili pengidentifikasi Nim dan menghasilkan nilai kebenaran atau falsey berdasarkan pada apakah mereka setara dengan aturan di atas.

Spesifikasi

  • Aturan I / O standar berlaku .
  • Celah standar yang dilarang .
  • String hanya akan berisi printable ASCII . Anda tidak perlu memeriksa apakah itu pengidentifikasi yang valid.
  • String dapat diambil sebagai dua input terpisah, daftar string, dll. (Anda tahu bornya)
  • String kosong tidak perlu ditangani.
  • Keluaran harus konsisten untuk nilai-nilai kebenaran dan falsey.
  • Tantangan ini bukan tentang menemukan pendekatan terpendek dalam semua bahasa, melainkan tentang menemukan pendekatan terpendek dalam setiap bahasa .
  • Kode Anda akan dinilai dalam byte , biasanya dalam pengkodean UTF-8, kecuali ditentukan lain.
  • Fungsi built-in yang melakukan tugas ini diizinkan tetapi termasuk solusi yang tidak bergantung pada built-in dianjurkan.
  • Penjelasan, bahkan untuk bahasa "praktis", dianjurkan .

Uji kasus

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

Implementasi referensi tidak dikumpulkan

Ini ditulis dalam Nim, itu sendiri.

import strutils, re

proc sameIdentifier(a, b: string): bool =
  a[0] == b[0] and
    a.replace(re"_|–", "").toLower == b.replace(re"_|–", "").toLower
benar-benar manusiawi
sumber
3
Saya menyarankan uji kasus f("_test", "test").
Gagang pintu
@Doorknob Ditambahkan.
totallyhuman
1
Saya sarankan menambahkan f("test", "tset"), karena saya pikir satu jawaban memberikan hasil yang tidak terduga.
Ørjan Johansen
@ ØrjanJohansen Selesai.
manusiawi
Tunggu, jadi input adalah string yang "mewakili pengidentifikasi Nim", dan kami "tidak perlu memeriksa apakah itu pengidentifikasi yang valid", tetapi kemudian salah satu contohnya berisi >?
aschepler

Jawaban:

7

JavaScript (ES6), 62 61 byte

Disimpan 1 byte berkat @JohanKarlsson

Mengambil input dalam sintaks currying (a)(b). Mengembalikan boolean.

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

Uji kasus

Arnauld
sumber
1
/-|_/gmenghemat satu byte
Johan Karlsson
6

Python 3 , 76 byte

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

Cobalah online!

-1 byte terima kasih kepada notjagan
-3 byte terima kasih kepada Wheat Wizard

HyperNeutrino
sumber
-1 byte.
notjagan
@notjagan Trik rapi; Terima kasih!
HyperNeutrino
@ notjagan Saya tidak tahu Anda bisa melakukan itu, tapi saya rasa itu masuk akal, keren
Stephen
-14 byte!
notjagan
1
bahkan lebih pendek
Wheat Wizard
4

Sebenarnya , 15 byte

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

Cobalah online!

Fakta menyenangkan: ini bekerja dengan sejumlah input (selalu menghasilkan kebenaran dengan kurang dari 2 input).

Penjelasan:

⌠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
sumber
3

Pyth , 13 byte

qFm[hd-r0d"-_

Cobalah online!

Penjelasan

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
sumber
3

05AB1E , 12 byte

εćs„-_SKl«}Ë

Cobalah online!

-1 terima kasih kepada Adnan .

Secara teoritis, εćs„-_-«}Ëseharusnya sudah bekerja selama 10 byte, tetapi sayangnya perilaku ini sudah usang untuk saat ini.

Erik the Outgolfer
sumber
Oh ya lol, aku masih harus memperbaikinya. Anda dapat menyimpan byte dengan menggunakan „-_SKalih-alih '-K'_K.
Adnan
@ Adnan Dan aku tahu ada jalan. Terima kasih!
Erik the Outgolfer
11 byte jika Anda berubah SKmenjadi м.
Kevin Cruijssen
@KevinCruijssen Hm, saya akan memperbarui jawaban ini. Saya tidak berpikir мada saat itu. : P
Erik the Outgolfer
3

Jelly , 11 byte

ḟ⁾-_Œl,Ḣµ€E

Cobalah online!

-2 byte terima kasih kepada Erik the Outgolfer
-1 byte terima kasih kepada Jonathan Allan

HyperNeutrino
sumber
Ambil daftar dua string seperti ["symbolsAre_too>_>", "symbols_areTOO>>"]dan gunakan Ḣ;ḟ⁾-_Œl$µ€Esebagai ganti untuk -2. Kalahkan Pyth itu!
Erik the Outgolfer
... atau bahkan hanya ḟ⁾-_Œl,Ḣµ€Euntuk 11 byte.
Jonathan Allan
Tidak masalah, mungkin kredit Erik untuk 2 dan saya untuk 1 :)
Jonathan Allan
@ Jonathan Allan Ah. Ide bagus; Saya akan melakukannya :)
HyperNeutrino
3

Ruby , 86 64 63 61 51 byte

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

Cobalah online!

Ini terasa sangat lama masih terasa agak lama. Saya akan menghargai bantuan setiap guru Ruby di luar sana dalam membuat ini setidaknya sedikit lebih pendek.

Wisaya Gandum
sumber
Bukan seorang guru, tetapi saya terinspirasi untuk memeriksa daftar metode String . .delete("_-")lebih pendek.
Ørjan Johansen
f[x]selalu merupakan substitusi yang valid untuk f.call(x)ketika lambdas yang terlibat terlibat.
Nilai Tinta
@ Nilai, terima kasih! Saya sudah mencoba mencari cara bermain golf di Ruby berdasarkan jawaban Stack Overflow, jadi saya tidak tahu itu pilihan.
Wheat Wizard
3

C ++, 288 248 byte

-5 byte terima kasih kepada 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;}

Terima kasih, Preprocessor. Juga, kode ini mengambil keuntungan dari fakta bahwa dalam C ++ aturan untuk memasukkan int ke bool adalahint_var!=0

HatsuPointerKun
sumber
Tambahkan ;setelah definisi F. Kemudian, ubah returnpernyataan pertama menjadi return 0;E(a,45)E(b,45)E(a,95)E(b,95)F(a)F(b).
Zacharý
2

CJam, 20 byte

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

Mengambil input dalam bentuk ["string1", "string2"].

Cobalah Online (versi pengujian)

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

Haskell , 85 78 76 71 68 byte

2 byte disimpan berkat Ørjan Johansen

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

Cobalah online!

Kesalahan pada string kosong.

Wisaya Gandum
sumber
all(/=a)"-_". Juga setelah edit terakhir Anda, fperlu menjadi operator.
Ørjan Johansen
@ ØrjanJohansen Ah terima kasih. Saya pikir ada cara yang lebih pendek untuk dilakukan, notElemtetapi saya tidak dapat mengingatnya selama hidup saya.
Wheat Wizard
2

Python 2 , 72 byte

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

Cobalah online!

Tidak akan bekerja dengan Python 3 karena translatesintaks baru .

jferard
sumber
2

Excel, 105 byte

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

CODE () mengembalikan kode numerik karakter pertama.

Perbandingan string di Excel tidak peka huruf besar-kecil.

Wernisch
sumber
2

Sekam , 13 byte

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

Cobalah online!

Dibangun untuk setiap string, sepasang yang terdiri dari karakter pertama dari string dan seluruh string lebih kecil dan dengan semua kemunculan - / _ dihapus. Kemudian periksa apakah kedua pasangan sama.

Sebuah kekhususan adalah bahwa -di Husk adalah set perbedaan (yakni menghapus hanya kejadian pertama ditemukan): untuk menghapus semua kejadian, titik tetap -"-_ditemukan dengan ω-"-_.

Leo
sumber
2

Japt , 14 25 byte

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

Memeriksa kesetaraan string case-insensitive dengan menghapus semua karakter dalam kata 2 dari kata 1, dan menghapus -_karakter; yang menghasilkan string kosong ( "") jika kata-katanya sama.
Terima kasih Ørjan Johansen karena menunjukkan masalah dengan ini.

Memeriksa kesetaraan karakter pertama dan apakah input huruf besar sama setelah menghapus _- .

Cobalah online!

Penjelasan

Input implisit: Udan Vmerupakan string input

g ¥Vg

Periksa apakah huruf pertama dari U(implisit) sama dengan ( ¥) karakter pertama dari V.

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

Dan ( ©) periksa apakah U, huruf besar ( u) dan dengan _-dihapus ( k), sama dengan ( ¥) sama untuk V. Secara implisit kembalikan hasil boolean.

Justin Mariner
sumber
Saya tidak dapat membuat tautannya berfungsi, tetapi penjelasan itu kedengarannya salah. Apa yang diberikannya testvs tset?
Ørjan Johansen
@ ØrjanJohansen Poin bagus ... itu akan gagal untuk kasus itu. Adapun tautannya, saya sudah mengujinya dan berfungsi dengan baik.
Justin Mariner
Ya tautannya adalah kesalahan saya sendiri - suatu hari saya perlu mengubah ke browser modern. Saya lebih beruntung dengan Coba online!
Ørjan Johansen
@ ØrjanJohansen Bisakah saya bertanya browser apa yang Anda gunakan? Saya sedang dalam proses meningkatkan CodePen itu dan ingin membuatnya kompatibel dengan TIO.
Justin Mariner
batuk masih menggunakan Internet Explorer.
Ørjan Johansen
1

Python 2 , 79 73 byte

-6 byte terima kasih kepada @notjagan: periksa panjang himpunan semua nama yang dikurangi adalah 1 atau tidak.

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

Cobalah online!

officialaimm
sumber
2
-6 byte.
notjagan
Tentu saja, set, aku lupa keberadaannya !! Terima kasih banyak!!
officialaimm
1

Perl 5 , 67 byte

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

Cobalah online!

Mengambil pengidentifikasi sebagai input pada saluran yang berbeda.

Penjelasan:

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
sumber
1

Arang , 29 byte

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

Cobalah online!

Ini mencetak -untuk kebenaran dan tidak untuk falsey.

Tautan ke versi verbose . Pertama membandingkan karakter pertama dari kedua string input ( ⁼§θ⁰§η⁰) dan kemudian membandingkan sisa kedua string setelah menghapus garis bawah dan tanda hubung ( ⪫⪪⪫⪪θ_ω-ω) dan mengkonversi ke huruf kecil ( ).

Charlie
sumber
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
sumber
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
sumber
1

Pyke, 13 bytes

F'hl1"-_"-)Xq

Try it online!

F         )   -  for i in input():
 'hl1         -   i[0], i.lower()
     "-_"-    -         ^.remove("-_")
           Xq - equal(^)
Blue
sumber
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
sumber
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ý
sumber
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
sumber
1

R, 76 bytes

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

Fungsi anonim yang mengambil input sebagai daftar dua string. Mengambil keuntungan dari kenyataan bahwa operasi string R, walaupun cukup lama dalam # karakter, adalah vektor. Selain itu, membungkus suatu tugas dalam tanda kurung akan mengikat variabel, jadi (g=substr(l,1,1))simpan variabel yang akan digunakan kembali nanti di baris dan juga untuk h.

R mengembalikan ekspresi yang terakhir dievaluasi sebagai output fungsi.

Tidak Terkumpul:

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

Cobalah online! (semua kasus uji)

Giuseppe
sumber
1

Brachylog , 17 byte

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

Cobalah online!

Keluaran melalui keberhasilan / kegagalan predikat.

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 yang tidak terkait
sumber
0

Erlang 113 byte

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

sepasang fungsi anonim yang membandingkan kedua daftar. dimaksudkan untuk ditempelkan di kulit erlang.

lebih mudah dibaca:

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
sumber
0

Klip , 25 byte

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

Penjelasan :

x, ydan zdapat dirujuk dalam program Klip untuk secara implisit mengambil hingga tiga input. Karena program ini hanya referensi xdan y, dibutuhkan dua input yang ditugaskan untuk xdan 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 '_'

Mengambil dua string dari input standar, output 1dan 0untuk true dan false masing-masing.

bcsb1001
sumber