İkili konuşmak mı?


45

Daha önceki bir mücadelede , kod golfçülerinden her karakteri bir dizgede kopyalayan dizeler üretmelerini istedim. Örneğin:

TThhiiss  iiss  ddoouubbllee  ssppeeaakk!!

Bu zorluk, basitçe, bir metnin bir çift konuşma dizesinin tanımına uyup uymadığını tespit etmektir.

  • Çok sayıda karakter var.
  • Çiftlere ayrıldığında, her çift aynı karakterden iki taneden oluşur.

Meydan okuma

  • Kod golf, birkaç baytta yap.
  • Seçtiğiniz herhangi bir dili kullanın.
  • Lütfen bir çevrimiçi tercümana bağlantı ekleyin.
  • Kod bazı metinleri kabul eder.
    • Basit olması için, giriş yalnızca yazdırılabilir ASCII karakterlerinden oluşacaktır.
  • Girişin çift konuşup konuşmadığına dair bir gösterge döndürür. Olabilir:
    • Bir boole
    • Dizeler ('doğru', 'yanlış', 'evet', 'hayır' vb.)
    • Tamsayılar 0 veya 1

Test Durumları:

  • aba - yanlış
  • abba - yanlış
  • aabb - doğru
  • aaabb - yanlış
  • tthhiiss - doğru
  • ttthhhiiisss - yanlış

6
2 uzunluğundaki girişlerde hata yapabilir miyiz?
cole,

3
Önerilen test vakası: abbahangisi yanlış olmalı
Giuseppe

2
Önerilen test davası: aabbbbhangi truthy olmalıdır
Khuldraeseth na'Barya

2
@ val Pekala, standart G / Ç ile tartışmayacağım
AJFaraday

2
Önerilen test durumu: 0Hangi yanlış olmalı.
640KB

Yanıtlar:



23

brainfuck , 20 bayt

Jo King sayesinde 1 byte kurtarıldı.

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

Çevrimiçi deneyin!

Okunabilir çıkış!

Aynı anda iki karakter girişi alır ve herhangi bir çift eşleşmezse, kasetteki 1'den uzağa hareket eder. EOF 0 olarak kabul edilir ve böylece otomatik olarak kullanılır.

Dizge çift konuşma değilse, çıktı bir boş byte, öyleyse 0x01 olur. Okunabilir sürüm, bunları 14 baytlık bir maliyetle karakter olarak verir.


Dil adı nedeniyle tamamen yeni oy kullanıldı. HAHA Harika bir çözüm!
PerpetualJ

Yorumları reddedebilseydim yukarıdaki yorumları reddederdim.
A _

16

MATL , 4 bayt

Heda

Giriş, tek qoutes içeren bir dizedir. Aksi halde çıktı 0çift ​​konuşma içindir 1.

Çevrimiçi deneyin!

açıklama

'TThhiiss iiss ddoouubbllee ssppeeaakk!!'Bir örnek olarak girişi düşünün .

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 ... "Heda" kim? : D
Outgolfer Erik

7
"Heda", "Hey! Sen!"
QBrute,

14

05AB1E , 6 5 2 bayt

ιË

Bir karakter listesi olarak giriş yapın.

Shaggy'nin Japt cevabını taşıyarak -3 byte , bu yüzden onu oyladığınızdan emin olun!

Çevrimiçi deneyin ya da birkaç test vakası daha doğrulayın .

Açıklama:

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

ó r¶

Dene

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

Alternatif

ó
¥o

Dene


9

Retina , 9 bayt

(.)\1

^$

Çevrimiçi deneyin.

Açıklama:

Aynı karakterin tüm çiftlerini kaldırın:

(.)\1

Kalan karakter olup olmadığını kontrol edin:

^$

1
^$Son aşama olarak kullanarak daha geleneksel çıktılar sağlayabilirsiniz .
Neil

@Neil Ah elbette, teşekkürler! Bu gerçekten daha iyi görünüyor. Ben her zaman tuhaf falseve sahte olarak çıktının garip olduğunu düşünüyorum true(ama bir bayt kurtarırsa ve izin verilirse, yine de kullanırım). ;) Ancak bu beklenen sonuçları veren eşit baytlık bir çözüm olduğundan, bu daha iyidir.
Kevin Cruijssen

8

Jöle , 3 bayt

ŒœE

Çevrimiçi deneyin!


1
Hey, bu hoşuma gitti! Aynı lol yapmak için bana 80mn aldı, ben "hey şimdi Jelly öğrenelim" gibiydi sonra öğrendim. Bunu göndermek üzereydim ama jöle cevaplar zaten olsaydı baktım ... ve sonra ^^ bu gördüğümüz Benim adımlar: ¹©s2L€=2Ạa®s2E€Ạ... ḢƝs2E€Ạ... ama istediğim, sonra ne gördüğümü almak için başaramadılar Œœlol
V. Courtois


6

PHP ,58 56 bayt

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

Çevrimiçi deneyin!

Özyinelemeli bir işlev olarak.

PHP ,61 56 52 bayt

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

Çevrimiçi deneyin!

Veya bağımsız bir program. Giriş dizesi üzerinden STDIN, çifte konuşma varsa , çıkış truthy( 1), ve çifte konuşma değilse falsey( 0).

-4 byte @ Night2 ye thx !


1
Bu, çift olmayan bir konuşma dizgisinin yanı sıra çift konuşma dizgisinin çıktısı 1 olarak görünür.
AJFaraday

@AJFaraday şimdi deneyin - çift ​​konuşma , çift ​​konuşma değil
640KB

6

x86 makine kodu, 9 7 bayt

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

Giriş dizgisi SIgirişi, giriş dizesi uzunluğu girişi CX. ZFÇift konuşma ise çıktı .

Veya tam bir PC DOS çalıştırılabilir dosyası olarak 14 bayt :

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 

Giriş, STDINboru veya etkileşimli yoluyla yapılır . İki katına çıkarılmamış bir karakter algılanana kadar "iki katına çıkarılmış" girdiyi ekleyecektir, bu noktada hangi noktadan çıkacaktır (belki de G / Ç kurallarını biraz bükmek, ancak bu sadece bir bonus cevabıdır).

görüntü tanımını buraya girin

ISDBL2.COM'u kullanarak test edin ve test edin xxd -r:

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

Orijinal 24 bayt tam PC DOS çalıştırılabilir:

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

Komut satırından giriş yapın, 'Y'eğer çift 'N'değilse , ekrana gönderin .

görüntü tanımını buraya girin

ISDBL.COM kullanarak derleyin ve test edin xxd -r:

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

Kredi:

  • -2 bayt @ErikF!

2
2 bayt kaydetmek için / LOOPEyerine kullanılmasını önerin . JNZLOOP
ErikF

@ErikF, ışıl ışıl! Bunu tamamen unuttum!
640KB

6

Lua , 67 66 63 59 33 32 bayt

-25 bayt sayesinde Giuseppe
-1 bayt sayesinde val

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

Çevrimiçi deneyin!

İki katına çıkan her karakteri kaldırır, ardından sonucun boş olup olmadığını kontrol eder.


1
neden sadece değil i:gsub("(.)%1","")ve kontrol i==""?
Giuseppe

1
bu 34 bayttır, daha önce Lua'yı hiç yazmadığım için geçerli olduğundan emin değilim, ama işe yarıyor.
Giuseppe

Ancak Kod Golf Yığın Borsasına hoş geldiniz!
Giuseppe

"(.)%1"Kendi başına çarpışmalar içerdiğini varsaydım , ancak tüm yakalamalar için bir kez değiştirmenin yeterli olacağı aklıma gelmedi. Çözümünüzü uygulamalı mıyım veya kendi cevabınızı yazmalı mıyım? Ve teşekkürler!
HugoBDesigner

1
İyi fikir! bir bayt kaydetmek arg[1]için ile değiştirilebilir (...).
val




5

Haskell , 28 23 bayt

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

Çevrimiçi deneyin!

Çok basit. İkili konuşma yalnızca boştur veya ikili konuşmaya hazırlanan tekrarlanan bir karakterdir.

Şimdi daha az basit. Meta konsensüs başına bir hatanın varlığı veya yokluğu ile çıktılar ; hata yok, çift konuşma demektir. İlk iki karakter farklı olduğunda veya tek sayıda karakter olduğunda desen eşleşmesi başarısız olur. Bu tasarruf için Laikoni'ye teşekkürler !




4

PowerShell , 39 38 bayt

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

Çevrimiçi deneyin!

nerede $pbir önceki kömürü içerir.

Hiçbir tekrarlama , hiçbir regex :). Sıçrayan bir dize ile girişi karakter dizisi olarak alır (bkz. TIO bağlantısı).


PowerShell , 48 bayt

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

Çevrimiçi deneyin!

Resim yineleme , herhangi bir normal ifade ve bir boru: D. Ayrıca sıçrayan bir dizge üzerinden bir karakter dizisi olarak girdi alır. Bunun $b-eq$ayerine $a-eq$b, son karakterin # 0 kodu olması durumunda kullanılır.


4

PowerShell , 64 59 bayt

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

Çevrimiçi deneyin!

Özyinelemeli işlevi, regex yok. Girdiyi bir chardizi olarak alır (bkz. TIO bağlantısı). İlk iki içine elemanları sıyrılmakta $ave $bdepolar halinde kalan, $r. Hala kalan elementlerimiz varsa, birlikte tekrarlayın $a -eq $b. Aksi takdirde sadece kontrol edip etmediğinizi kontrol edin $a -eq $b. Çıktı kapalı.

Mazzy sayesinde -5 bayt


1
de-duplicate Çevrimiçi deneyin!
mazzy

1
@mazzy Teşekkürler! $Açıklama bloğundan önce eksikti ve neden işe yaramadığını çözemedim.
AdmBorkBork


4

J , 13 11 10 bayt

-:2#_2{.\]

Çevrimiçi deneyin!

Adám sayesinde -2 bayt

Miller sayesinde -1 bayt

TLDR açıklaması: Giriş, girişin diğer karakterleriyle iki katına aynı mı?



-:2#_2{.\]başka bir bayt kurtarması gerekir
mil

çok güzel, teşekkürler @miles
Jonah

4

Shakespeare Programlama Dili , 204 156 bayt

Jo King sayesinde -48 bayt (çoğunlukla çıktı yöntemini değiştirerek)

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.

Çevrimiçi deneyin!

Giriş çift konuşma ise hata ile, çift konuşma konuşma değilse ( varsayılan olarak izin verilir ) uyarı ile çıkar .


4

Fıçı , 19 17 karakter

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

Açıklama:

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

Çevrimiçi deneyin!



3

Brain-Flak , 26 , 22 bayt

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

Çevrimiçi deneyin!

False için 1 ve true için 0 çıkışı.

Okunabilir sürüm:

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

Başlangıçta bu vardı:

{
    ({}[{}])

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

10 bayt daha uzun.


0 / non0, bir boole olarak sayılır mı? Öyleyse, yapabilirsiniz({({}[{}]){{}}{}})
Riley

3
lol "Okunabilir versiyonda" - çok çok okunaklı: P
Quinn

@riley Hayır, bu geçerli değil. Ancak daha iyi bir numara buldum.
DJMcMayhem

@quinn Bana okunabilir görünüyor: P
DJMcMayhem

3

QuadR , 11 bayt

''≡⍵
(.)\1

Çevrimiçi deneyin!

''≡⍵ sonuç, boş bir dize olduğunda

(.)\1 kendisi tarafından takip edilen bir karakter

 hiçbir şey ile değiştirilmez


3

JavaScript, 26 23 bayt

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

Çevrimiçi deneyin!

Özyinelemeli Çözüm, 30 bayt

Arnauld'a 0 bayt pahasına bir düzeltme için teşekkürler.

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

Çevrimiçi deneyin!



Teşekkürler, @Arnauld :)
Shaggy,

@ Avukat, bok; yalnızca benim gönderimden önce orijinal çözümünüzü gördüm. Benden önce 23’e geçerseniz 26’ya geri döndüğüm için mutluyum - bana bildirin.
Shaggy,


3

Zsh , 36 bayt

Zsh önceki meydan okumaya cevabını burada bulabilirsiniz.

Çifte konuşma DEĞİLDİRME (0), çifte konuşma olursa sahte (1) 'den çıkar. (Bir yoruma izin verildiği gibi.)

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

Çevrimiçi deneyin!


3

Prolog (SWI) , 60 45 bayt

İlişkili Dize sayesinde

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

Çevrimiçi deneyin!

Bir dizgiden bir atom listesine dönüştürmek, skoru biraz mahvetti, ama iyi ..



1
... bir dize değil bir atom alsanız bile, atom_charsyerine de kullanabilirsiniz string_chars. Ancak, bir backtick ile sınırlanmış dize alabiliyorsanız bu konu dışı olabilir - yani, bir char kodları listesi.
İlişkisiz Dize
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.