Est-ce double parler?


46

Lors d'un défi précédent, j'avais demandé aux golfeurs de code de produire des chaînes qui copient chaque caractère d'une chaîne. Par exemple:

TThhiiss  iiss  ddoouubbllee  ssppeeaakk!!

Ce défi consiste simplement à détecter si un texte correspond à la définition d'une chaîne de parole double.

  • Il y a un nombre pair de caractères.
  • Lorsqu'il est divisé en paires, chaque paire est constituée de deux du même caractère.

Le défi

  • C'est du code golf, faites-le en quelques octets.
  • Utilisez n'importe quelle langue que vous choisissez.
  • Veuillez inclure un lien vers un interprète en ligne.
  • Le code acceptera du texte.
    • Pour des raisons de simplicité, la saisie ne comportera que des caractères ASCII imprimables.
  • Il retournera une indication indiquant si l'entrée est une double parole. Il pourrait être:
    • Un booléen
    • Chaînes ('true', 'false', 'yes', 'no' etc.)
    • Entiers 0 ou 1

Cas de test:

  • aba - faux
  • abba - faux
  • aabb - true
  • aaabb - faux
  • tthhiiss - true
  • ttthhhiiisss - false

6
Peut-on se tromper sur des entrées de longueur <2?
cole

3
Cas de test suggéré: abbaqui devrait être falsey
Giuseppe

2
Cas de test suggéré: aabbbbce qui devrait être vrai
Khuldraeseth na'Barya

2
@val Eh bien, je ne vais pas me disputer avec les E / S standard
AJFaraday

2
Cas de test suggéré: 0qui devrait être falsey.
640KB

Réponses:



24

brainfuck , 20 octets

Sauvé 1 octet grâce à Jo King.

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

Essayez-le en ligne!

Sortie lisible!

Prend deux caractères à la fois et s'éloigne du 1 sur la bande si aucune des paires ne correspond. EOF est traité comme 0 et est donc traité automatiquement.

La sortie est un octet nul si la chaîne n'est pas un double langage et 0x01 si c'est le cas. La version lisible les affiche sous forme de caractères au coût de 14 octets.


Si je pouvais baisser les commentaires, je voterais le commentaire ci-dessus.
Un

@PerpetualJ A) C'est un esolang très populaire, je ne peux pas croire que vous n'en ayez pas encore entendu parler B) Ce n'est pas une raison pour passer au vote supérieur
Programmes Redwolf

@RedwolfPrograms Selon les règles SE, vous devriez relire le vote si le message est utile, et cela m'a été utile pour m'apprendre le nom d'une langue dont je n'avais jamais entendu parler. De plus, c'est une excellente solution qui mérite un vote positif.
PerpetualJ

1
@PerpetualJ Convenu que c'est une excellente solution, mais il y a beaucoup d'esolangs avec des noms amusants et des solutions ennuyeuses (principalement des variantes de BF)
Programmes Redwolf

17

MATL , 4 octets

Heda

L'entrée est une chaîne, entourée de qoutes simples. La sortie est 0pour double parler, 1sinon.

Essayez-le en ligne!

Explication

Considérez l'entrée 'TThhiiss iiss ddoouubbllee ssppeeaakk!!'comme un exemple.

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
Euh ... qui est "Heda"? : D
Erik the Outgolfer

7
"Heda" est allemand pour "Hey! You!"
QBrute

14

05AB1E , 6 5 2 octets

ιË

Saisie sous forme de liste de caractères.

-3 octets en portant la réponse de @ Shaggy's Japt , alors assurez-vous de le réévaluer!

Essayez-le en ligne ou vérifiez quelques autres cas de test .

Explication:

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

Retina , 9 octets

(.)\1

^$

Essayez-le en ligne.

Explication:

Supprimer toutes les paires des mêmes caractères:

(.)\1

Vérifiez s'il ne reste plus de caractères:

^$

1
Vous pouvez fournir une sortie plus traditionnelle en l’utilisant ^$comme étape finale.
Neil

@ Neil Ah bien sûr, merci! Cela a l'air vraiment mieux. Je pense toujours que c'est étrange de sortir en falsetant que vérité et en truetant que falsey (mais si cela enregistre un octet et que cela est autorisé, je l'utiliserai quand même). ;) Mais comme il s’agit d’une solution à octets égaux générant les résultats attendus, c’est mieux.
Kevin Cruijssen

8

Gelée , 3 octets

ŒœE

Essayez-le en ligne!


1
Hey j'aime ça! Il m'a fallu 80mns pour faire la même chose, j'étais comme "hé, apprenons Jelly maintenant", puis j'ai appris. J'étais sur le point de poster ceci, mais j'ai regardé si les réponses de Jelly étaient déjà là ... et ensuite j'ai vu ceci ^^ Mes pas: ¹©s2L€=2Ạa®s2E€Ạ... ḢƝs2E€Ạ... mais je n'ai pas réussi à obtenir ce que je voulais, puis j'ai vu Œœlol
V. Courtois


6

PHP ,58 56 octets

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

Essayez-le en ligne!

En tant que fonction récursive.

PHP ,61 56 52 octets

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

Essayez-le en ligne!

Ou programme autonome. Chaîne d'entrée via STDIN, la sortie est truthy( 1) s'il s'agit d'un double langage et falsey( 0) s'il ne s'agit pas d'un double langage.

-4 octets merci à @ Night2 !


1
Cela semble produire 1 pour une chaîne de parole non double, ainsi que pour une chaîne de parole double.
AJFaraday

@AJFaraday essayez maintenant - est un double langage , n'est pas un double
langage

6

code machine x86, 9 7 octets

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

Chaîne d'entrée dans SI, longueur de chaîne d'entrée dans CX. Sortie ZFsi est double parler.

Ou 14 octets en tant qu’exécutable complet DOS 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 

L'entrée est via STDIN, soit pipe ou interactive. Répondra à l'entrée "dédoublée" jusqu'à la détection d'un caractère non doublé, à quel moment se terminera (peut-être que les règles d'E / S se pliant un peu, mais il ne s'agit que d'une réponse en prime).

entrez la description de l'image ici

Générez et testez ISDBL2.COM en utilisant xxd -r:

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

Exécutable original DOS sur 24 octets :

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

Entrée à partir de la ligne de commande, sortie à l'écran 'Y'si double, 'N'sinon.

entrez la description de l'image ici

Construisez et testez ISDBL.COM en utilisant xxd -r:

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

Crédits:

  • -2 octets merci à @ErikF!

2
Suggérez d’utiliser LOOPEplutôt que JNZ/ LOOPpour économiser 2 octets.
ErikF

@ErikF, génial! Complètement oublié à ce sujet!
640 Ko

6

Lua , 67 66 63 59 33 32 octets

-25 octets grâce à Giuseppe
-1 octets grâce à val

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

Essayez-le en ligne!

Supprime chaque caractère doublé, puis vérifie si le résultat est vide.


1
pourquoi ne pas simplement i:gsub("(.)%1","")vérifier si i==""?
Giuseppe

1
c'est 34 octets, pas tout à fait sûr que c'est valide puisque je n'ai jamais écrit Lua auparavant, mais cela semble fonctionner.
Giuseppe

bienvenue à Code Golf Stack Exchange cependant!
Giuseppe

Je pensais que cela "(.)%1"incluait les collisions, mais je ne pensais pas que le remplacer une fois pour toutes suffirait. Devrais-je implémenter votre solution ou devriez-vous écrire votre propre réponse? Et merci!
HugoBDesigner

1
Bonne idée! arg[1]peut être remplacé par (...)pour sauvegarder un octet.
val


5

MathGolf , 2 octets

½=

Essayez-le en ligne!

Fondamentalement identique à la réponse 05AB1E, ½divise la chaîne en caractères pairs et impairs, puis vérifie l’égalité. Passe pour la chaîne vide.



5

Haskell , 28 23 octets

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

Essayez-le en ligne!

Très simple. Le double langage est seulement vide ou un caractère répété est destiné à un double langage.

Moins simple maintenant. Les sorties via la présence ou l'absence d'erreur, par méta consensus ; pas d'erreur signifie double parler. La correspondance de modèle échoue lorsque les deux premiers caractères diffèrent ou lorsqu'il existe un nombre impair de caractères. Merci à Laikoni pour ces économies!


4

V (vim) , 7 octets

Óˆ±
ø^$

Essayez-le en ligne! ou Vérifier les cas de test

Hexdump:

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

Juste deux regex. Explication:

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

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

Essayez-le en ligne!

$pcontient un caractère précédent.

Pas de récursion , pas de regex :). Prend l'entrée sous forme de tableau de caractères via une chaîne de séparation (voir lien TIO).


PowerShell , 48 octets

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

Essayez-le en ligne!

Pas de récursion , pas de regex et pas de pipe: D. Il accepte également les entrées sous forme de tableau de caractères via une chaîne de séparation. Il utilise à la $b-eq$aplace $a-eq$bpour un cas où un dernier caractère a le code # 0.


4

PowerShell , 64 59 octets

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

Essayez-le en ligne!

Fonction récursive, pas de regex. Prend l'entrée sous forme de chartableau (voir lien TIO). Détache les deux premiers éléments dans $aet $b, stocke le reste dans $r. Si nous avons encore des éléments restants, recurse avec $a -eq $b. Sinon, vérifiez si $a -eq $b. La sortie est implicite.

-5 octets grâce à mazzy


1
dédupliquer Essayez-le en ligne!
mazzy

1
Merci beaucoup! Je manquais le $bloc avant la déclaration et je n'arrivais pas à comprendre pourquoi cela ne fonctionnait pas.
AdmBorkBork


4

J , 13 11 10 octets

-:2#_2{.\]

Essayez-le en ligne!

-2 octets grâce à Adam

-1 octet grâce aux miles

Explication TLDR: l’entrée est-elle identique à tous les autres caractères de l’entrée doublée?



-:2#_2{.\]devrait économiser un autre octet
miles

très gentil, merci @miles
Jonah

4

Langage de programmation Shakespeare , 204 156 octets

-48 octets grâce à Jo King (principalement en changeant la méthode de sortie)

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.

Essayez-le en ligne!

Quitte avec erreur si l’entrée est double parler et avec avertissement si elle n’est pas double (ce qui est autorisé par défaut).


4

Keg , 19 17 caractères

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

Explication:

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

Essayez-le en ligne!


3

R , 53 34 octets

-19 octets grâce à Giuseppe

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

Essayez-le en ligne!


1
Je pense que gsub("(.)\\1","",a)==""ferait le tour aussi bien; beaucoup d'autres utilisent la même regex.
Giuseppe

@ Giuseppe Tout ce truc de regex est assez nouveau pour moi. Merci.
Robert S.

R + pryr vous obtient un 32 octets modifié trivialement à partir de cette réponse.
Khuldraeseth na'Barya

2
Si l’entrée peut être considérée comme un vecteur, alors function(a)!sum(rle(a)$l%%2)pour 28
MickyT

3

Brain-Flak , 26 , 22 octets

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

Essayez-le en ligne!

Sorties 1 pour faux et 0 pour vrai.

Version lisible:

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

J'avais à l'origine ceci:

{
    ({}[{}])

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

Ce qui est 10 octets plus long.


Est-ce que 0 / non0 compte comme un booléen? Si oui, vous pouvez le faire({({}[{}]){{}}{}})
Riley

3
lol à la "version lisible" - c'est tellement lisible: P
Quinn

@ riley Non, ce n'est pas valide. Cependant, j'ai trouvé un meilleur truc.
DJMcMayhem

@quinn On dirait lisible: P
DJMcMayhem

3

QuadR , 11 octets

''≡⍵
(.)\1

Essayez-le en ligne!

''≡⍵ le résultat est une chaîne vide quand

(.)\1 un personnage suivi par lui-même

 est remplacé par rien




3

Zsh , 36 octets

Ma réponse Zsh au défi précédent peut être trouvée ici.

Quitte la vérité (0) si vous ne parlez PAS en double, et la fausseté (1) si vous parlez en double. (Comme autorisé dans un commentaire.)

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

Essayez-le en ligne!


3

Prolog (SWI) , 60 45 octets

grâce à Unrelated String

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

Essayez-le en ligne!

Le convertir d'une chaîne en une liste d'atomes a en quelque sorte ruiné le score, mais bien ..



1
... il semblerait que vous puissiez également utiliser la atom_charsméthode au lieu de string_chars, même si vous prenez une chaîne en tant qu'entrée, et non un atome. Mais cela peut ne pas être pertinent si vous pouvez prendre une chaîne délimitée par un backtick, c'est-à-dire une liste de codes de caractères.
Unrelated String
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.