Czy to podwójne mówienie?


46

We wcześniejszym wyzwaniu poprosiłem golfistów o napisanie ciągów, które kopiują każdy znak w ciągu. Na przykład:

TThhiiss  iiss  ddoouubbllee  ssppeeaakk!!

Wyzwanie polega po prostu na wykryciu, czy jakiś tekst spełnia definicję ciągu podwójnie mówionego.

  • Jest parzysta liczba znaków.
  • Po podzieleniu na pary każda para składa się z dwóch takich samych postaci.

Wyzwanie

  • To jest golf golfowy, zrób to w kilka bajtów.
  • Użyj dowolnego wybranego języka.
  • Podaj link do tłumacza online.
  • Kod zaakceptuje trochę tekstu.
    • Dla uproszczenia dane wejściowe będą składały się wyłącznie z drukowalnych znaków ASCII
  • Zwróci wskazanie, czy wejście jest podwójnym mówieniem. Mogłoby być:
    • Wartość logiczna
    • Ciągi znaków („prawda”, „fałsz”, „tak”, „nie” itp.)
    • Liczby całkowite 0 lub 1

Przypadki testowe:

  • aba - fałsz
  • abba - false
  • aabb - prawda
  • aaabb - fałsz
  • tthhiiss - prawda
  • ttthhhiiisss - false

6
Czy możemy popełnić błąd na wejściach o długości <2?
cole

3
Sugerowany przypadek testowy: abbaktóry powinien być falsey
Giuseppe

2
Sugerowany przypadek testowy: aabbbbktóry powinien być prawdą
Khuldraeseth na'Barya

2
@val Cóż, nie zamierzam kłócić się ze standardowym We / Wy
AJFaraday

2
Sugerowany przypadek testowy: 0który powinien być falsey.
640 KB

Odpowiedzi:



24

pieprzenie mózgu , 20 bajtów

Zaoszczędzono 1 bajt dzięki Jo Kingowi.

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

Wypróbuj online!

Czytelny wynik!

Pobiera dane po dwa znaki na raz i odsuwa się od 1 na taśmie, jeśli którakolwiek para nie pasuje. EOF jest traktowany jako 0 i dlatego jest obsługiwany automatycznie.

Dane wyjściowe to bajt zerowy, jeśli ciąg nie mówi podwójnie, a 0x01, jeśli jest. Czytelna wersja wyświetla je jako znaki, kosztem 14 bajtów.


Gdybym mógł głosować na komentarze, głosowałbym na powyższy komentarz.
A

@PerpetualJ A) To bardzo popularny esolang, nie mogę uwierzyć, że jeszcze o nim nie słyszałeś B) To nie jest powód do głosowania
Programy Redwolf

@RedwolfPrograms Zgodnie z zasadami SE, należy głosować, czy post był pomocny i był pomocny w nauce nazwy języka, o którym nigdy nie słyszałem. Ponadto jest to świetne rozwiązanie zasługujące na aprobatę.
PerpetualJ

1
@PerpetualJ Zgodził się, że to świetne rozwiązanie, ale jest wiele esolangów o śmiesznych nazwach i nudnych rozwiązaniach (głównie warianty BF)
Programy Redwolf

17

MATL , 4 bajty

Heda

Dane wejściowe to ciąg znaków, zamknięty pojedynczymi qoutami. Wyjście jest 0dla podwójnego mówienia, w 1przeciwnym razie.

Wypróbuj online!

Wyjaśnienie

Rozważ dane wejściowe 'TThhiiss iiss ddoouubbllee ssppeeaakk!!'jako przykład.

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 ... kim jest „Heda”? : D
Erik the Outgolfer,

7
„Heda” to po niemiecku „Hej! Ty!”
QBrute

14

05AB1E , 6 5 2 bajty

ιË

Wprowadź jako listę znaków.

-3 bajty przez przeniesienie odpowiedzi @ Shaggy's Japt , więc upewnij się, że go głosujesz!

Wypróbuj online lub sprawdź kilka innych przypadków testowych .

Wyjaśnienie:

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

Siatkówka , 9 bajtów

(.)\1

^$

Wypróbuj online.

Wyjaśnienie:

Usuń wszystkie pary tych samych znaków:

(.)\1

Sprawdź, czy nie pozostały żadne znaki:

^$

1
Możesz zapewnić bardziej tradycyjny wynik, używając go ^$jako ostatniego etapu.
Neil

@Neil Ah oczywiście, dziękuję! To rzeczywiście wygląda lepiej. Zawsze myślę, że to dziwne falsewyjście jako prawdomówne i truefalsey (ale jeśli oszczędza bajt i jest dozwolone, nadal będę go używać). ;) Ale ponieważ jest to rozwiązanie o równych bajtach, generujące oczekiwane wyniki, jest to lepsze.
Kevin Cruijssen

8

Galaretka , 3 bajty

ŒœE

Wypróbuj online!


1
Hej, podoba mi się to! 80 minut zajęło mi zrobienie tego samego lol, pomyślałem: „hej, nauczmy się teraz galaretki”, a potem się nauczyłem. Właśnie miałem to opublikować, ale sprawdziłem, czy odpowiedzi Jelly już tam są ... a potem zobaczyłem to ^^ Moje kroki: ¹©s2L€=2Ạa®s2E€Ạ... ḢƝs2E€Ạ... ale nie udało mi się zdobyć tego, czego chciałem, a potem zobaczyłem Œœlol
V. Courtois,


6

PHP ,58 56 bajtów

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

Wypróbuj online!

Jako funkcja rekurencyjna.

PHP ,61 56 52 bajty

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

Wypróbuj online!

Lub samodzielny program. Łańcuch wejściowy przez STDIN, wyjściem jest truthy( 1), jeśli jest to podwójne mówienie, i falsey( 0), jeśli nie jest podwójne mówienie.

-4 bajtów dzięki @ Night2 !


1
Wydaje się, że jest to wyjście 1 dla niedwójnego łańcucha mówionego, jak również podwójnego łańcucha mówionego.
AJFaraday

@AJFaraday spróbuj teraz - mówi podwójnie , nie mówi podwójnie
640 KB

6

kod maszynowy x86, 9 7 bajtów

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

Łańcuch wejściowy w SI, długość łańcucha wejściowego w CX. Wyjście, ZFjeśli mów podwójnie.

Lub 14 bajtów jako kompletny plik wykonywalny DOS na PC:

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 

Wejście odbywa się za pośrednictwem STDINpotoku lub interaktywne. Powtórzy echo wejścia „zdublowanego”, dopóki nie zostanie wykryty znak, który nie zostanie podwojony, w którym to momencie nastąpi wyjście (być może zginanie we / wy trochę rządzi, ale jest to tylko odpowiedź dodatkowa).

enter image description here

Zbuduj i przetestuj ISDBL2.COM przy użyciu xxd -r:

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

Oryginalny 24-bajtowy plik wykonywalny DOS na PC:

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

Wejście z wiersza poleceń, wyjście na ekran, 'Y'jeśli podwójne, 'N'jeśli nie.

enter image description here

Zbuduj i przetestuj ISDBL.COM przy użyciu xxd -r:

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

Kredyty:

  • -2 bajty dzięki xErikF!

2
Sugeruje użycie LOOPEzamiast JNZ/ LOOPdo zapisania 2 bajtów.
ErikF

@ErikF, genialne! Zupełnie o tym zapomniałem!
640 KB

6

Lua , 67 66 63 59 33 32 bajty

-25 bajtów dzięki Giuseppe
-1 bajtów dzięki val

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

Wypróbuj online!

Usuwa każdy podwójny znak, a następnie sprawdza, czy wynik jest pusty.


1
dlaczego nie tylko i:gsub("(.)%1","")i sprawdzić, czy i==""?
Giuseppe

1
to 34 bajty, nie jestem całkowicie pewien, czy jest poprawny, ponieważ nigdy wcześniej nie pisałem Lua, ale wydaje się, że działa.
Giuseppe

witamy na Code Golf Stack Exchange!
Giuseppe

Zakładałem, że "(.)%1"samo w sobie obejmuje kolizje, ale nie przyszło mi do głowy, że zastąpienie go raz na zawsze wystarczy. Czy powinienem wdrożyć twoje rozwiązanie, czy powinieneś napisać własną odpowiedź? I dzięki!
HugoBDesigner,

1
Dobry pomysł! arg[1]można zastąpić przez, (...)aby zapisać jeden bajt.
val


5

MathGolf , 2 bajty

½=

Wypróbuj online!

Zasadniczo to samo co odpowiedź 05AB1E, ½dzieli ciąg na parzyste i nieparzyste znaki, a następnie sprawdza równość. Przechodzi do pustego ciągu.



5

Haskell , 28 23 bajtów

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

Wypróbuj online!

Bardzo proste. Podwójne mówienie jest tylko puste lub powtarzana postać poprzedza podwójne mówienie.

Teraz mniej proste. Wyprowadza przez obecność lub brak błędu, zgodnie z meta-konsensusem ; brak błędu oznacza podwójne mówienie. Dopasowanie wzorca kończy się niepowodzeniem, gdy dwa pierwsze znaki różnią się lub gdy liczba znaków jest nieparzysta. Dzięki Laikoni za te oszczędności!


4

V (vim) , 7 bajtów

Óˆ±
ø^$

Wypróbuj online! lub Zweryfikuj przypadki testowe

Hexdump:

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

Tylko dwa wyrażenia regularne. Wyjaśnienie:

Ó   " 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 bajtów

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

Wypróbuj online!

gdzie $p zawiera poprzedni znak.

Bez rekurencji , bez wyrażeń regularnych :). Pobiera dane wejściowe jako tablicę znaków za pomocą łańcucha rozpryskiwania (patrz link TIO).


PowerShell , 48 bajtów

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

Wypróbuj online!

Bez rekurencji , bez wyrażenia regularnego i bez potoku: D. Pobiera również dane wejściowe jako tablicę znaków za pomocą łańcucha rozpryskiwania. $b-eq$aZamiast tego stosuje $a-eq$bsię w przypadku, gdy ostatni znak ma kod # 0.


4

PowerShell , 64 59 bajtów

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

Wypróbuj online!

Funkcja rekurencyjna, bez wyrażeń regularnych. Pobiera dane wejściowe jako chartablicę (patrz link TIO). Odrywa pierwsze dwa elementy do $ai $b, a pozostałe przechowuje $r. Jeśli nadal mamy elementy, wróć wraz z $a -eq $b. W przeciwnym razie po prostu sprawdź, czy $a -eq $b. Wynik jest niejawny.

-5 bajtów dzięki mazzy


1
usuń duplikat Wypróbuj online!
mazzy

1
@mazzy Thanks! Brakowało mi $bloku przed wyciągiem i nie mogłem zrozumieć, dlaczego to nie działa.
AdmBorkBork


4

J , 13 11 10 bajtów

-:2#_2{.\]

Wypróbuj online!

-2 bajty dzięki Adámowi

-1 bajt dzięki milom

Wyjaśnienie TLDR: Czy dane wejściowe są takie same, jak każdy inny znak danych wejściowych podwajany?



-:2#_2{.\]powinien zapisać kolejny bajt
mile

bardzo ładne, dzięki @miles
Jonah

4

Shakespeare Programming Language , 204 156 bajtów

-48 bajtów dzięki Jo Kingowi (głównie przez zmianę metody wyjściowej)

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.

Wypróbuj online!

Wychodzi z błędem, jeśli wejście jest podwójnym mówieniem, oraz z ostrzeżeniem, jeśli nie jest to podwójne mówienie (co jest domyślnie dozwolone ).


4

Keg , 19 17 znaków

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

Wyjaśnienie:

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

Wypróbuj online!


3

R , 53 34 bajty

-19 bajtów dzięki Giuseppe

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

Wypróbuj online!


1
Myślę, że gsub("(.)\\1","",a)==""zrobiłbym to samo; wiele innych używa tego samego wyrażenia regularnego.
Giuseppe,

@Giuseppe Ta cała regex jest dla mnie całkiem nowa. Dzięki.
Robert S.

R + pryr daje ci 32-bajtowy trywialnie zmodyfikowany z tej odpowiedzi.
Khuldraeseth na'Barya

2
Jeśli dane wejściowe można przyjąć jako wektor, to function(a)!sum(rle(a)$l%%2)dla 28
MickyT

3

Brain-Flak , 26 , 22 bajtów

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

Wypróbuj online!

Wyjście 1 dla wartości false i 0 dla wartości true.

Wersja do odczytu:

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

Pierwotnie miałem to:

{
    ({}[{}])

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

Co jest o 10 bajtów dłuższe.


Czy 0 / non0 liczy się jako wartość logiczna? Jeśli tak, możesz to zrobić({({}[{}]){{}}{}})
Riley

3
lol na „Readable version” - jego tak bardzo czytelny: P
Quinn

@riley Nie, to nie jest poprawne. Znalazłem jednak lepszą sztuczkę.
DJMcMayhem

@quinn Wygląda na czytelny: P
DJMcMayhem

3

QuadR , 11 bajtów

''≡⍵
(.)\1

Wypróbuj online!

''≡⍵ wynikiem jest pusty ciąg, gdy

(.)\1 postać, po której następuje sama

 jest zastąpiony przez nic


3

JavaScript, 26 23 bajtów

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

Wypróbuj online!

Rozwiązanie rekurencyjne, 30 bajtów

Dziękujemy Arnauldowi za naprawę kosztem 0 bajtów.

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

Wypróbuj online!



Dzięki, @Arnauld :)
Shaggy

@Oliver, bzdury; zobaczyłem tylko oryginalne rozwiązanie przed wysłaniem mojego. Z przyjemnością cofnę się do 26, jeśli dotarłeś do tego 23 przede mną - daj mi znać.
Shaggy


3

Zsh , 36 bajtów

Moja odpowiedź Zsh na poprzednie wyzwanie można znaleźć tutaj.

Wychodzi z prawdy (0), jeśli NIE mówi podwójnie, i falsy (1), jeśli mówi podwójnie. (Zgodnie z komentarzem.)

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

Wypróbuj online!


3

Prolog (SWI) , 60 45 bajtów

dzięki niepowiązanemu ciągowi

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

Wypróbuj online!

Przekształcenie go z łańcucha na listę atomów zepsuło wynik, ale cóż ...



1
... wygląda na to, że możesz także użyć atom_charszamiast tego string_chars, nawet jeśli bierzesz łańcuch jako dane wejściowe, a nie atom. Ale może to nie mieć znaczenia, jeśli możesz wziąć ciąg rozdzielany znakami wstecznymi - to znaczy listę kodów znaków.
Niepowiązany ciąg
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.