Apakah ini bicara ganda?


46

Dalam tantangan sebelumnya saya meminta pegolf kode untuk menghasilkan string yang menyalin setiap karakter dalam sebuah string. Sebagai contoh:

TThhiiss  iiss  ddoouubbllee  ssppeeaakk!!

Tantangan ini hanya untuk mendeteksi jika beberapa teks memenuhi definisi string ucapan ganda.

  • Bahkan ada sejumlah karakter.
  • Ketika dipisah menjadi pasangan, setiap pasangan terdiri dari dua karakter yang sama.

Tantangan

  • Ini kode golf, lakukan dalam beberapa byte.
  • Gunakan bahasa apa pun yang Anda pilih.
  • Harap sertakan tautan ke juru bahasa online.
  • Kode akan menerima beberapa teks.
    • Untuk mempermudah, input hanya akan terdiri dari karakter ASCII yang dapat dicetak
  • Ini akan mengembalikan indikasi apakah input tersebut berbicara dua kali atau tidak. Bisa jadi:
    • Boolean
    • String ('benar', 'salah', 'ya', 'tidak' dll)
    • Integer 0 atau 1

Kasus uji:

  • aba - false
  • abba - false
  • aabb - benar
  • aaabb - false
  • tthhiiss - benar
  • ttthhhiiisss - false

6
Bisakah kita kesalahan input panjang <2?
cole

3
Test case abbayang disarankan: yang seharusnya falsey
Giuseppe

2
Kasus tes yang disarankan: aabbbbmana yang seharusnya benar
Khuldraeseth na'Barya

2
@val Yah, aku tidak akan berdebat dengan standar I / O
AJFaraday

2
Test case 0yang disarankan: mana yang seharusnya falsey.
640KB

Jawaban:



24

brainfuck , 20 byte

Disimpan 1 byte berkat Jo King.

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

Cobalah online!

Output yang mudah dibaca!

Mengambil input dua karakter sekaligus, dan menjauh dari 1 pada kaset jika ada pasangan yang tidak cocok. EOF diperlakukan sebagai 0 dan karenanya ditangani secara otomatis.

Output adalah byte nol jika string tidak berbicara ganda, dan 0x01 jika itu. Versi yang dapat dibaca menampilkan ini sebagai karakter dengan biaya 14 byte.


Jika saya bisa menurunkan komentar, saya akan menurunkan komentar di atas.
A

@PerpetualJ A) Ini adalah esolang yang sangat populer, saya tidak percaya Anda belum pernah mendengarnya B) Itu bukan alasan untuk
mengalah

@RedwolfPrograms Per SE aturan, Anda harus memilih apakah posting itu membantu, dan itu membantu dalam mengajari saya nama bahasa yang belum pernah saya dengar. Selain itu, ini adalah solusi hebat yang pantas mendapat upvote.
PerpetualJ

1
@PerpetualJ Setuju bahwa ini adalah solusi hebat, tetapi ada banyak esolang dengan nama lucu dan solusi membosankan (sebagian besar varian BF)
Program Redwolf

17

MATL , 4 byte

Heda

Input adalah string, tertutup dengan qoutes tunggal. Output adalah 0untuk berbicara dua kali, 1jika tidak.

Cobalah online!

Penjelasan

Pertimbangkan input 'TThhiiss iiss ddoouubbllee ssppeeaakk!!'sebagai contoh.

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
Um ... siapa itu "Heda"? : D
Erik the Outgolfer

7
"Heda" adalah bahasa Jerman untuk "Hei! Kamu!"
QBrute

14

05AB1E , 6 5 2 byte

ιË

Masukan sebagai daftar karakter.

-3 byte dengan mengirim jawaban Japt @ Shaggy , jadi pastikan untuk membatalkannya!

Cobalah secara online atau verifikasi beberapa kasus uji lagi .

Penjelasan:

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

11

Japt , 4 byte

ó r¶

Cobalah

ó r¶     :Implicit input of string
ó        :Uniterleave
  r      :Reduce by
   ¶     :  Testing equality

Alternatif

ó
¥o

Cobalah


10

Retina , 9 byte

(.)\1

^$

Cobalah online.

Penjelasan:

Hapus semua pasangan karakter yang sama:

(.)\1

Periksa apakah tidak ada karakter yang tersisa:

^$

1
Anda dapat memberikan hasil yang lebih tradisional dengan menggunakan ^$sebagai tahap akhir Anda.
Neil

@Neil Ah tentu saja, terima kasih! Itu memang terlihat lebih baik. Saya selalu berpikir itu aneh keluaran falsesebagai kebenaran dan truesebagai falsey (tetapi jika menyimpan satu byte dan diizinkan, saya masih akan menggunakannya). ;) Tetapi karena ini adalah solusi byte yang sama dengan mengeluarkan hasil yang diharapkan, ini lebih baik.
Kevin Cruijssen

8

Jelly , 3 byte

ŒœE

Cobalah online!


1
Hai, aku suka ini! Butuh 80mns untuk melakukan lol yang sama, saya seperti "hei mari kita belajar Jelly sekarang" kemudian saya belajar. Saya akan memposting ini tetapi melihat apakah jawaban Jelly sudah ada di sana ... dan kemudian melihat ini ^^ Langkah saya: ¹©s2L€=2Ạa®s2E€Ạ... ḢƝs2E€Ạ... tapi saya tidak bisa mendapatkan apa yang saya inginkan, dan kemudian saya melihat Œœlol
V. Courtois


6

PHP ,58 56 byte

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

Cobalah online!

Sebagai fungsi rekursif.

PHP ,61 56 52 byte

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

Cobalah online!

Atau program mandiri. Input string via STDIN, output is truthy( 1) jika itu bunyi ganda, dan falsey( 0) jika bukan bunyi ganda.

-4 byte thx ke @ Night2 !


1
Ini muncul untuk menghasilkan 1 untuk string non-ganda berbicara, serta string ganda.
AJFaraday

@AJFaraday coba sekarang - bicara dua kali , bukan bicara dua kali
640KB

6

kode mesin 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

Masukkan string SI, masukkan panjang string dalam CX. Keluaran ZFjika berbicara dua kali lipat.

Atau 14 byte sebagai PC DOS yang dapat dieksekusi:

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 

Input melalui STDIN, baik pipa atau interaktif. Akan menggemakan input "dua kali lipat" sampai karakter yang tidak berlipat ganda terdeteksi, pada titik mana akan keluar (mungkin membengkokkan aturan I / O sedikit, tetapi ini hanya jawaban bonus).

masukkan deskripsi gambar di sini

Bangun dan uji ISDBL2.COM menggunakan xxd -r:

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

Asli 24 byte lengkap PC DOS executable:

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

Input dari baris perintah, output ke layar 'Y'jika ganda, 'N'jika tidak.

masukkan deskripsi gambar di sini

Bangun dan uji ISDBL.COM menggunakan xxd -r:

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

Kredit:

  • -2 byte thx ke @ErikF!

2
Sarankan menggunakan LOOPEalih-alih JNZ/ LOOPuntuk menyimpan 2 byte.
ErikF

@ErikF, brilian! Benar-benar lupa tentang itu!
640KB

6

Lua , 67 66 63 59 33 32 byte

-25 byte terima kasih kepada Giuseppe
-1 byte terima kasih kepada val

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

Cobalah online!

Hapus setiap karakter yang digandakan, lalu periksa apakah hasilnya kosong.


1
mengapa tidak adil i:gsub("(.)%1","")dan periksa apakah i==""?
Giuseppe

1
ini 34 byte, tidak sepenuhnya yakin itu valid karena saya belum pernah menulis Lua sebelumnya, tetapi tampaknya berhasil.
Giuseppe

selamat datang di Code Golf Stack Exchange!
Giuseppe

Saya berasumsi bahwa "(.)%1"dengan sendirinya termasuk tabrakan, tetapi tidak terpikir oleh saya bahwa dengan menggantinya sekali untuk semua tangkapan sudah cukup. Haruskah saya menerapkan solusi Anda atau Anda harus menulis jawaban Anda sendiri? Dan terimakasih!
HugoBDesigner

1
Ide bagus! arg[1]dapat diganti dengan (...)untuk menghemat satu byte.
val


5

MathGolf , 2 byte

½=

Cobalah online!

Pada dasarnya sama dengan jawaban 05AB1E, pisahkan ½string menjadi karakter genap dan ganjil, lalu periksa kesetaraannya. Pass untuk string kosong.



5

Haskell , 28 23 byte

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

Cobalah online!

Sangat mudah. Bicara ganda hanya kosong atau karakter yang berulang diucapkan untuk berbicara ganda.

Kurang mudah sekarang. Keluaran melalui ada atau tidak adanya kesalahan, per meta konsensus ; tidak ada kesalahan berarti bicara dua kali. Pencocokan pola gagal ketika dua karakter pertama berbeda atau ketika ada jumlah karakter ganjil. Terima kasih kepada Laikoni untuk penghematan ini!


4

V (vim) , 7 byte

Óˆ±
ø^$

Cobalah online! atau Verifikasi kasus uji

Hexdump:

00000000: d388 b10a d85e 24                        .....^$

Hanya dua regex. Penjelasan:

Ó   " Remove all occurrences...
 ˆ  "   Any character
  ± "   Followed by itself
    "   This regex is actually just the compressed form of (.)\1
ø   " Count the number of matches
 ^$ "   An empty line


4

PowerShell , 39 38 byte

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

Cobalah online!

di mana $pberisi char sebelumnya.

Tanpa rekursi , tanpa regex :). Mengambil input sebagai array char melalui string splatting (lihat tautan TIO).


PowerShell , 48 byte

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

Cobalah online!

Tidak ada rekursi , tidak ada regex dan tidak ada pipa: D. Ini juga mengambil input sebagai array-char melalui string splatting. $b-eq$aSebagai gantinya digunakan $a-eq$buntuk kasus ketika char terakhir memiliki kode # 0.


4

PowerShell , 64 59 byte

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

Cobalah online!

Fungsi rekursif, tidak ada regex. Mengambil input sebagai char-array (lihat tautan TIO). Lepaskan dua elemen pertama ke dalam $adan $b, simpan sisanya ke dalam $r. Jika kita masih memiliki elemen yang tersisa, kembalilah bersama $a -eq $b. Kalau tidak, periksa saja apakah $a -eq $b. Output tersirat.

-5 byte berkat mazzy


1
de-duplikat Cobalah online!
mazzy

1
@Mazzy, terima kasih! Saya melewatkan bagian $sebelum blok pernyataan dan tidak tahu mengapa itu tidak berhasil.
AdmBorkBork


4

J , 13 11 10 byte

-:2#_2{.\]

Cobalah online!

-2 byte terima kasih kepada Adám

-1 byte berkat mil

Penjelasan TLDR: Apakah input sama dengan setiap karakter lain dari input berlipat ganda?



-:2#_2{.\]harus menyimpan byte lain
mil

sangat baik, terima kasih @miles
Jonah

4

Bahasa Pemrograman Shakespeare , 204 156 byte

-48 byte terima kasih kepada Jo King (kebanyakan dengan mengubah metode output)

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.

Cobalah online!

Keluar dengan kesalahan jika inputnya adalah bicara dua kali, dan dengan peringatan jika itu bukan bicara ganda (yang diizinkan secara default).


4

Keg , 19 17 karakter

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

Penjelasan:

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

Cobalah online!


3

R , 53 34 byte

-19 byte berkat Giuseppe

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

Cobalah online!


1
Saya pikir gsub("(.)\\1","",a)==""akan melakukan trik juga; banyak lainnya menggunakan regex yang sama.
Giuseppe

@ Giuseppe Seluruh regex ini cukup baru bagi saya. Terima kasih.
Robert S.

R + pryr memberi Anda 32-byter yang dimodifikasi secara sepele dari jawaban ini.
Khuldraeseth na'Barya

2
Jika input dapat diambil sebagai vektor, maka function(a)!sum(rle(a)$l%%2)untuk 28
MickyT

3

Brain-Flak , 26 , 22 byte

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

Cobalah online!

Output 1 untuk false dan 0 untuk true.

Versi yang dapat dibaca:

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

Saya awalnya punya ini:

{
    ({}[{}])

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

Yang lebih panjang 10 byte.


Apakah 0 / non0 dianggap sebagai boolean? Jika demikian, Anda dapat melakukannya({({}[{}]){{}}{}})
Riley

3
lol di "Versi yang mudah dibaca" - sangat mudah dibaca: P
Quinn

@riley Tidak, itu tidak valid. Namun, saya menemukan trik yang lebih baik.
DJMcMayhem

@quinn Sepertinya dapat dibaca oleh saya: P
DJMcMayhem

3

QuadR , 11 byte

''≡⍵
(.)\1

Cobalah online!

''≡⍵ hasilnya adalah string kosong ketika

(.)\1 sebuah karakter diikuti dengan sendirinya

 digantikan oleh ketiadaan


3

JavaScript, 26 23 byte

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

Cobalah online!

Solusi Rekursif, 30 byte

Terima kasih kepada Arnauld untuk perbaikan dengan biaya 0 byte.

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

Cobalah online!



Terima kasih, @Arnauld :)
Shaggy

@Liver, omong kosong; hanya melihat solusi asli Anda sebelum memposting milik saya. Saya senang untuk kembali ke 26 jika Anda sampai ke 23 sebelum saya - beri tahu saya.
Shaggy


3

Zsh , 36 byte

Jawaban Zsh saya untuk tantangan sebelumnya dapat ditemukan di sini.

Keluar dari kebenaran (0) jika TIDAK berbicara dua kali, dan falsy (1) jika berbicara dua kali. (Sebagaimana diizinkan dalam komentar.)

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

Cobalah online!


3

Prolog (SWI) , 60 45 byte

terima kasih kepada Unrelated String

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

Cobalah online!

Mengubahnya dari string ke daftar jenis atom merusak skor, tapi yah ..



1
... sepertinya Anda juga dapat menggunakan atom_charsalih-alih string_chars, meskipun Anda mengambil string sebagai input, dan bukan atom. Tapi itu mungkin tidak relevan jika Anda dapat mengambil string dibatasi-backtick - yaitu, daftar kode char.
String yang tidak terkait
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.