มันพูดเป็นสองเท่าได้ไหม?


45

ในการท้าทายก่อนหน้านี้ฉันขอให้นักกอล์ฟเขียนโค้ดเพื่อสร้างสตริงที่คัดลอกอักขระแต่ละตัวในสตริง ตัวอย่างเช่น:

TThhiiss  iiss  ddoouubbllee  ssppeeaakk!!

ความท้าทายนี้เป็นเพียงการตรวจสอบว่าข้อความบางอย่างตรงตามคำจำกัดความของสายพูดสองครั้ง

  • มีจำนวนอักขระเป็นคู่
  • เมื่อแบ่งออกเป็นคู่ทุกคู่ประกอบด้วยอักขระสองตัวที่เหมือนกัน

ความท้าทาย

  • มันเป็นรหัสกอล์ฟทำในไม่กี่ไบต์
  • ใช้ภาษาใดก็ได้ที่คุณเลือก
  • โปรดใส่ลิงค์ไปยังล่ามออนไลน์
  • รหัสจะยอมรับข้อความบางส่วน
    • เพื่อความเรียบง่ายอินพุตจะประกอบด้วยอักขระ ASCII ที่พิมพ์ได้เท่านั้น
  • มันจะกลับมาบ่งชี้ว่าการป้อนข้อมูลเป็นคู่พูด มันอาจจะเป็น:
    • บูลีน
    • สตริง ('จริง', 'เท็จ', 'ใช่', 'ไม่' ฯลฯ )
    • จำนวนเต็ม 0 หรือ 1

กรณีทดสอบ:

  • aba - false
  • abba - false
  • aabb - จริง
  • aaabb - เท็จ
  • tthhiiss - จริง
  • ttthhhiiisss - เท็จ

6
เราอาจผิดพลาดกับอินพุตความยาว <2 หรือไม่
โคล

3
กรณีทดสอบที่แนะนำ: abbaซึ่งควรเป็นเท็จ
จูเซปเป้

2
กรณีทดสอบที่แนะนำ: aabbbbซึ่งควรเป็นความจริง
Khuldraeseth na'Barya

2
@ มากอืมฉันจะไม่เถียงกับ I / O มาตรฐาน
AJFaraday

2
กรณีทดสอบที่แนะนำ: 0ซึ่งควรเป็นเท็จ
640KB

คำตอบ:



23

brainfuck , 20 ไบต์

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

+>,[>,[-<->]<[<],]<.

ลองออนไลน์!

เอาต์พุตที่อ่านได้!

ใช้เวลาป้อนอักขระสองตัวในแต่ละครั้งและเลื่อนออกจาก 1 บนเทปหากคู่ใดไม่ตรงกัน EOF ถือเป็น 0 และจัดการโดยอัตโนมัติ

เอาต์พุตเป็นไบต์ว่างถ้าสตริงไม่ได้พูดเป็นสองเท่าและ 0x01 ถ้าเป็นเช่นนั้น เวอร์ชันที่อ่านได้จะให้ผลลัพธ์เป็นอักขระที่ราคา 14 ไบต์


ลงคะแนนเต็มที่เพราะชื่อภาษา ฮ่าฮ่าทางออกยอดเยี่ยม!
ถาวร

ถ้าฉันสามารถลงความเห็นฉันจะลงความคิดเห็นข้างต้น
A _

16

MATL , 4 ไบต์

Heda

อินพุตเป็นสตริงที่ล้อมรอบด้วย qoutes เดี่ยว เอาท์พุท0สำหรับพูดสองครั้งเป็น1อย่างอื่น

ลองออนไลน์!

คำอธิบาย

พิจารณาการป้อนข้อมูล'TThhiiss iiss ddoouubbllee ssppeeaakk!!'เป็นตัวอย่าง

H    % Push 2
     % STACK: 2
     % Implicit input (triggered because the next function requires two inputs): string 
     % STACK: 'TThhiiss  iiss  ddoouubbllee  ssppeeaakk!!', 2
e    % Reshape as a 2-column matrix of chars, in column-major order. Pads with char(0)
     % if needed. Note that char(0) cannot be present in the input
     % STACK: ['This is double speak!';
               'This is double speak!']
d    % Difference of each column
     % STACK: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
a    % Any: gives 0 if and only if all elements are 0
     % STACK: 0
     % Implicit display

12
อืม ... ใครคือ "Heda" : D
Erik the Outgolfer

7
"Heda" เป็นภาษาเยอรมันสำหรับ "Hey! You!"
QBrute

14

05AB1E , 6 5 2 ไบต์

ιË

อินพุตเป็นรายการของอักขระ

-3 bytes โดยการย้ายคำตอบ Japt ของ @ Shaggyเพื่อให้แน่ใจว่าได้ upvote เขา!

ลองออนไลน์หรือตรวจสอบกรณีทดสอบอีกสองสามข้อ

คำอธิบาย:

ι   # Uninterleave the (implicit) input-list of characters
    #  i.e. ["t","t","t","t","e","e","s","s","t","t","!","!","!"]
    #   → [["t","t","e","s","t","!","!"],["t","t","e","s","t","!"]]
 Ë  # Check if both inner lists are equal
    #  → 0 (falsey)
    # (after which the result is output implicitly)


9

เรติน่า 9 ไบต์

(.)\1

^$

ลองออนไลน์

คำอธิบาย:

ลบตัวละครเดียวกันทุกคู่ออก:

(.)\1

ตรวจสอบว่าไม่มีอักขระเหลืออยู่:

^$

1
คุณสามารถให้ผลลัพธ์แบบดั้งเดิมมากขึ้นโดยใช้^$เป็นขั้นตอนสุดท้ายของคุณ
Neil

@ Neil Ah แน่นอนขอบคุณ! นั่นดูดีกว่าแน่นอน ฉันมักจะคิดว่ามันเป็นเรื่องแปลกที่เอาfalseท์พุทเป็นความจริงและtrueเป็นเท็จ (แต่ถ้ามันบันทึกไบต์และได้รับอนุญาตฉันจะยังคงใช้มัน) ;) แต่เนื่องจากนี่เป็นวิธีการแก้ปัญหาไบต์ที่เท่ากันแสดงผลลัพธ์ที่คาดหวังจึงดีกว่า
Kevin Cruijssen

8

1
เฮ้ฉันชอบสิ่งนี้! ฉันใช้เวลา 80 นาทีในการทำฮ่า ๆ ๆ ฉันชอบ "เฮ้มาเรียนรู้ของเยลลี่กันเถอะ" จากนั้นฉันก็เรียนรู้ ฉันกำลังจะโพสต์สิ่งนี้ แต่ดูว่าคำตอบของเยลลี่นั้นอยู่ที่นั่นแล้ว ... และเห็นสิ่งนี้ ^^ ขั้นตอนของฉัน: ¹©s2L€=2Ạa®s2E€Ạ... ḢƝs2E€Ạ... แต่ฉันไม่สามารถจัดการเพื่อให้ได้สิ่งที่ฉันต้องการและจากนั้นฉันก็เห็นŒœฮ่า ๆ
V. Courtois


6

PHP ,58 56 ไบต์

function f($s){return!$s?:$s[0]==$s[1]&f(substr($s,2));}

ลองออนไลน์!

เป็นฟังก์ชั่นวนซ้ำ

PHP ,61 56 52 ไบต์

while(''<$l=$argn[$i++])$r|=$l!=$argn[$i++];echo!$r;

ลองออนไลน์!

หรือโปรแกรมสแตนด์อโลน สตริงอินพุตผ่านSTDINเอาต์พุตเป็นtruthy( 1) ถ้าเป็น double speak และfalsey( 0) ถ้าไม่ใช่ double speak

-4 ไบต์ขอบคุณไปที่@ Night2 !


1
สิ่งนี้จะปรากฏขึ้นเพื่อเอาท์พุท 1 สำหรับสตริงพูดที่ไม่ใช่สองครั้งรวมถึงสตริงพูดสองครั้ง
AJFaraday


6

รหัสเครื่อง x86, 9 7 ไบต์

D1 E9       SHR  CX, 1          ; divide length in half 
AD          LODSW               ; load next two chars into AH/AL 
3A E0       CMP  AH, AL         ; compare AH and AL 
E1 FB       LOOPE -5            ; if equal, continue loop

สายป้อนในความยาวสายเข้าในSI CXเอาท์พุทZFถ้าเป็นคู่พูด

หรือ14 ไบต์เป็น PC DOS ที่สามารถใช้งานได้ทั้งหมด:

B4 01       MOV  AH, 01H        ; DOS read char from STDIN (with echo) 
CD 21       INT  21H            ; read first char into AL
92          XCHG DX, AX         ; put first char into DL
B4 08       MOV  AH, 08H        ; DOS read char from STDIN (no echo) 
CD 21       INT  21H            ; read second char into AL
3A C2       CMP  AL, DL         ; compare first and second char 
74 F3       JE   -13            ; if the same, continue loop 
C3          RET                 ; otherwise exit to DOS 

อินพุตคือผ่านSTDINท่อหรือแบบโต้ตอบ จะสะท้อนอินพุต "de-doubled" จนกว่าจะตรวจพบอักขระที่ไม่เพิ่มเป็นสองเท่า ณ จุดนั้นจะออก (อาจดัดกฎ I / O นิดหน่อย แต่นี่เป็นเพียงคำตอบโบนัส)

ป้อนคำอธิบายรูปภาพที่นี่

สร้างและทดสอบ ISDBL2.COM โดยใช้xxd -r:

00000000: b401 cd21 92b4 08cd 213a c274 f3c3       ...!....!:.t..

Original DOS ขนาด 24 ไบต์สมบูรณ์สำหรับ PC DOS:

D1 EE       SHR  SI, 1          ; SI to DOS PSP (080H) 
AD          LODSW               ; load string length into AL 
D0 E8       SHR  AL, 1          ; divide length in half 
8A C8       MOV  CL, AL         ; put string length into BL 
        CLOOP: 
AD          LODSW               ; load next two chars into AH/AL 
3A E0       CMP  AH, AL         ; compare AH and AL 
E1 FB       LOOPE CLOOP         ; if equal, continue loop
        DONE: 
B8 0E59     MOV  AX, 0E59H      ; BIOS tty function in AH, 'Y' in AL 
74 02       JZ   DISP           ; if ZF, result was valid double 
B0 4E       MOV  AL, 'N'        ; if not, change output char to N 
        DISP: 
B4 0E       MOV  AH, 0EH 
CD 10       INT  10H 
C3          RET                 ; return to DOS

อินพุตจากบรรทัดรับคำสั่งเอาต์พุตไปยังหน้าจอ'Y'หากเป็นสองเท่า'N'หากไม่ใช่

ป้อนคำอธิบายรูปภาพที่นี่

สร้างและทดสอบ ISDBL.COM โดยใช้xxd -r:

00000000: d1ee add0 e88a c8ad 3ae0 e1fb b859 0e74  ........:....Y.t
00000010: 02b0 4eb4 0ecd 10c3                      ..N.....

เครดิต:

  • -2 ไบต์ขอบคุณไปที่ @ErikF!

2
แนะนำให้ใช้LOOPEแทนJNZ/ LOOPเพื่อบันทึก 2 ไบต์
ErikF

@ErikF ยอดเยี่ยม! ลืมเรื่องนั้นโดยสิ้นเชิง!
640KB

6

Lua , 67 66 63 59 33 32 ไบต์

-25 ไบต์ขอบคุณ Giuseppe
-1 ไบต์ขอบคุณ val

print(#(...):gsub("(.)%1","")<1)

ลองออนไลน์!

ลบอักขระทุกตัวที่เป็นสองเท่าจากนั้นตรวจสอบว่าผลลัพธ์ว่างเปล่าหรือไม่


1
ทำไมไม่เพียงi:gsub("(.)%1","")และตรวจสอบว่าi==""?
จูเซปเป้

1
นี่คือ 34 ไบต์ไม่แน่ใจว่าถูกต้องเพราะฉันไม่เคยเขียน Lua มาก่อน แต่ดูเหมือนจะใช้งานได้
จูเซปเป้

ยินดีต้อนรับสู่ Code Golf Stack Exchange!
จูเซปเป้

ฉันเดาเอา"(.)%1"เองว่ารวมการชนกัน แต่มันไม่ได้เกิดขึ้นกับฉันโดยการแทนที่เพียงครั้งเดียวสำหรับการจับทั้งหมดจะเพียงพอ ฉันควรใช้โซลูชันของคุณหรือคุณควรเขียนคำตอบของคุณเอง? และขอบคุณ!
HugoBDesigner

1
ความคิดดี! arg[1]สามารถถูกแทนที่ด้วย(...)เพื่อบันทึกหนึ่งไบต์
Val


5

MathGolf 2 ไบต์

½=

ลองออนไลน์!

โดยพื้นฐานแล้วเหมือนกับคำตอบ 05AB1E ให้½แยกสตริงออกเป็นอักขระคู่และคู่จากนั้นตรวจสอบความเท่าเทียมกัน ส่งผ่านสตริงว่าง


5

JavaScript ขนาด 28 ไบต์

s=>s.every((x,y)=>x==s[y|1])

ลองออนไลน์!


23 ไบต์โดยใช้ regex ของ wastl

s=>/^((.)\2)*$/.test(s)

ลองออนไลน์!


24 ไบต์ แต่ส่งออกอาร์เรย์เป็นจริงnullสำหรับเท็จ: ลองออนไลน์!
ทำลาย

27 ไบต์s=>!s.some((x,y)=>x>s[y|1])
tsh


5

Haskell , 28 23 ไบต์

f(x:y:z)|x==y=f z
f[]=1

ลองออนไลน์!

ตรงไปตรงมามาก การพูดสองครั้งนั้นว่างเปล่าหรืออักขระที่พูดซ้ำเป็นการเตรียมการสำหรับการพูดสองครั้ง

ตรงไปตรงมาน้อยลงในขณะนี้ ขาออกผ่านการมีหรือไม่มีข้อผิดพลาดต่อฉันทามติเมตา ; ไม่มีข้อผิดพลาดหมายความว่าคู่พูด การจับคู่รูปแบบล้มเหลวเมื่ออักขระสองตัวแรกแตกต่างกันหรือเมื่อมีจำนวนอักขระแปลก ขอบคุณLaikoniสำหรับการประหยัดเหล่านี้!




4

PowerShell , 39 38 ไบต์

!$($args|?{+$p*($p="$_"[$p-eq$_])};$p)

ลองออนไลน์!

โดยที่$pมีอักขระก่อนหน้า

ไม่มีการเรียกซ้ำไม่มีregex :) รับอินพุตเป็น char-array ผ่านสตริงการกระจาย (ดูที่ลิงก์ TIO)


PowerShellขนาด 48 ไบต์

for(;$b-eq$a-and$args){$a,$b,$args=$args}$b-eq$a

ลองออนไลน์!

ไม่มีการเรียกซ้ำไม่มีregexและไม่มี pipe: D นอกจากนี้ยังใช้อินพุตเป็น char-array ผ่านสตริงการแทรก มันใช้$b-eq$aแทน$a-eq$bกรณีเมื่อถ่านตัวสุดท้ายมีรหัส # 0


4

PowerShell , 64 59 ไบต์

filter f($n){$a,$b,$r=$n;$a-eq$b-and$(if($r){f $r}else{1})}

ลองออนไลน์!

ฟังก์ชั่นวนซ้ำไม่มี regex ใช้อินพุตเป็นchar-array (ดูลิงก์ TIO) เปลือกออกสององค์ประกอบแรกเข้า$aและร้านค้าลงเหลือ$b $rถ้าเรายังคงมีองค์ประกอบที่เหลือ recurse $a -eq $bพร้อมกับ $a -eq $bมิฉะนั้นเพียงแค่ตรวจสอบว่า เอาท์พุทเป็นนัย

-5 ไบต์ต้องขอบคุณเขาวงกต


1
ไม่ซ้ำกันลองออนไลน์!
mazzy

1
@ มาซี่ขอบคุณ! ฉันหายไป$ก่อนบล็อกคำสั่งและไม่สามารถหาสาเหตุที่มันไม่ทำงาน
AdmBorkBork


4

J , 13 11 10 ไบต์

-:2#_2{.\]

ลองออนไลน์!

-2 ไบต์ขอบคุณAdám

-1 ไบต์ขอบคุณไมล์

คำอธิบาย TLDR: อินพุตเหมือนกับอักขระอื่นของอินพุตสองเท่าหรือไม่



-:2#_2{.\]ควรประหยัดอีกไบต์
ไมล์

ดีมากขอบคุณ @miles
Jonah

4

ภาษาการเขียนโปรแกรมของเช็คสเปียร์ , 204 156 ไบต์

-48 ไบต์ขอบคุณ Jo King (ส่วนใหญ่โดยการเปลี่ยนวิธีการแสดงผล)

A.Ajax,.Puck,.Act I:.Scene I:.[Exeunt][Enter Ajax and Puck]Ajax:Open mind.Puck:Open
mind.Is I worse zero?If soSpeak thy.Is you as big as I?If soLet usAct I.

ลองออนไลน์!

ออกโดยมีข้อผิดพลาดหากอินพุตเป็นการพูดสองครั้งและมีการเตือนถ้าไม่ใช่พูดสองครั้ง (ซึ่งเป็นค่าเริ่มต้นที่อนุญาต )


4

ถัง , 19 17 ตัว

?{!1<|=[|0.(_)]}1

คำอธิบาย:

?             # read input

{             # while
    !1<       # stack length greater than 1?
|             # end of while condition and beginning of while block
    =         # compare the 2 top values in the stack
    [         # if (the condition is the top of stack)
    |         # end of then block and beginning of else block
        0.    # output 0
        (_)   # clear stack (discard top of stack in for loop stack length times)
    ]         # end if
}             # end while

1             # stack is already empty, push a truthy value

              # implicitly output the stack content if there was no explicit output

ลองออนไลน์!


3

R , 53 34 ไบต์

-19 ไบต์ขอบคุณ Giuseppe

function(a)gsub("(.)\\1","",a)==""

ลองออนไลน์!


1
ฉันคิดว่าgsub("(.)\\1","",a)==""จะทำเคล็ดลับเช่นกัน อื่น ๆ อีกมากมายใช้ regex เดียวกัน
จูเซปเป้

@Giuseppe นี่คือสิ่งใหม่ทั้งหมดสำหรับฉัน ขอบคุณ
Robert S.

R + pryr ทำให้คุณได้รับ32-byterแก้ไขเล็กน้อยจากคำตอบนี้
Khuldraeseth na'Barya

2
หากอินพุตสามารถนำมาเป็นเวกเตอร์ได้ดังนั้นfunction(a)!sum(rle(a)$l%%2)สำหรับ 28
MickyT

3

Brain-Flak , 26 , 22 ไบต์

({<({}[{}])>{()<>}{}})

ลองออนไลน์!

เอาต์พุต 1 สำหรับเท็จและ 0 สำหรับจริง

รุ่นที่อ่านได้:

({
    <({}[{}])>
    {
        ()
        <>
    }
    {}
})

ฉันเคยมีสิ่งนี้:

{
    ({}[{}])

    {
        <>([()])<>{{}}
    }{}
}
<>({}())

ซึ่งยาวกว่า 10 ไบต์


0 / non0 นับเป็นบูลีนหรือไม่ ถ้าเป็นเช่นนั้นคุณสามารถทำได้({({}[{}]){{}}{}})
ไรลีย์

3
lol ที่ "รุ่นที่อ่านได้" - มันอ่านง่ายมาก: P
Quinn

@riley ไม่ถูกต้อง อย่างไรก็ตามฉันพบเคล็ดลับที่ดีกว่า
DJMcMayhem

@quinn ดูเหมือนฉันอ่านได้: P
DJMcMayhem


3

JavaScript, 26 23 ไบต์

s=>/^((.)\2)+$/.test(s)

ลองออนไลน์!

โซลูชันแบบเรียกซ้ำ, 30 ไบต์

ขอบคุณ Arnauld สำหรับการแก้ไขที่ราคา 0 ไบต์

f=([x,y,...s])=>x?x==y&f(s):!y

ลองออนไลน์!



ขอบคุณ @Arnauld :)
Shaggy

@Oliver อึ; เห็นโซลูชันดั้งเดิมของคุณก่อนโพสต์ของฉันเท่านั้น ฉันยินดีที่จะย้อนกลับไปที่ 26 ถ้าคุณได้ที่ 23 ก่อนที่ฉัน - แจ้งให้เราทราบ
ขนดก


3

Zsh , 36 ไบต์

คำตอบ Zsh ของฉันสำหรับความท้าทายก่อนหน้าสามารถพบได้ที่นี่

ออกจากความจริง (0) ถ้าไม่พูดสองครั้งและเป็นเท็จ (1) ถ้าพูดสองครั้ง (ตามที่อนุญาตในความคิดเห็น)

for a b (${(s::)1})r+=${a#$b}
[ $r ]

for a b (${(s::)1})r+=${a#$b}
         ${(s::)1}             # split $1 characterwise
for a b (         )            # take pairs of characters from ${(s::)1}, assign to $a and $b
                      ${a   }  # first character
                      ${ #$b}  # remove second character as prefix
                   r+=         # append to $r as string
[ $r ]                         # exit truthy if $r is non-empty

ลองออนไลน์!


3

เปิดฉาก (SWI) , 60 45 ไบต์

ขอบคุณ String ที่ไม่เกี่ยวข้อง

+[].
+[A,A|T]:- +T.
-X:-string_chars(X,Y),+Y.

ลองออนไลน์!

การแปลงจากสตริงเป็นรายการของอะตอมที่ทำลายคะแนน แต่ก็เช่นกัน ..



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