ตัวระบุเหล่านี้เทียบเท่ากันหรือไม่


20

ในภาษาNimกฎสำหรับการแยกความแตกต่างตัวระบุจะค่อนข้างผ่อนคลายกว่าภาษาอื่น ๆ ส่วนใหญ่เล็กน้อย ตัวระบุสองตัวมีค่าเท่ากันหรือระบุตัวแปรเดียวกันหากทำตามกฎเหล่านี้ :

  • อักขระตัวแรกของทั้งคู่เหมือนกัน (case sensitive)
  • สตริงทั้งสองจะเหมือนกัน(กรณีในที่สำคัญ)หลังจากลบทุกกรณีของตัวละคร-และ_

ท้าทาย

เขียนโปรแกรม / ฟังก์ชั่นที่รับสองสายอักขระที่เป็นตัวแทนของตัวบ่งชี้นิ่มและส่งออกค่าจริงหรือเท็จตามว่าพวกเขาจะเทียบเท่าหรือไม่ตามกฎข้างต้น

ข้อมูลจำเพาะ

  • กฎระเบียบมาตรฐาน I / O ใช้
  • ช่องโหว่มาตรฐานจะต้องห้าม
  • สตริงจะมี 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

การใช้งานอ้างอิงที่ไม่ดี

สิ่งนี้เขียนด้วยภาษานิมเอง

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

@Doorknob เพิ่มแล้ว
มนุษย์โดยรวม

1
ฉันแนะนำให้เพิ่มf("test", "tset")เพราะฉันคิดว่าคำตอบเดียวให้ผลลัพธ์ที่ไม่คาดคิด
Ørjan Johansen

@ ØrjanJohansenเรียบร้อยแล้ว
มนุษย์โดยรวม

รอดังนั้นอินพุตคือสตริงที่ "แสดงตัวระบุ Nim" และเรา "ไม่จำเป็นต้องตรวจสอบว่าเป็นตัวระบุที่ถูกต้อง" หรือไม่ แต่จากตัวอย่างหนึ่งตัวอย่างมี>?
aschepler

คำตอบ:


7

JavaScript (ES6), 62 61 ไบต์

บันทึกแล้ว 1 ไบต์ขอบคุณ@JohanKarlsson

(a)(b)จะเข้าในไวยากรณ์ currying ส่งคืนบูลีน

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

กรณีทดสอบ


1
/-|_/gบันทึก byte
Johan Karlsson

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 ฉันไม่ทราบว่าคุณสามารถทำได้ แต่ฉันคิดว่ามันสมเหตุสมผลดี
Stephen



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 ขอบคุณที่Adnan

ในทางทฤษฎีεćs„-_-«}Ëควรใช้งานได้ 10 ไบต์ แต่น่าเสียดายที่พฤติกรรมนี้เลิกใช้แล้วในตอนนี้


โอ้ใช่แล้วฉันยังต้องแก้ไขมัน คุณสามารถบันทึกไบต์โดยใช้แทน„-_SK '-K'_K
Adnan

@Adnan และฉันรู้ว่ามีวิธี ขอบคุณ!
Erik the Outgolfer

11 ไบต์ถ้าคุณเปลี่ยนไปSK м
Kevin Cruijssen

@KevinCruijssen หืมมมฉันจะอัพเดตคำตอบนี้ ฉันไม่คิดว่าмมีอยู่ในตอนนั้น : P
Erik the Outgolfer

3

เยลลี่ 11 ไบต์

ḟ⁾-_Œl,Ḣµ€E

ลองออนไลน์!

-2 ไบต์ขอบคุณ Erik the Outgolfer
-1 ไบต์ขอบคุณ Jonathan Allan


ใช้รายการของสองสายเหมือน["symbolsAre_too>_>", "symbols_areTOO>>"]และใช้Ḣ;ḟ⁾-_Œl$µ€Eแทน -2 เอาชนะ Pyth นั้น!
Erik the Outgolfer

... หรือแม้กระทั่งเพียงḟ⁾-_Œl,Ḣµ€E11 ไบต์
Jonathan Allan

ไม่มีปัญหาอาจเครดิตเอริคสำหรับ 2 และฉันสำหรับ 1 :)
โจนาธานอัลลัน

@JonathanAllan Ah ความคิดที่ดี; ฉันจะทำ :) :)
HyperNeutrino

3

Ruby , 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)เมื่อ stambby lambdas เกี่ยวข้อง
หมึกมูลค่า

@ValueInk ขอบคุณ! ฉันพยายามหาวิธีเล่นกอล์ฟใน Ruby ตามคำตอบของ Stack Overflow ดังนั้นฉันจึงไม่รู้ว่านั่นเป็นตัวเลือก
ตัวช่วยสร้างข้าวสาลี

3

C ++, 288 248 ไบต์

-5 ไบต์ขอบคุณ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;}

ขอขอบคุณคุณผู้ประมวลผลล่วงหน้า นอกจากนี้รหัสนี้ใช้ประโยชน์จากความจริงที่ว่าใน C ++ กฎที่จะใช้ int กับบูลคือint_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

Husk , 13 ไบต์

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

ลองออนไลน์!

สร้างสำหรับแต่ละสายคู่ประกอบด้วยตัวอักษรตัวแรกของสตริงและสตริงทั้งหมดที่ลดลงและมีการเกิดขึ้น - / _ ทั้งหมด จากนั้นตรวจสอบว่าทั้งสองคู่เท่ากัน

พิลึกคือว่า-ในแกลบเป็นชุดที่แตกต่างกัน (เช่นมันเอาเพียงเกิดขึ้นครั้งแรกพบ): เพื่อที่จะลบเกิดขึ้นทุกจุดคงที่จะพบกับ-"-_ω-"-_


2

Japté , 14 25 ไบต์

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

ตรวจสอบความเท่าเทียมกันของสตริงโดยไม่คำนึงถึงขนาดตัวพิมพ์โดยการลบอักขระทั้งหมดในคำ 2 ออกจากคำ 1 และลบ-_อักขระ ผลลัพธ์นั้นจะเป็นสตริงว่าง ( "") หากคำเท่ากัน
ขอบคุณØrjan Johansen ที่ชี้ปัญหานี้

การตรวจสอบความเสมอภาคแรกถ่านและถ้าปัจจัยการผลิต uppercased _-มีค่าเท่ากันหลังจากลบ

ลองออนไลน์!

คำอธิบาย

อินพุตโดยนัย: UและVเป็นสตริงอินพุต

g ¥Vg

ตรวจสอบว่าตัวอักษรตัวแรกของU(นัย) เท่ากับ ( ¥) Vถ่านแรกของ

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

และ ( ©) ตรวจสอบว่าU, uppercased ( u) และ_-ลบออก ( k) เท่ากับ ( ¥) Vเหมือนกันสำหรับ ส่งคืนผลลัพธ์บูลีนโดยปริยาย


ฉันไม่สามารถเชื่อมโยงการทำงานได้ แต่คำอธิบายนั้นฟังดูเหมือนเป็นการผิด มันให้อะไรtestกับ tset
Ørjan Johansen

@ ØrjanJohansenจุดที่ดี ... มันจะล้มเหลวสำหรับกรณีนี้ สำหรับลิงก์ฉันได้ทดสอบแล้วและใช้งานได้ดี
Justin Mariner

ใช่ลิงค์นี้เป็นความผิดของตัวเองวันหนึ่งฉันต้องเปลี่ยนเป็นเบราว์เซอร์ที่ทันสมัย ฉันโชคดีขึ้นด้วยลองออนไลน์!
Ørjan Johansen

@ ØrjanJohansenฉันขอเบราว์เซอร์ที่คุณใช้อยู่ได้ไหม? ฉันอยู่ระหว่างการปรับปรุง CodePen นั้นและต้องการให้มันเข้ากันได้กับ TIO
Justin Mariner

ไอยังคงใช้ Internet Explorer
Ørjan Johansen

1

Python 2 , 79 73 ไบต์

-6 ไบต์ขอบคุณ @notjagan: ตรวจสอบความยาวของชุดของชื่อที่ลดลงทั้งหมดคือ 1 หรือไม่

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

ลองออนไลน์!



แน่นอนว่าฉันลืมการมีอยู่ของมัน !! ขอบคุณมาก!!
อย่างเป็นทางการ

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~ t^
Ørjan Johansen

@ ØrjanJohansenฉันคิดว่าเราสามารถสันนิษฐานได้ว่าอินพุตเป็นตัวระบุที่ถูกต้อง แต่หลังจากนั้น>ก็เพิ่มตัวอย่างที่มีhmm
aschepler

ฮะ. ฉันก็ทำตามตัวอย่างนั้นด้วย ดูตอนนี้ในคู่มือ Nimแม้-จะไม่ได้รับอนุญาต แต่อัลกอริทึมยังคงรวมอยู่ ...
Ørjan Johansen

@ ØrjanJohansenใช่ฉันสังเกตเห็น-ว่าไม่ได้อยู่ในคำอธิบายไวยากรณ์ของตัวระบุ - แต่ส่วนอื่น ๆ ของเอกสารนั้นบ่งบอกว่าได้รับอนุญาต
aschepler

1

Dyalog APL, 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

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

ลองออนไลน์! (กรณีทดสอบทั้งหมด)


1

Brachylogขนาด 17 ไบต์

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

ลองออนไลน์!

เอาต์พุตผ่านเพรดิเคตที่สำเร็จ / ล้มเหลว

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 ไบต์

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อาจจะอ้างถึงในคลิปโปรแกรมไปโดยปริยายใช้เวลาถึงสามปัจจัยการผลิต เนื่องจากโปรแกรมนี้อ้างอิงเท่านั้นxและyก็จะใช้เวลาสองปัจจัยการผลิตที่ได้รับมอบหมายให้และxy

 =(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สำหรับจริงและเท็จตามลำดับ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.