Là nói đôi?


46

Trong một thử thách trước đó, tôi đã yêu cầu những người chơi golf mã tạo ra các chuỗi sao chép từng ký tự trong một chuỗi. Ví dụ:

TThhiiss  iiss  ddoouubbllee  ssppeeaakk!!

Thách thức này chỉ đơn giản là phát hiện nếu một số văn bản đáp ứng định nghĩa của chuỗi nói kép.

  • Có một số lượng nhân vật chẵn.
  • Khi chia thành từng cặp, mỗi cặp bao gồm hai nhân vật giống nhau.

Các thách thức

  • Đó là mã golf, làm điều đó trong vài byte.
  • Sử dụng bất kỳ ngôn ngữ bạn chọn.
  • Vui lòng bao gồm một liên kết đến một thông dịch viên trực tuyến.
  • Mã sẽ chấp nhận một số văn bản.
    • Để đơn giản, đầu vào sẽ chỉ bao gồm các ký tự ASCII có thể in
  • Nó sẽ trả về một dấu hiệu cho biết đầu vào có nói hai lần hay không. Nó có thể là:
    • Boolean
    • Chuỗi ('đúng', 'sai', 'có', 'không', v.v.)
    • Số nguyên 0 hoặc 1

Các trường hợp thử nghiệm:

  • aba - sai
  • abba - sai
  • aabb - đúng
  • aaabb - sai
  • tthhiiss - đúng
  • ttthhhiiisss - sai

6
Chúng ta có thể lỗi về đầu vào có độ dài <2 không?
cole

3
Trường hợp thử nghiệm được đề xuất: abbanên là chim ưng
Giuseppe

2
Trường hợp thử nghiệm được đề xuất: aabbbbcần phải trung thực
Khuldraeseth na'Barya

2
@val Vâng, tôi sẽ không tranh luận với I / O tiêu chuẩn
AJFaraday

2
Trường hợp thử nghiệm đề xuất: 0nên được falsey.
640KB

Câu trả lời:



24

Brainfuck , 20 byte

Lưu được 1 byte nhờ Jo King.

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

Hãy thử trực tuyến!

Đầu ra dễ đọc!

Đưa hai ký tự vào cùng một lúc và di chuyển khỏi số 1 trên băng nếu bất kỳ cặp nào không khớp. EOF được coi là 0 và do đó được xử lý tự động.

Đầu ra là một byte rỗng nếu chuỗi không nói hai lần và 0x01 nếu có. Phiên bản có thể đọc được xuất ra dưới dạng các ký tự với chi phí 14 byte.


Nếu tôi có thể downvote bình luận, tôi sẽ downvote bình luận ở trên.
A _

@PerpetualJ A) Đó là một esolang siêu nổi tiếng, tôi không thể tin rằng bạn chưa từng nghe về nó B) Đó không phải là lý do để nâng cấp
Chương trình Redwolf

@RedwolfPrograms Mỗi quy tắc SE, bạn nên nâng cấp nếu bài đăng hữu ích và rất hữu ích trong việc dạy tôi tên của ngôn ngữ mà tôi chưa từng nghe đến. Thêm vào đó, đó là một giải pháp tuyệt vời xứng đáng với một upvote.
PerpetualJ

1
@PerpetualJ Đồng ý rằng đó là một giải pháp tuyệt vời, nhưng có rất nhiều esolang với những cái tên ngộ nghĩnh và giải pháp nhàm chán (chủ yếu là các biến thể BF)
Chương trình Redwolf

17

MATL , 4 byte

Heda

Đầu vào là một chuỗi, kèm theo các qout đơn. Đầu ra là 0để nói đôi, 1nếu không.

Hãy thử trực tuyến!

Giải trình

Hãy xem xét đầu vào 'TThhiiss iiss ddoouubbllee ssppeeaakk!!'là một ví dụ.

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
Ừm ... "Heda" là ai? : D
Erik the Outgolfer

7
"Heda" là tiếng Đức có nghĩa là "Này! Bạn!"
QBrute

14

05AB1E , 6 5 2 byte

ιË

Nhập dưới dạng danh sách các ký tự.

-3 byte bằng cách chuyển câu trả lời Japt của @ Shaggy , vì vậy hãy đảm bảo nâng cao anh ấy!

Hãy thử trực tuyến hoặc xác minh một vài trường hợp thử nghiệm .

Giải trình:

ι   # 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)


10

Võng mạc , 9 byte

(.)\1

^$

Hãy thử trực tuyến.

Giải trình:

Xóa tất cả các cặp ký tự giống nhau:

(.)\1

Kiểm tra nếu không còn ký tự nào:

^$

1
Bạn có thể cung cấp một đầu ra truyền thống hơn bằng cách sử dụng ^$làm giai đoạn cuối cùng của bạn.
Neil

@Neil Ah tất nhiên, cảm ơn! Điều đó thực sự có vẻ tốt hơn. Tôi luôn nghĩ rằng điều đó thật kỳ lạ falsekhi là sự thật và truenhư chim ưng (nhưng nếu nó tiết kiệm được một byte và nó được cho phép, tôi vẫn sẽ sử dụng nó). ;) Nhưng vì đây là một giải pháp byte bằng nhau cho kết quả mong đợi, nên điều này tốt hơn.
Kevin Cruijssen

8

1
Này tôi thích cái này! Tôi đã mất 80mns để làm điều tương tự lol, tôi giống như "hey hãy học Jelly ngay bây giờ" sau đó tôi đã học được. Tôi định đăng bài này nhưng xem các câu trả lời của Jelly đã có ở đó chưa ... và sau đó đã thấy điều này ^^ Các bước của tôi: ¹©s2L€=2Ạa®s2E€Ạ... ḢƝs2E€Ạ... nhưng tôi không thể xoay sở để đạt được điều mình muốn, và rồi tôi thấy Œœlol
V. Courtois


6

PHP ,58 56 byte

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

Hãy thử trực tuyến!

Là một hàm đệ quy.

PHP ,61 56 52 byte

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

Hãy thử trực tuyến!

Hoặc chương trình độc lập. Chuỗi đầu vào thông qua STDIN, đầu ra là truthy( 1) nếu nó nói hai lần và falsey( 0) nếu nó không nói hai lần.

-4 byte thx đến @ Night2 !


1
Điều này xuất hiện với đầu ra 1 cho chuỗi nói không đôi, cũng như chuỗi nói kép.
AJFaraday

@AJFaraday hãy thử ngay bây giờ - nói hai lần , không nói hai lần
640KB

6

mã máy x86, 9 7 byte

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

Chuỗi đầu vào trong SI, độ dài chuỗi đầu vào trong CX. Đầu ra ZFnếu nói gấp đôi.

Hoặc là 14 byte dưới dạng thực thi PC DOS hoàn chỉnh:

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 

Đầu vào là thông qua STDIN , hoặc đường ống hoặc tương tác. Sẽ lặp lại đầu vào "nhân đôi" cho đến khi phát hiện một ký tự không nhân đôi, tại thời điểm đó sẽ thoát (có thể bẻ cong quy tắc I / O một chút, nhưng đây chỉ là câu trả lời bổ sung).

nhập mô tả hình ảnh ở đây

Xây dựng và kiểm tra ISDBL2.COM bằng cách sử dụng xxd -r :

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

24 byte gốc hoàn chỉnh PC DOS thực thi:

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

Nhập từ dòng lệnh, xuất ra màn hình 'Y'nếu gấp đôi, 'N'nếu không.

nhập mô tả hình ảnh ở đây

Xây dựng và kiểm tra ISDBL.COM bằng cách sử dụng xxd -r :

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

Tín dụng:

  • -2 byte thx đến @ErikF!

2
Đề xuất sử dụng LOOPEthay vì JNZ/ LOOPđể lưu 2 byte.
ErikF

@ErikF, rực rỡ! Hoàn toàn quên mất điều đó!
640KB

6

Lua , 67 66 63 59 33 32 byte

-25 byte nhờ Giuseppe
-1 byte nhờ val

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

Hãy thử trực tuyến!

Xóa mọi ký tự nhân đôi, sau đó kiểm tra xem kết quả có trống không.


1
Tại sao không chỉ i:gsub("(.)%1","")và kiểm tra nếu i==""?
Giuseppe

1
đây là 34 byte, không hoàn toàn chắc chắn rằng nó hợp lệ vì tôi chưa bao giờ viết Lua trước đây, nhưng nó dường như hoạt động.
Giuseppe

Chào mừng đến với Code Golf Stack Exchange!
Giuseppe

Tôi cho rằng "(.)%1"tự nó bao gồm các va chạm, nhưng với tôi, điều đó không xảy ra với tôi bằng cách thay thế nó một lần cho tất cả các ảnh chụp là đủ. Tôi nên thực hiện giải pháp của bạn hay bạn nên viết câu trả lời của riêng bạn? Và cảm ơn!
HugoBDesigner

1
Ý kiến ​​hay! arg[1]có thể được thay thế bằng (...)để lưu một byte.
val




5

Haskell , 28 23 byte

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

Hãy thử trực tuyến!

Rất đơn giản. Nói đôi chỉ là trống rỗng hoặc một nhân vật lặp đi lặp lại dự kiến ​​nói đôi.

Ít đơn giản hơn bây giờ. Đầu ra thông qua sự hiện diện hoặc không có lỗi, theo sự đồng thuận meta ; không có lỗi có nghĩa là nói đôi. Khớp mẫu không thành công khi hai ký tự đầu tiên khác nhau hoặc khi có số lượng ký tự lẻ. Cảm ơn Laikoni vì những khoản tiết kiệm này!




4

PowerShell , 39 38 byte

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

Hãy thử trực tuyến!

nơi $pchứa một char trước đó.

Không đệ quy , không regex :). Đưa đầu vào dưới dạng mảng char thông qua chuỗi nối (xem liên kết TIO).


PowerShell , 48 byte

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

Hãy thử trực tuyến!

Không đệ quy , không regex và không có đường ống: D. Nó cũng nhận đầu vào là một mảng char thông qua một chuỗi nối. Nó sử dụng $b-eq$athay thế $a-eq$bcho một trường hợp khi một char cuối cùng có mã # 0.


4

PowerShell , 64 59 byte

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

Hãy thử trực tuyến!

Hàm đệ quy, không có regex. Đưa đầu vào dưới dạng char-array (xem liên kết TIO). Loại bỏ hai yếu tố đầu tiên vào $a$b, lưu trữ phần còn lại vào $r. Nếu chúng ta vẫn còn các yếu tố, hãy lặp lại cùng với $a -eq $b. Nếu không, chỉ cần kiểm tra xem$a -eq $b . Đầu ra là ẩn.

-5 byte nhờ mazzy



1
@mazzy Cảm ơn! Tôi đã bỏ lỡ $trước khối lệnh và không thể hiểu tại sao nó không hoạt động.
admBorkBork



4

Ngôn ngữ lập trình Shakespeare , 204 156 byte

-48 byte nhờ Jo King (chủ yếu bằng cách thay đổi phương thức đầu ra)

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.

Hãy thử trực tuyến!

Thoát khỏi lỗi nếu đầu vào là nói kép và với cảnh báo nếu nó không nói hai lần (được cho phép theo mặc định).


4

keg , 19 17 ký tự

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

Giải trình:

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

Hãy thử trực tuyến!


3

R , 53 34 byte

-19 byte nhờ Giuseppe

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

Hãy thử trực tuyến!


1
Tôi nghĩ gsub("(.)\\1","",a)==""cũng sẽ làm được điều đó; nhiều người khác sử dụng regex tương tự.
Giuseppe

@Giuseppe Toàn bộ điều regex này khá mới đối với tôi. Cảm ơn.
Robert S.

R + pryr giúp bạn thay đổi tầm thường 32 câu trả lời từ câu trả lời này.
Khuldraeseth na'Barya

2
Nếu đầu vào có thể được coi là một vectơ, thì function(a)!sum(rle(a)$l%%2)trong 28
MickyT

3

Brain-Flak , 26 , 22 byte

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

Hãy thử trực tuyến!

Đầu ra 1 cho sai và 0 cho đúng.

Phiên bản dễ đọc:

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

Ban đầu tôi có cái này:

{
    ({}[{}])

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

Cái nào dài hơn 10 byte.


Có 0 / non0 được tính là boolean không? Nếu vậy, bạn có thể làm({({}[{}]){{}}{}})
Riley

3
lol tại "Phiên bản có thể đọc được" - nó rất dễ đọc: P
Quinn

@riley Không có gì là không hợp lệ. Tuy nhiên, tôi tìm thấy một mẹo tốt hơn.
DJMcMayhem

@quinn Có vẻ dễ đọc đối với tôi: P
DJMcMayhem


3

JavaScript, 26 23 byte

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

Hãy thử trực tuyến!

Giải pháp đệ quy, 30 byte

Cảm ơn Arnauld đã sửa lỗi với chi phí 0 byte.

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

Hãy thử trực tuyến!



Cảm ơn, @Arnauld :)
Shaggy

@Oliver, tào lao; chỉ thấy giải pháp ban đầu của bạn trước khi đăng của tôi. Tôi rất vui khi quay trở lại 26 nếu bạn đến 23 tuổi đó trước tôi - hãy cho tôi biết.
Xù xì


3

Zsh , 36 byte

Câu trả lời Zsh của tôi cho thử thách trước có thể được tìm thấy ở đây.

Thoát khỏi sự thật (0) nếu KHÔNG nói hai lần và giả dối (1) nếu nói hai lần. (Như được cho phép trong một bình luận.)

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

Hãy thử trực tuyến!


3

Prolog (SWI) , 60 45 byte

nhờ Chuỗi không liên quan

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

Hãy thử trực tuyến!

Chuyển đổi nó từ một chuỗi thành một danh sách các nguyên tử loại làm hỏng điểm số, nhưng tốt ..



1
... có vẻ như bạn cũng có thể sử dụng atom_charsthay vì string_chars, mặc dù bạn đang lấy một chuỗi làm đầu vào chứ không phải là một nguyên tử. Nhưng điều đó có thể không liên quan nếu bạn có thể lấy một chuỗi được phân tách bằng backtick - đó là một danh sách các mã char.
Chuỗi không liên quan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.