Parla due volte?


46

In una precedente sfida ho chiesto ai golfisti del codice di produrre stringhe che copiano ogni carattere in una stringa. Per esempio:

TThhiiss  iiss  ddoouubbllee  ssppeeaakk!!

Questa sfida consiste semplicemente nel rilevare se un testo soddisfa la definizione di una stringa a doppio parlato.

  • C'è un numero pari di personaggi.
  • Quando diviso in coppie, ogni coppia è composta da due dello stesso personaggio.

La sfida

  • È un codice golf, fallo in pochi byte.
  • Usa qualsiasi lingua tu scelga.
  • Si prega di includere un collegamento a un interprete online.
  • Il codice accetterà del testo.
    • Per semplicità, l'input consisterà solo di caratteri ASCII stampabili
  • Restituirà un'indicazione se l'ingresso è doppio parlato o meno. Potrebbe essere:
    • Un booleano
    • Stringhe ('true', 'false', 'yes', 'no' ecc.)
    • Numeri interi 0 o 1

Casi test:

  • aba: falso
  • abba: falso
  • aabb: vero
  • aaabb: falso
  • tthhiiss: vero
  • ttthhhiiisss: false

6
Possiamo sbagliare su input di lunghezza <2?
Cole

3
Caso di prova suggerito: abbache dovrebbe essere falso
Giuseppe

2
Caso di prova suggerito: aabbbbche dovrebbe essere vero
Khuldraeseth na'Barya il

2
@val Beh, non ho intenzione di discutere con l'I / O standard
AJFaraday

2
Caso di prova suggerito: 0che dovrebbe essere falso.
640 KB

Risposte:



24

Brainfuck , 20 byte

Salvato 1 byte grazie a Jo King.

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

Provalo online!

Uscita leggibile!

Accetta due caratteri alla volta e si allontana dall'1 sul nastro se una coppia non corrisponde. EOF viene trattato come 0 e quindi gestito automaticamente.

L'output è un byte null se la stringa non è double speak e 0x01 se lo è. La versione leggibile li genera come caratteri al costo di 14 byte.


Se potessi effettuare il downgrade dei commenti, farei il downgrade del commento sopra.
A _

@PerpetualJ A) È un esolang molto popolare, non posso credere che tu non ne abbia già sentito parlare B) Non è un motivo per
votare

@RedwolfProgrammi Secondo le regole SE, dovresti votare se il post è stato utile ed è stato utile insegnarmi il nome di una lingua di cui non avevo mai sentito parlare. Inoltre, è un'ottima soluzione che merita un voto.
PerpetualJ

1
@PerpetualJ Concordato sul fatto che sia un'ottima soluzione, ma ci sono molti esolang con nomi divertenti e soluzioni noiose (per lo più varianti BF)
Programmi Redwolf

17

MATL , 4 byte

Heda

L'input è una stringa, racchiusa tra singoli qoutes. L'output è 0per il doppio parlato, 1altrimenti.

Provalo online!

Spiegazione

Considera l'input 'TThhiiss iiss ddoouubbllee ssppeeaakk!!'come esempio.

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

7
"Heda" è tedesco per "Ehi! Tu!"
QBrute

14

05AB1E , 6 5 2 byte

ιË

Inserisci come un elenco di caratteri.

-3 byte eseguendo il porting della risposta Japt di Shaggy , quindi assicurati di votarlo!

Provalo online o verifica alcuni altri casi di test .

Spiegazione:

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

Provalo

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

Alternativa

ó
¥o

Provalo


10

Retina , 9 byte

(.)\1

^$

Provalo online.

Spiegazione:

Rimuovi tutte le coppie degli stessi personaggi:

(.)\1

Controlla se non ci sono caratteri rimasti:

^$

1
Puoi fornire un output più tradizionale usando ^$come fase finale.
Neil,

@Neil Ah certo, grazie! Sembra davvero meglio. Penso sempre che l'output sia strano falsecome vero e truefalso (ma se salva un byte ed è permesso, lo userò comunque). ;) Ma poiché si tratta di una soluzione di byte uguali che fornisce i risultati previsti, è meglio.
Kevin Cruijssen,

8

Gelatina , 3 byte

ŒœE

Provalo online!


1
Ehi, mi piace questo! Mi ci sono voluti 80 minuti per fare lo stesso lol, ero tipo "hey impariamo Jelly ora", poi ho imparato. Stavo per postare questo, ma ho cercato se le risposte di Jelly erano già lì ... e poi ho visto questo ^^ I miei passi: ¹©s2L€=2Ạa®s2E€Ạ... ḢƝs2E€Ạ... ma non sono riuscito a ottenere quello che volevo, e poi ho visto Œœlol
V. Courtois,


6

PHP ,58 56 byte

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

Provalo online!

Come funzione ricorsiva.

PHP ,61 56 52 byte

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

Provalo online!

O programma autonomo. Stringa di input tramite STDIN, output è truthy( 1) se è double speak e falsey( 0) se non è double speak.

-4 byte grazie a @ Night2 !


1
Questo sembra emettere 1 per una stringa non a doppio parlato, così come una stringa a doppio parlato.
AJFaraday,

@AJFaraday prova ora - parla in doppio , non parla in doppio
640KB il

6

codice macchina 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

Inserire la stringa in SI, inserire la lunghezza della stringa in CX. Uscita ZFse è double speak.

O 14 byte come eseguibile completo per PC DOS:

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 

L'input avviene tramite STDINpipe o interattivo. Fa eco all'input "raddoppiato" fino a quando non viene rilevato un carattere non raddoppiato, a quel punto uscirà (forse piegando leggermente le regole I / O, ma questa è solo una risposta bonus).

inserisci qui la descrizione dell'immagine

Costruisci e testa ISDBL2.COM usando xxd -r:

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

Eseguibile completo DOS per PC originale 24 byte :

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 dalla riga di comando, output sullo schermo 'Y'se doppio, in 'N'caso contrario.

inserisci qui la descrizione dell'immagine

Costruisci e testa ISDBL.COM usando xxd -r:

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

Crediti:

  • -2 byte grazie a @ErikF!

2
Suggerisci di utilizzare LOOPEinvece di JNZ/ LOOPper salvare 2 byte.
ErikF

@ErikF, geniale! Dimenticato completamente questo!
640 KB

6

Lua , 67 66 63 59 33 32 byte

-25 byte grazie a Giuseppe
-1 byte grazie a val

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

Provalo online!

Rimuove ogni carattere raddoppiato, quindi controlla se il risultato è vuoto.


1
perché non solo i:gsub("(.)%1","")e controllare se i==""?
Giuseppe

1
si tratta di 34 byte, non del tutto sicuro che sia valido poiché non ho mai scritto Lua prima, ma sembra funzionare.
Giuseppe

benvenuti allo scambio di code golf stack però!
Giuseppe

Supponevo che di "(.)%1"per sé includesse le collisioni, ma non mi venne in mente che sostituirlo una volta per tutte le catture sarebbe stato sufficiente. Devo implementare la tua soluzione o dovresti scrivere la tua risposta? E grazie!
HugoBDesigner

1
Bella idea! arg[1]può essere sostituito con (...)per salvare un byte.
val


5

MathGolf , 2 byte

½=

Provalo online!

Sostanzialmente uguale alla risposta 05AB1E, ½divide la stringa in caratteri pari e dispari, quindi controlla l'uguaglianza. Passa per la stringa vuota.



5

Haskell , 28 23 byte

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

Provalo online!

Molto semplice. Il doppio parlato è solo vuoto o un carattere ripetuto anteposto al doppio parlato.

Meno semplice ora. Output tramite presenza o assenza di un errore, per meta consenso ; nessun errore significa doppio parlare. La corrispondenza dei motivi ha esito negativo quando i primi due caratteri differiscono o quando è presente un numero dispari di caratteri. Grazie a Laikoni per questi risparmi!


4

V (vim) , 7 byte

Óˆ±
ø^$

Provalo online! o Verifica casi di test

hexdump:

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

Solo due regex. Spiegazione:

Ó   " 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)

Provalo online!

dove $pcontiene un carattere precedente.

Nessuna ricorsione , nessuna regex :). Accetta input come char-array tramite una stringa splatting (vedi collegamento TIO).


PowerShell , 48 byte

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

Provalo online!

Nessuna ricorsione , nessuna regex e nessuna pipa: D. Prende anche input come char-array tramite una stringa splatting. Usa $b-eq$ainvece $a-eq$bper un caso in cui un ultimo carattere ha il codice # 0.


4

PowerShell , 64 59 byte

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

Provalo online!

Funzione ricorsiva, nessuna regex. Accetta input come un chararray (vedi link TIO). Stacca i primi due elementi in $ae $bmemorizza i rimanenti in $r. Se abbiamo ancora elementi rimanenti, ricorrere insieme a $a -eq $b. Altrimenti controlla se $a -eq $b. L'output è implicito.

-5 byte grazie a mazzy


1
de-duplicato Provalo online!
mazzy

1
@mazzy Grazie! Mi mancava il $blocco delle istruzioni prima e non riuscivo a capire perché non funzionasse.
AdmBorkBork,


4

J , 13 11 10 byte

-:2#_2{.\]

Provalo online!

-2 byte grazie ad Adám

-1 byte grazie alle miglia

Spiegazione TLDR: l'input è lo stesso di ogni altro carattere dell'input raddoppiato?



-:2#_2{.\]dovrebbe salvare un altro byte
miglia

molto bello, grazie @miles
Giona

4

Shakespeare Programming Language , 204 156 byte

-48 byte grazie a Jo King (principalmente cambiando il metodo di 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.

Provalo online!

Esce con errore se l'ingresso è double speak e con avviso se non è double speak (che è consentito per impostazione predefinita).


4

Keg , 19 17 caratteri

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

Spiegazione:

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

Provalo online!


3

R , 53 34 byte

-19 byte grazie a Giuseppe

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

Provalo online!


1
Penso che gsub("(.)\\1","",a)==""farebbe anche il trucco; molti altri usano lo stesso regex.
Giuseppe,

@Giuseppe Tutto questo regex è abbastanza nuovo per me. Grazie.
Robert S.

R + pryr ti fa ottenere 32 byte banalmente modificato da questa risposta.
Khuldraeseth na'Barya,

2
Se l'input può essere preso come un vettore, allora function(a)!sum(rle(a)$l%%2)per 28
MickyT

3

Brain-Flak , 26 , 22 byte

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

Provalo online!

Emette 1 per falso e 0 per vero.

Versione leggibile:

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

Inizialmente avevo questo:

{
    ({}[{}])

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

Che è di 10 byte in più.


0 / non0 conta come un valore booleano? Se è così, puoi farlo({({}[{}]){{}}{}})
Riley il

3
lol alla "Versione leggibile" - è molto leggibile: P
Quinn

@riley No non è valido. Tuttavia, ho trovato un trucco migliore.
DJMcMayhem

@quinn Mi sembra leggibile: P
DJMcMayhem

3

QuadR , 11 byte

''≡⍵
(.)\1

Provalo online!

''≡⍵ il risultato è una stringa vuota quando

(.)\1 un personaggio seguito da solo

 non è sostituito da niente




3

Zsh , 36 byte

La mia risposta Zsh alla sfida precedente può essere trovata qui.

Esce da true (0) se NON parla doppiamente e falsy (1) se parla doppia. (Come consentito in un commento.)

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

Provalo online!


3

Prolog (SWI) , 60 45 byte

grazie a Unrelated String

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

Provalo online!

La conversione da una stringa in un elenco di atomi ha rovinato il punteggio, ma bene ...



1
... sembra che puoi anche usare atom_charsinvece di string_chars, anche se stai prendendo una stringa come input, e non un atomo. Ma ciò potrebbe essere irrilevante se si può prendere una stringa delimitata da backtick, ovvero un elenco di codici char.
Stringa non correlata
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.