Ist es doppelt zu sprechen?

46

Bei einer früheren Herausforderung habe ich Codegolfer gebeten, Zeichenfolgen zu erstellen, die jedes Zeichen in einer Zeichenfolge kopieren. Zum Beispiel:

TThhiiss  iiss  ddoouubbllee  ssppeeaakk!!

Diese Herausforderung besteht einfach darin, festzustellen, ob ein Text die Definition einer Doppelsprechzeichenfolge erfüllt.

  • Es gibt eine gerade Anzahl von Zeichen.
  • Bei der Aufteilung in Paare besteht jedes Paar aus zwei gleichen Zeichen.

Die Herausforderung

  • Es ist Codegolf, machen Sie es in wenigen Bytes.
  • Verwenden Sie eine beliebige Sprache.
  • Bitte fügen Sie einen Link zu einem Online-Dolmetscher bei.
  • Der Code akzeptiert Text.
    • Der Einfachheit halber besteht die Eingabe nur aus druckbaren ASCII-Zeichen
  • Es wird eine Anzeige zurückgegeben, ob der Eingang Doppelsprache ist oder nicht. Es könnte sein:
    • Ein Boolescher
    • Zeichenfolgen ('true', 'false', 'yes', 'no' usw.)
    • Ganzzahlen 0 oder 1

Testfälle:

  • aba - falsch
  • abba - falsch
  • aabb - wahr
  • aaabb - falsch
  • tthhiiss - wahr
  • ttthhhiiisss - falsch
AJFaraday
quelle
6
Dürfen wir bei Eingaben mit einer Länge <2 Fehler machen?
Cole
3
Vorgeschlagener Testfall: Das abbasollte falsch sein
Giuseppe
2
Vorgeschlagener Testfall: aabbbb
Was wahr
2
@val Nun, ich werde nicht mit Standard-I / O
AJFaraday
2
Vorgeschlagener Testfall: Der 0sollte falsch sein.
7.

Antworten:

24

Brainfuck , 20 Bytes

Dank Jo King 1 Byte gespeichert.

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

Probieren Sie es online!

Lesbare Ausgabe!

Nimmt die Eingabe von zwei Zeichen gleichzeitig vor und entfernt sich von der 1 auf dem Band, wenn ein Paar nicht übereinstimmt. EOF wird als 0 behandelt und somit automatisch behandelt.

Die Ausgabe ist ein Null-Byte, wenn der String nicht doppelt gesprochen wird, und 0x01, wenn dies der Fall ist. Die lesbare Version gibt diese als Zeichen zum Preis von 14 Byte aus.

Nitrodon
quelle
Wenn ich Kommentare ablehnen könnte, würde ich den obigen Kommentar ablehnen.
A _
@PerpetualJ A) Es ist ein sehr beliebter Esolang. Ich kann nicht glauben, dass Sie noch nicht davon gehört haben. B) Das ist kein Grund für eine Aufwertung.
Redwolf Programs vor
@RedwolfPrograms Per SE-Regeln sollten Sie positiv stimmen, wenn der Beitrag hilfreich war, und es war hilfreich, mir den Namen einer Sprache beizubringen, von der ich noch nie gehört hatte. Außerdem ist es eine großartige Lösung, die eine positive Bewertung verdient.
PerpetualJ vor
1
@PerpetualJ Einverstanden, dass es eine großartige Lösung ist, aber es gibt viele Esolangs mit lustigen Namen und langweiligen Lösungen (hauptsächlich BF-Varianten)
Redwolf-Programme vor
17

MATL , 4 Bytes

Heda

Die Eingabe ist eine Zeichenfolge, die von einzelnen qoutes eingeschlossen wird. Die Ausgabe ist 0für Doppelsprache, 1ansonsten.

Probieren Sie es online!

Erläuterung

Betrachten Sie die Eingabe 'TThhiiss iiss ddoouubbllee ssppeeaakk!!'als Beispiel.

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
Luis Mendo
quelle
12
Ähm ... wer ist "Heda"? : D
Erik der Outgolfer
7
"Heda" ist deutsch für "Hey! Du!"
QBrute
14

05AB1E , 6 5 2 Bytes

ιË

Eingabe als Liste von Zeichen.

-3 Bytes, indem Sie @ Shaggy's Japt-Antwort portieren , also stellen Sie sicher, dass Sie ihn unterstützen!

Probieren Sie es online aus oder überprüfen Sie ein paar weitere Testfälle .

Erläuterung:

ι   # 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)
Kevin Cruijssen
quelle
11

Japt , 4 Bytes

ó r¶

Versuch es

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

Alternative

ó
¥o

Versuch es

Zottelig
quelle
10

Netzhaut , 9 Bytes

(.)\1

^$

Probieren Sie es online aus.

Erläuterung:

Entferne alle Paare der gleichen Charaktere:

(.)\1

Überprüfen Sie, ob keine Zeichen mehr vorhanden sind:

^$
Kevin Cruijssen
quelle
1
Sie können eine traditionellere Ausgabe bereitstellen, indem Sie ^$als letzte Stufe verwenden.
Neil
@ Neil Ah natürlich, danke! Das sieht in der Tat besser aus. Ich denke immer, dass es seltsam ist, falseals wahr und trueals falsch auszugeben (aber wenn es ein Byte speichert und es erlaubt ist, werde ich es immer noch verwenden). ;) Da dies jedoch eine Lösung mit gleichen Bytes ist, die die erwarteten Ergebnisse ausgibt, ist dies besser.
Kevin Cruijssen
8

Gelee , 3 Bytes

ŒœE

Probieren Sie es online!

Erik der Outgolfer
quelle
1
Hey das gefällt mir! Ich brauchte 80 Minuten, um das Gleiche zu tun. Ich dachte: "Hey, lass uns jetzt Jelly lernen." Dann lernte ich. Ich wollte das posten, sah aber nach, ob Jellys Antworten schon da waren ... und dann sah ich das ^^ Meine Schritte: ¹©s2L€=2Ạa®s2E€Ạ... ḢƝs2E€Ạ... aber ich konnte nicht bekommen, was ich wollte, und dann sah ich Œœlach
V. Courtois
8

Stax , 5 Bytes

■◄┼$Δ

Führen Sie es aus und debuggen Sie es

Verfahren:

  • Lauflängen berechnen.
  • Holen Sie sich die GCD des Arrays.
  • Ist gerade?
rekursiv
quelle
Ahh, du hast einen, der packt. Nett.
Khuldraeseth na'Barya
Ich mag diesen Algorithmus!
Jonah
6

PHP ,58 56 Bytes

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

Probieren Sie es online!

Als rekursive Funktion.

PHP ,61 56 52 Bytes

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

Probieren Sie es online!

Oder eigenständiges Programm. Eingabezeichenfolge über STDIN, Ausgabe ist truthy( 1), wenn doppelt gesprochen wird, und falsey( 0), wenn nicht doppelt gesprochen wird.

-4 Bytes Danke an @ Night2 !

640 KB
quelle
1
Dies scheint 1 für eine Nicht-Doppelsprechzeichenfolge sowie eine Doppelsprechzeichenfolge auszugeben.
AJFaraday
@ AjFaraday versuchen Sie es jetzt - ist Double Speak , ist nicht Double
Speak
6

x86-Maschinencode, 9 7 Bytes

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

Eingabezeichenfolge in der SIEingangszeichenfolgenlänge in CX. Ausgabe ZFwenn doppelt gesprochen wird.

Oder 14 Bytes als vollständige ausführbare PC-DOS-Datei:

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 

Die Eingabe erfolgt STDINentweder über Pipe oder interaktiv. Gibt die "de-doubled" -Eingabe wieder, bis ein nicht verdoppeltes Zeichen erkannt wird. An diesem Punkt wird die Eingabe beendet (möglicherweise gibt es ein wenig Regeln für die Biege-E / A, dies ist jedoch nur eine Bonusantwort).

Bildbeschreibung hier eingeben

Erstellen und testen Sie ISDBL2.COM mit xxd -r:

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

Ursprüngliche 24 Byte vollständige ausführbare PC-DOS-Datei:

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

Eingabe von der Kommandozeile, Ausgabe auf dem Bildschirm 'Y', 'N'wenn nicht, wenn doppelt .

Bildbeschreibung hier eingeben

Erstellen und testen Sie ISDBL.COM mit xxd -r:

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

Credits:

  • -2 Bytes danke an @ErikF!
640 KB
quelle
2
Schlagen Sie vor, LOOPEanstelle von JNZ/ LOOP2 Bytes zu speichern.
ErikF
@ ErikF, brillant! Das habe ich komplett vergessen!
7.
6

Lua , 67 66 63 59 33 32 Bytes

-25 Bytes dank Giuseppe
-1 Bytes dank val

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

Probieren Sie es online!

Entfernt jedes doppelte Zeichen und prüft, ob das Ergebnis leer ist.

HugoBDesigner
quelle
1
warum nicht einfach i:gsub("(.)%1","")mal nachschauen ob i==""?
Giuseppe
1
Das sind 34 Bytes, nicht ganz sicher, ob es gültig ist, da ich Lua noch nie geschrieben habe, aber es scheint zu funktionieren.
Giuseppe
Willkommen bei Code Golf Stack Exchange!
Giuseppe
Ich nahm an, dass "(.)%1"Kollisionen von sich aus eingeschlossen waren, aber es kam mir nicht in den Sinn, dass es ausreichen würde, sie einmal für alle Erfassungen auszutauschen. Sollte ich Ihre Lösung implementieren oder sollten Sie Ihre eigene Antwort schreiben? Und danke!
HugoBDesigner
1
Gute Idee! arg[1]kann durch ersetzt werden (...), um ein Byte zu sparen.
val
5

Perl 5 , 15 Bytes

$_=/^((.)\2)*$/

Probieren Sie es online!

Ausgänge 1 für doppeltes Sprechen, nichts für nicht doppeltes Sprechen.

wastl
quelle
5

MathGolf , 2 Bytes

½=

Probieren Sie es online!

Im Grunde das gleiche wie die 05AB1E-Antwort, ½teilt die Zeichenfolge in gerade und ungerade Zeichen auf und prüft dann auf Gleichheit. Übergibt die leere Zeichenfolge.

maxb
quelle
5

Haskell , 28 23 Bytes

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

Probieren Sie es online!

Sehr einfach. Double Speak ist nur leer oder ein wiederholtes Zeichen, das vor Double Speak steht.

Jetzt weniger einfach. Ausgaben über Vorhandensein oder Nichtvorhandensein eines Fehlers, per Metakonsens ; Kein Fehler bedeutet doppeltes Sprechen. Der Mustervergleich schlägt fehl, wenn sich die ersten beiden Zeichen unterscheiden oder wenn eine ungerade Anzahl von Zeichen vorhanden ist. Vielen Dank an Laikoni für diese Einsparungen!

Khuldraeseth na'Barya
quelle
4

V (vim) , 7 Bytes

Óˆ±
ø^$

Probieren Sie es online! oder Testfälle überprüfen

Hexdump:

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

Nur zwei reguläre Ausdrücke. Erläuterung:

Ó   " 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
DJMcMayhem
quelle
4

Brachylog , 5 Bytes

ġ₂z₂=

Probieren Sie es online!

Erfolg oder Misserfolg.

ġ₂       The at-most-length-2 chunks of the input,
  z₂     which have equal length, zipped together,
    =    are equal.
Nicht verwandte Zeichenfolge
quelle
4

PowerShell , 39 38 Bytes

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

Probieren Sie es online!

wo $penthält ein früheres Zeichen.

Keine Rekursion , kein Regex :). Übernimmt die Eingabe als Zeichen-Array über einen Splatting-String (siehe TIO-Link).


PowerShell , 48 Byte

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

Probieren Sie es online!

Keine Rekursion , kein Regex und keine Pipe: D. Es nimmt auch Eingaben als Zeichen-Array über eine Splatting-Zeichenfolge entgegen. Es wird $b-eq$astattdessen $a-eq$bfür den Fall verwendet, dass ein letztes Zeichen den Code # 0 hat.

mazzy
quelle
4

Power , 64 59 Bytes

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

Probieren Sie es online!

Rekursive Funktion, kein regulärer Ausdruck. Nimmt die Eingabe als char-array (siehe TIO-Link). Schält die ersten beiden Elemente in $aund ab $bund speichert die verbleibenden in $r. Wenn noch Elemente übrig sind, greifen Sie mit zu $a -eq $b. Ansonsten einfach nachschauen ob $a -eq $b. Die Ausgabe ist implizit.

-5 Bytes dank mazzy

AdmBorkBork
quelle
1
de-duplizieren Online testen!
mazzy
1
@mazzy Danke! Ich vermisste den $vor dem Anweisungsblock und konnte nicht herausfinden, warum es nicht funktionierte.
AdmBorkBork
4

Julia 1.0 , 25 Bytes

s->s[1:2:end]==s[2:2:end]

Probieren Sie es online!

user3263164
quelle
3
Es ist kürzer, ein Symbol anstelle von fz !a=.... Oder verwenden Sie eine anonyme Funktion:s->...
H.PWiz
Ja, du hast Recht. Ich habe es behoben
user3263164
4

J , 13 11 10 Bytes

-:2#_2{.\]

Probieren Sie es online!

-2 Bytes dank Adám

-1 Byte dank Meilen

TLDR-Erklärung: Ist die Eingabe mit jedem anderen Zeichen der Eingabe identisch, das verdoppelt wurde?

Jona
quelle
-:]#~2 0$~#
Adám
-:2#_2{.\]sollte ein weiteres Byte sparen
Meilen
sehr nett, danke @miles
Jonah
4

Shakespeare Programming Language , 204 156 Bytes

-48 Bytes dank Jo King (hauptsächlich durch Ändern der Ausgabemethode)

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.

Probieren Sie es online!

Wird mit Fehler beendet, wenn die Eingabe Double Speak ist, und mit Warnung, wenn es sich nicht um Double Speak handelt (was standardmäßig zulässig ist).

Robin Ryder
quelle
4

Fass , 19 17 Zeichen

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

Erläuterung:

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

Probieren Sie es online!

Mann bei der Arbeit
quelle
3

R , 53 34 Bytes

-19 Bytes dank Giuseppe

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

Probieren Sie es online!

Robert S.
quelle
1
Ich denke, ich gsub("(.)\\1","",a)==""würde es auch schaffen. viele andere verwenden den gleichen regulären Ausdruck.
Giuseppe
@ Giuseppe Diese ganze Regex-Sache ist ziemlich neu für mich. Vielen Dank.
Robert S.
Mit R + pryr erhalten Sie einen 32-Byte-Code, der aus dieser Antwort trivial modifiziert wurde.
Khuldraeseth na'Barya
2
Kann die Eingabe als Vektor verwendet werden, gilt dies function(a)!sum(rle(a)$l%%2)für 28
MickyT,
3

Brain-Flak , 26 , 22 Bytes

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

Probieren Sie es online!

Gibt 1 für falsch und 0 für wahr aus.

Lesbare Version:

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

Ich hatte ursprünglich folgendes:

{
    ({}[{}])

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

Welches ist 10 Bytes länger.

DJMcMayhem
quelle
Zählt 0 / non0 als Boolescher Wert? Wenn ja, können Sie tun({({}[{}]){{}}{}})
Riley
3
lol bei der "Readable version" - es ist so gut lesbar: P
Quinn
@riley Nein, das ist nicht gültig. Ich habe jedoch einen besseren Trick gefunden.
DJMcMayhem
@quinn Sieht für mich lesbar aus: P
DJMcMayhem
3

QuadR , 11 Bytes

''≡⍵
(.)\1

Probieren Sie es online!

''≡⍵ Das Ergebnis ist eine leere Zeichenfolge, wenn

(.)\1 ein Charakter von sich selbst gefolgt

 wird durch nichts ersetzt

Adam
quelle
3

JavaScript, 26 23 Bytes

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

Probieren Sie es online!

Rekursive Lösung, 30 Bytes

Vielen Dank an Arnauld für einen Fix zum Preis von 0 Bytes.

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

Probieren Sie es online!

Zottelig
quelle
Vielen Dank, @ Arnauld :)
Shaggy
@ Oliver, Mist; habe erst deine ursprüngliche lösung gesehen bevor du meine postest. Ich freue mich, auf 26 zurückzukehren, wenn Sie diese 23 vor mir erreicht haben - lassen Sie es mich wissen.
Shaggy
3

Zsh , 36 Bytes

Meine Antwort auf die vorherige Herausforderung finden Sie hier.

Beendet truey (0), wenn NICHT double speak, und false (1), wenn double speak. (Wie in einem Kommentar erlaubt.)

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

Probieren Sie es online!

GammaFunktion
quelle
3

Prolog (SWI) , 60 45 Bytes

Danke an Unrelated String

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

Probieren Sie es online!

Das Umwandeln von einem String in eine Liste von Atomen hat die Partitur irgendwie ruiniert, aber gut.

qwertxzy
quelle
1
45 Bytes
Nicht verwandte
1
... es sieht so aus, als könnten Sie auch atom_charsanstelle von verwenden string_chars, obwohl Sie einen String als Eingabe und kein Atom verwenden. Dies kann jedoch irrelevant sein, wenn Sie einen durch Backtick getrennten String verwenden, dh eine Liste von Zeichencodes.
Nicht verwandte