Bu tanımlayıcılar eşdeğer mi?


20

Nim dilinde , tanımlayıcıları ayırt etme kuralları diğer dillerden biraz daha rahattır . İki tanımlayıcı eşdeğerdir veya aşağıdaki kurallara uymaları durumunda aynı değişkeni ele alır :

  • her ikisinin de ilk karakteri aynıdır (büyük / küçük harfe duyarlı)
  • Her iki dizeleri aynıdır (vaka içinde duyarlı) çıkardıktan sonra tüm örneklerini karakterlerin -ve_

Meydan okuma

Nim tanımlayıcılarını temsil eden iki dizeyi alan bir program / işlev yazın ve yukarıdaki kurallara eşdeğer olup olmadıklarına göre doğruluk veya falsey değeri verin .

Özellikler

  • Standart I / O kuralları geçerlidir .
  • Standart boşluklar vardır yasak .
  • Dizelerde yalnızca ASCII yazdırılabilir . Bunun geçerli bir tanımlayıcı olup olmadığını kontrol etmenize gerek yoktur .
  • Teller iki ayrı giriş olarak alınabilir, tel listesi, vb. (Matkabı biliyorsunuz)
  • Boş dizelerin işlenmesi gerekmez .
  • Çıktı hem doğruluk hem de falsey değerleri için tutarlı olmalıdır .
  • Bu zorluk tüm dillerde en kısa yaklaşımı bulmak değil, her dilde en kısa yaklaşımı bulmakla ilgilidir .
  • Kodunuz , aksi belirtilmedikçe, genellikle UTF-8 kodlamasında bayt cinsinden puanlanır .
  • Bu görevi yerine getiren yerleşik işlevlere izin verilir, ancak yerleşik olmayan bir çözüm içermesi teşvik edilir.
  • "Pratik" diller için bile açıklamalar teşvik edilmektedir .

Test senaryoları

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

Kurtulmamış referans uygulaması

Bu Nim'de yazılmıştır.

import strutils, re

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

3
Ben bir test vakası öneririm f("_test", "test").
Kapı tokmağı

@Doorknob Eklendi.
totallyhuman

1
Eklemenizi öneririm f("test", "tset"), çünkü bir cevap bunun için beklenmedik bir sonuç veriyor.
Ørjan Johansen

@ ØrjanJohansen Tamamlandı.
totallyhuman

Bekleyin, bu nedenle girdi "Nim tanımlayıcılarını temsil eden" dizelerdir ve "geçerli bir tanımlayıcı olup olmadığını kontrol etmemiz gerekmez", ancak örneklerden biri içeriyor >mu?
aschepler

Yanıtlar:


7

JavaScript (ES6), 62 61 bayt

@JohanKarlsson sayesinde 1 bayt kaydedildi

Körili sözdiziminde girdi alır (a)(b). Bir boole döndürür.

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

Test senaryoları


1
/-|_/gbir bayt kaydeder
Johan Karlsson


4

Aslında 15 bayt

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

Çevrimiçi deneyin!

Eğlenceli gerçek: bu, herhangi bir sayıda girişle çalışır (2 girişten daha azı için her zaman doğruluk sağlar).

Açıklama:

⌠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 bayt

qFm[hd-r0d"-_

Çevrimiçi deneyin!

açıklama

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 bayt

εćs„-_SKl«}Ë

Çevrimiçi deneyin!

-1 Adnan sayesinde .

Teorik olarak, εćs„-_-«}Ë10 bayt için çalışmalıydı, ancak maalesef bu davranış şimdilik kullanılmıyor.


Oh evet lol, hala düzeltmem gerek. Sen kullanarak bir bayt kaydedebilirsiniz „-_SKyerine '-K'_K.
Adnan

@Adnan Ve bir yol olduğunu biliyordum. Teşekkürler!
Outgolfer Erik

11 byte değiştirmek durumunda SKetmek м.
Kevin Cruijssen

@KevinCruijssen Hm, bu cevabı güncelleyeceğim. мO zamanlar var olduğunu düşünmüyorum . : P
Outgolfer Erik

3

Jöle , 11 bayt

ḟ⁾-_Œl,Ḣµ€E

Çevrimiçi deneyin!

Outgolfer Erik sayesinde -2 bayt
Jonathan Allan sayesinde -1 bayt


Gibi iki dizenin bir listesini alın ["symbolsAre_too>_>", "symbols_areTOO>>"]ve Ḣ;ḟ⁾-_Œl$µ€Ebunun yerine -2 için kullanın . O Pyth'i yenin!
Outgolfer Erik

... hatta sadece ḟ⁾-_Œl,Ḣµ€E11 bayt için.
Jonathan Allan

Sorun değil, belki Erik 2 için 2 ve bana 1 için kredi :)
Jonathan Allan

@JonathanAllan Ah. İyi bir fikir; Bunu yapacağım :)
HyperNeutrino

3

Yakut , 86 64 63 61 51 bayt

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

Çevrimiçi deneyin!

Bu gerçekten çok uzun, yine de biraz uzun. Bunu en azından biraz daha kısaltmak için herhangi bir Ruby gurusunun yardımını takdir ediyorum.


Guru değil, ama String yöntemi listesini kontrol etmek için ilham aldım . .delete("_-")daha kısadır.
Ørjan Johansen

f[x]f.call(x)stabide lambdalar söz konusu olduğunda her zaman geçerli bir ikamedir.
Değer Mürekkebi

@ValueInk Teşekkürler! Stack Overflow cevaplarına dayanarak Ruby'de golf yapmayı anlamaya çalışıyordum, bu yüzden bunun bir seçenek olduğunu bilmiyordum.
Buğday Büyücüsü

3

C ++, 288 bayt

Zacharý sayesinde -5 bayt

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

Teşekkürler Önişlemci. Ayrıca, bu kod, C ++ 'da boole int kullanma kuralınınint_var!=0


A ;tanımına bir sonra ekleyin F. Ardından, ilk returnifadeyi olarak değiştirin return 0;E(a,45)E(b,45)E(a,95)E(b,95)F(a)F(b).
Zacharý

2

CJam, 20 bayt

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

["String1", "string2"] şeklinde girdi alır.

Çevrimiçi Deneyin (test sürümü)

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

Ørjan Johansen sayesinde 2 bayt kurtardı

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

Çevrimiçi deneyin!

Boş dizgideki hatalar.


all(/=a)"-_". Ayrıca son düzenlemenizden sonra foperatör olmanız gerekir.
Ørjan Johansen

@ ØrjanJohansen Ah teşekkürler. Yapmanın daha kısa bir yolu olduğunu düşündüm notElemama bunu hayatım boyunca hatırlayamadım.
Buğday Büyücüsü


2

Excel, 105 bayt

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

CODE (), ilk karakterin sayısal kodunu döndürür.

Excel'de dize karşılaştırması büyük / küçük harfe duyarlı değildir.


2

Kabuk , 13 bayt

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

Çevrimiçi deneyin!

Her dize için, dizenin ilk karakterinden ve tüm dize karakterlerinden oluşan ve - / _ öğelerinin tüm örneklerinin kaldırıldığı bir çift oluşturur. Ardından iki çiftin eşit olup olmadığını kontrol eder.

Bir özellik, -Kabuk'ta farkın ayarlanmış olmasıdır (yani yalnızca bulunan ilk olayı kaldırır): tüm olayları kaldırmak için, sabit noktası -"-_ile bulunur ω-"-_.


2

Japt , 14 25 bayt

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

Sözcük 2'deki tüm karakterleri sözcük 1'den kaldırarak ve -_karakterleri kaldırarak büyük / küçük harf duyarsız dize eşitliğini denetler ; ""kelimeler eşitse boş bir dize ( ) ile sonuçlanır .
Bu konudaki sorunu işaret ettiği için Ørjan Johansen'a teşekkürler.

İlk karakter eşitliğini ve kaldırıldıktan sonra büyük harfli girdilerin eşit olup olmadığını kontrol eder _- .

Çevrimiçi deneyin!

açıklama

Örtük girdi: Uve Vgirdi dizeleridir

g ¥Vg

İlk harfin U(örtük) ¥ilk karakterinin ( ) eşit olup olmadığını kontrol edin V.

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

Ve ( ©) U, uppercased ( u) ve _-remove k( ¥) ile aynı için ( ) olup olmadığını kontrol edin V. Boole sonucunu dolaylı olarak döndür.


Bağlantıyı çalıştıramadım, ama bu açıklama yanlış bir şey yapıyormuş gibi geliyor. O ne veriyor mu testvs. tset?
Ørjan Johansen

@ ØrjanJohansen İyi bir nokta ... bu davada başarısız olur. Bağlantı gelince, ben test ve iyi çalışıyor.
Justin Mariner

Evet bağlantı benim hatam - bu günlerden biri modern bir tarayıcıya geçmem gerekiyor. Ben daha şanslı vardı çevrimiçi deneyin!
Ørjan Johansen

@ ØrjanJohansen Hangi tarayıcıyı kullandığınızı sorabilir miyim? Bu CodePen'i geliştirme sürecindeyim ve TIO kadar uyumlu hale getirmek istiyorum.
Justin Mariner

Internet Explorer kullanarak hala öksürük .
Ørjan Johansen


1

Perl 5 , 67 bayt

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

Çevrimiçi deneyin!

Tanımlayıcıları ayrı satırlarda girdi olarak alır.

Açıklama:

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

Kömür , 29 bayt

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

Çevrimiçi deneyin!

Bu -doğruluk için a ve falsey için hiçbir şey yazdırmaz .

Bağlantı Ayrıntılı sürümü . İlk olarak her iki giriş dizesinin ( ⁼§θ⁰§η⁰) ilk karakterini karşılaştırır ve ardından alt çizgileri ve kısa çizgileri ( ⪫⪪⪫⪪θ_ω-ω) kaldırdıktan ve küçük harfe ( ) dönüştürdükten sonra her iki dizginin geri kalanını karşılaştırır .


1

C #, 101 89 bayt

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

@ Kusi581 sayesinde 12 bayt tasarruf edildi.


Yerel bir işlev kullanırsanız string.Concat(...)2 bayt kaydedebilirsiniz;)
kusi581

1
@ kusi581 Teşekkürler, 12 bayt kaydedildi.
TheLethalCoder



1

C (GCC) , 126 114 bayt

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

Çevrimiçi deneyin!

Boşluk ve yorumlarla:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.