Эти идентификаторы эквивалентны?


20

В языке Nim правила различения идентификаторов немного более мягкие, чем в большинстве других языков. Два идентификатора эквивалентны или обращаются к одной и той же переменной, если они следуют этим правилам :

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

Вызов

Напишите программу / функцию, которая принимает две строки, которые представляют идентификаторы Nim, и выводит истинное или ложное значение в зависимости от того, эквивалентны они или нет по приведенным выше правилам.

Характеристики

  • Применяются стандартные правила ввода / вывода .
  • Стандартные лазейки будут запрещены .
  • Строки будут содержать только печатные формы 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 Добавлено.
полностью человек

1
Я предлагаю добавить f("test", "tset"), так как я думаю, что один ответ дает неожиданный результат для него.
Орджан Йохансен

@ ØrjanJohansen Готово.
полностью человек

Подождите, поэтому входные данные представляют собой строки, которые "представляют идентификаторы Nim", и нам "не нужно проверять, является ли это действительным идентификатором", но тогда один из примеров содержит >?
aschepler

Ответы:


7

JavaScript (ES6), 62 61 байт

Сохранено 1 байт благодаря @JohanKarlsson

Принимает ввод в синтаксисе карри (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 байт благодаря notjagan
-3 байт благодаря Wheat Wizard



@ Notjagan Аккуратный трюк; Благодарность!
HyperNeutrino

@ notjagan Я не знал, что ты мог бы сделать это, но я думаю, что это имеет смысл, круто
Стивен



4

На самом деле 15 байтов

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

Попробуйте онлайн!

Интересный факт: это работает с любым количеством входов (оно всегда возвращает true для менее чем 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
Эрик Outgolfer

3

Желе , 11 байт

ḟ⁾-_Œl,Ḣµ€E

Попробуйте онлайн!

-2 байта благодаря Эрику Аутгольферу
-1 байту благодаря Джонатану Аллану


Возьмите список из двух строк, как ["symbolsAre_too>_>", "symbols_areTOO>>"]и используйте Ḣ;ḟ⁾-_Œl$µ€Eвместо -2. Побей этого Пифта!
Эрик Outgolfer

... или даже только ḟ⁾-_Œl,Ḣµ€Eна 11 байтов.
Джонатан Аллан

Нет проблем, может быть, кредит Эрика на 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 . .delete("_-")короче
Орджан Йохансен,

f[x]всегда является допустимой заменой, f.call(x)когда речь идет о лямбда-пота.
Стоимость чернил

@ValueInk Спасибо! Я пытался понять, как играть в гольф в Ruby, основываясь на ответах Stack Overflow, поэтому я не знал, что это был вариант.
Пшеничный волшебник

3

С ++, 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 к boolint_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

Хаскелл , 85 78 76 71 68 байт

2 байта сохранены благодаря Эрджану Йохансену

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

Попробуйте онлайн!

Ошибки в пустой строке.


all(/=a)"-_", Также после вашего последнего редактирования, fдолжен стать оператором.
Орджан Йохансен

@ ØrjanJohansen Ах, спасибо. Я думал, что есть более короткий способ сделать это, notElemно я не мог вспомнить это на всю жизнь.
Пшеничный волшебник


2

Excel, 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"_-"

Проверяет равенство строк без учета регистра, удаляя все символы в слове 2 из слова 1 и удаляя -_символы; это приводит к пустой строке ( ""), если слова равны.
Спасибо Орджану Йохансену за указание на проблему с этим.

Проверяет равенство первого символа и совпадают ли входные данные в верхнем регистре после удаления _-.

Попробуйте онлайн!

объяснение

Неявный ввод: Uи Vявляются входными строками

g ¥Vg

Проверьте, Uравна ли первая буква (неявного) ( ¥) первому символу V.

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

И ( ©) проверяет U, одинаковы ли в верхнем регистре ( u) и с _-удаленным ( k), равно ( ¥) V. Неявно вернуть логический результат.


Я не могу получить ссылку на работу, но это объяснение звучит так, как будто оно не так. Что это дает для testпротив tset?
Орджан Йохансен

@ ØrjanJohansen Хорошая мысль ... в этом случае ничего не получится. Что касается ссылки, я проверил ее, и она отлично работает.
Джастин Маринер

Да, ссылка - моя собственная ошибка - на днях мне нужно перейти на современный браузер. Мне повезло больше с Try it online!
Орджан Йохансен

@ ØrjanJohansen Могу я спросить, какой браузер вы используете? Я нахожусь в процессе улучшения этого CodePen и хотел бы сделать его таким же совместимым, как TIO.
Джастин Маринер

кашлять все еще с помощью Internet Explorer.
Орджан Йохансен


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

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

Попробуйте онлайн!

Это печатает -для правды и ничего для фальси.

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


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^.
Орджан Йохансен,

@ ØrjanJohansen Я думал, что мы можем предположить, что входные данные были действительными идентификаторами. Но затем >был добавлен этот пример с , хм.
Ашеплер

Да. Я тоже шел по этому примеру. Глядя сейчас в руководстве по Nim , даже на -самом деле это не разрешено, но алгоритм все еще включает его ...
Орджан Йохансен,

@ Ø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

Нет, потому что аргументы могут быть разной длины!
Захари

1
В таком случае ⊃⍵вместо ⍵[1]должен работать
Kritixi Lithos

1
Может быть, даже ⊃⍺=⊃⍵вместо⍺[1]=⍵[1]
Kritixi Lithos

1

Common Lisp, 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 возвращает последнее вычисленное выражение как вывод функции.

Ungolfed:

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.

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

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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.