Чи ці ідентифікатори рівноцінні?


20

У мові Nim правила розмежування ідентифікаторів дещо спокійніше, ніж у більшості інших мов. Два ідентифікатори еквівалентні або адресують одну і ту ж змінну, якщо вони дотримуються цих правил :

  • перший символ обох однаковий (залежно від регістру)
  • обидва рядки однакові (регістр у чутливому) після видалення всіх екземплярів символів -і_

Виклик

Напишіть програму / функцію, яка містить два рядки, що представляють ідентифікатори Nim та виводять значення truthy або falsey, залежно від того, чи вони еквівалентні правилам, наведеним вище.

Технічні умови

  • Застосовуються стандартні правила вводу / виводу .
  • Стандартні лазівки будуть заборонені .
  • Рядки містять лише друковані файли ASCII . Вам не потрібно перевіряти, чи це дійсний ідентифікатор.
  • Рядки можуть сприйматися як два окремі входи, список рядків тощо (ви знаєте свердло)
  • Порожні рядки не потрібно обробляти.
  • Вихідні дані повинні відповідати як значенням truthy, так і фальси.
  • Ця проблема полягає не в пошуку найкоротшого підходу на всіх мовах, а в пошуку найкоротшого підходу в кожній мові .
  • Ваш код буде набраний у байтах , як правило, в кодуванні 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

Реалізація нестворених посилань

Про це написано в самому Німі.

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"), оскільки, думаю, одна відповідь дає несподіваний результат для цього.
Ørjan Johansen

@ ØrjanJohansen Готово.
повністюлюдсько

Зачекайте, тому вхід - це рядки, які "представляють ідентифікатори Nim", і нам "не потрібно перевіряти, чи це дійсний ідентифікатор", але тоді один із прикладів містить >?
aschepler

Відповіді:


7

JavaScript (ES6), 62 61 байт

Збережено 1 байт завдяки @JohanKarlsson

Здійснює введення в синтаксис currying (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'-_')]

Спробуйте в Інтернеті!

-1 байт завдяки нежаганським
-3 байтам завдяки майстру пшениці



@notjagan Акуратний трюк; Спасибі!
HyperNeutrino

@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.
Аднан

@Adnan І я знав, що існує спосіб. Спасибі!
Ерік Аутгольфер

11 байт, якщо ви перейдете SKна м.
Кевін Кройсейсен

@KevinCruijssen Хм, я оновлю цю відповідь. Я не думаю, що мтоді існувало. : P
Ерік Аутгольфер

3

Желе , 11 байт

ḟ⁾-_Œl,Ḣµ€E

Спробуйте в Інтернеті!

-2 байта завдяки Еріку Перевершив
-1 байт завдяки Джонатану Аллану


Візьміть список з двох рядків типу ["symbolsAre_too>_>", "symbols_areTOO>>"]та використовуйте Ḣ;ḟ⁾-_Œl$µ€Eзамість -2. Бий того піта!
Erik the Outgolfer

... або навіть просто ḟ⁾-_Œl,Ḣµ€Eна 11 байт.
Джонатан Аллан

Без проблем, можливо, кредитуйте Еріку за 2, а я за 1 :)
Джонатан Аллан

@JonathanAllan Ah. Гарна ідея; Я зроблю це :)
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)коли задіяні стійкі лямбда.
Значення чорнила

@ValueInk Дякую! Я намагався розібратися в гольфі в Рубі, грунтуючись на відповідях на стек переповнення, тому не знав, що це варіант.
Пшеничний майстер

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 to boolint_var!=0


Додайте ;після визначення значення 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

Haskell , 85 78 76 71 68 байт

2 байти збережено завдяки Ørjan Johansen

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

Excel, 105 байт

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

CODE () повертає числовий код першого символу.

Порівняння рядків у Excel є нечутливим до регістру.


2

Лушпиння , 13 байт

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

Спробуйте в Інтернеті!

Побудує для кожного рядка пару, що складається з першого символу рядка та всієї рядка з нижнього регістру та з усіма входженнями - / _ видалено. Потім перевіряє, чи дві пари рівні.

Особливістю є те, що -в Хуску встановлюється різниця (тобто вона видаляє лише перше знайдене виникнення): для того, щоб видалити всі події, фіксується точка -"-_з ω-"-_.


2

Japt , 14 25 байт

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

Перевіряє рівність нечутливих до регістру рядків, видаляючи всі символи слова 2 із слова 1 та видаляючи -_символи; виходить порожній рядок ( ""), якщо слова рівні.
Дякую Ørjan Johansen за вказівку на проблему.

Перевіряє рівність першої лінійки та якщо великі входи після вилучення є рівними _-.

Спробуйте в Інтернеті!

Пояснення

Неявний вхід: Uі Vє вхідними рядками

g ¥Vg

Перевірте, чи перша буква U(неявна) дорівнює ( ¥) першій символіці V.

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

І ( ©) перевірте, якщо U, з великого розміру ( u) і з _-вилученим ( k), дорівнює ( ¥) те саме для V. Неодмінно повертайте бульний результат.


Я не можу отримати посилання на роботу, але це пояснення звучить так, що це робить не так. Що це дає testпроти tset?
Ørjan Johansen

@ ØrjanJohansen Добрий момент ... це не вдасться в цьому випадку. Що стосується посилання, я перевірив його, і він прекрасно працює.
Джастін Марінер

Так, посилання - це я сама винна - днями мені потрібно перейти на сучасний браузер. Мені пощастило з Спробуйте в Інтернеті!
Ørjan Johansen

@ ØrjanJohansen Чи можу я запитати, який браузер ви використовуєте? Я зараз вдосконалюю цей CodePen і хотів би зробити його таким же сумісним, як TIO.
Джастін Марінер

кашель до сих пір з допомогою Internet Explorer.
Ørjan Johansen


1

Perl 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 байт

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

Спробуйте в Інтернеті!

Це друкує -формулу "truthy" і нічого для "falsey".

Посилання на багатослівну версію . Спочатку порівнюється перший символ обох вхідних рядків ( ⁼§θ⁰§η⁰), а потім порівнюється решта обох рядків після видалення підкреслення та дефісів ( ⪫⪪⪫⪪θ_ω-ω) та перетворення в малі ( ).


1

C #, 101 89 байт

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

Збережено 12 байт завдяки @ kusi581.


якщо ви використовуєте локальну функцію, string.Concat(...)ви можете зберегти 2 байти;)
kusi581

1
@ kusi581 Спасибі, збережено 12 байт.
TheLethalCoder



1

C (gcc) , 126 114 байт

#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) Проте, lowercasing неправильно, наприклад , він не буде працювати на t~VS. t^.
Ørjan Johansen

@ ØrjanJohansen Я думав, що ми можемо припустити, що входи є обома дійсними ідентифікаторами. Але тоді цей приклад із >додано, хм.
асчеплер

Ага. Я йшов за цим прикладом. Дивлячись зараз у посібник по Німу , навіть -насправді це не дозволено, але алгоритм все одно включає його ...
Ørjan Johansen

@ ØrjanJohansen Так, я помітив, що -це не в граматичному описі ідентифікатора - але тоді інші частини цього документа означають, що це дозволено.
aschepler

1

Діялог АПЛ, 47 32 28 27 26 22 байт

-4 байти завдяки Kritixi Lithos

{(=/⊃¨⍵)∧≡/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)))))

Спробуйте в Інтернеті!

Безголівкова (супер прямо!) Версія:

(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])
}

Спробуйте в Інтернеті! (усі тестові випадки)



0

Erlang 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.

пара анонімних функцій, які порівнюють два списки. означав бути наклеєним в оболонку ерланг.

більш читабельний:

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може посилатися в програмі Clip, щоб неявно взяти до трьох входів. З допомогою цієї програми лише посилання xі yвона приймає два входи , які призначені на xі 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 '_'

Бере два рядки зі стандартного вводу, виводу 1та 0для true та false відповідно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.