Est-ce que le début est égal à la fin?


36

La tâche

Dans ce défi, votre tâche consiste à écrire un programme ou une fonction qui prend une chaîne et génère une valeur de vérité ou de falsey selon que le premier caractère et le dernier caractère de la chaîne d'entrée sont égaux.

Contribution

Vous pouvez prendre des entrées de toute manière raisonnable. Cependant, en supposant que l'entrée soit présente dans une variable prédéfinie, elle n'est pas autorisée. La lecture depuis un fichier, une console, une ligne de commande, un champ de saisie, etc., ou de prendre une entrée comme argument de fonction est autorisée.

Sortie

Vous pouvez sortir dans n'importe quel format raisonnable, sauf pour affecter le résultat à une variable. L'écriture dans un fichier, une console, une ligne de commande, une boîte modale, des returninstructions de fonction , etc. est autorisée.

Règles additionnelles

  • L'entrée peut également être une chaîne vide, pour laquelle vous devez renvoyer une valeur falsey.

  • Les chaînes d'entrée à caractère unique devraient avoir un résultat de vérité.

  • Votre programme devrait être sensible à la casse. helloHdevrait produire une valeur de falsey.

  • Vous ne pouvez avoir qu'une seule valeur Truthy et une seule valeur Falsey. Par exemple, la sortie falsepour une chaîne d'entrée et 0pour une autre chaîne d'entrée en tant que valeurs Falsey n'est pas autorisée.

  • Les failles standard ne sont pas autorisées.

Cas de test

Input    ->    Output

"10h01"        Truthy
"Nothing"      Falsey
"Acccca"       Falsey
"wow!"         Falsey
"wow"          Truthy
"H"            Truthy
""             Falsey

C'est du , donc le code le plus court en octets gagne!


Quels caractères peuvent apparaître dans l'entrée? ASCII imprimable?
Martin Ender

@MartinEnder ASCII imprimable. Bien que, je ne pense pas que cela compte beaucoup.
Arjun

Bien sûr que ça compte. Certaines langues ne peuvent pas traiter les caractères non-ASCII ou les octets nuls. Dans une expression rationnelle, je peux faire correspondre tout caractère ASCII imprimable avec ., mais cela ne correspond pas aux sauts de ligne. En général, si vous utilisez la balise string , spécifiez exactement quels caractères peuvent apparaître dans l'entrée.
Martin Ender

@MartinEnder Okay. Prendrons soin de vous à l'avenir.
Arjun

Cas de test suggéré:AbAb => false
caird coinheringaahing

Réponses:



17

Python 3 , 23 octets

s=input()
s[0]!=s[-1]<e

La sortie se fait par le code de sortie, donc 0 (succès) est la vérité et 1 (échec) est faux. Si cela est acceptable, un octet peut être sauvegardé.

Essayez-le en ligne!

Comment ça marche

Tout d'abord, si s est une chaîne vide, s[0]une erreur IndexError sera déclenchée , ce qui entraînera l'échec du programme.

Pour les non-vides s , si les premiers et derniers caractères sont égaux, s[0]!=s[-1]évaluera à faux , de sorte que les sorties du programme proprement et immédiatement.

Enfin, si les caractères sont différents, s[0]!=s[-1]sera évalué à True , ce qui entraînera l'exécution s[-1]<ede compairson . Puisque e n'est pas défini, cela génère une erreur NameError .

Si la compatibilité avec Python 2 n'est pas souhaitée,

s[0]!=s[-1]<3

fonctionne également, car comparer une chaîne avec un entier déclenche une erreur TypeError .


Enregistrer 1 octet avec lambda
OldBunny2800

1
Oui, une fonction régulière enregistrerait également un octet. Bien que la sortie via le code de sortie soit un consensus établi, la non-erreur / erreur pour une fonction ne l’est pas. J'ai lié à la proposition dans ma réponse.
Dennis

Qu'en est-il de l'utilisation de Python REPL?
OldBunny2800

Je ne pense pas que cela aide. Ce n'est toujours pas un code de sortie.
Dennis

9

JavaScript, 19 octets

a=>a.endsWith(a[0])

Sensationnel. Je ne savais même pas qu'il existe une endsWithméthode d'objet String. Agréable! :)
Arjun

Comment ai-je oublié endsWith()?! J'attendais l'occasion de l'utiliser.
Shaggy

7

Mathematica, 15 octets

#&@@#===Last@#&

Prend un tableau de caractères. Lance des erreurs lorsque l'entrée est vide mais peut être ignorée.


4
Joli boulot de repérer le fait qu'il ===s'occupe de l'affaire vide :)
Greg Martin



7

C ++, 39 octets

[](auto s){return s[0]&&s[0]==s.back();}

Programmes complets:

#include <string>
#include <iostream>

using namespace std;

int main()
{
    string t = "";
    auto f = [](auto s){return s[0]&&s[0]==s.back();};
    cout << f(t);
}

Essayez-le en ligne


1
Je ne suis pas le meilleur en C ++ (je l' utilise généralement C), mais pourriez - vous changer les instances de s[0]pour *ssauver deux octets chacun?
MD XF

1
@MDXF, cela ne fonctionnera qu'avec les tableaux de type C.
Johan du Toit

6

Brachylog , 4 octets

h~t?

Essayez-le en ligne!

Explication

h       The head of the Input...
 ~t?    ...is the tail of the Input

1
J'ai vraiment besoin de me débrouiller pour implémenter ces variables de contrainte pour l'entrée; cela voudrait dire que nous serions capables de le faire en deux.

6

Java, 81 77 octets

  • -4 octets, merci @KevinCruijssen

Essayez en ligne

boolean f(String s){int l=s.length();return l>0&&s.charAt(l-1)==s.charAt(0);}
  • Retourne truesi elles sont égales, sinon false, falsepour une chaîne vide

Version tableau, 60 octets

boolean f(char[]s){int l=s.length;return l>0&&s[0]==s[l-1];}

Pourquoi long au lieu de int?
corvus_192

@ corvus_192 un caractère unicode peut être 1-6 octets.
Khaled.K

La différence entre deux caractères peut être au maximum Charcter.MAX_VALUE - Character.MIN_VALUE, soit 65535
corvus_192

@ corvus_192 Je vois, je l'ai corrigé maintenant
Khaled.K

1
@KevinCruijssen Pour le dernier, s.charAt(l-1)==s.charAt(0)économiser deux octets.
JollyJoker


5

brainfuck , 43 octets

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

Essayez-le en ligne!

Explication

La boucle principale est [>[->+<<->],]. Après chaque itération, la cellule à droite de la position actuelle est le premier octet de la chaîne et la cellule à gauche est la différence entre le dernier caractère traité et le premier. <[[-]-<]convertit le résultat final en -1 s'il est différent de zéro et le reste convertit respectivement -1 et 0 en 48 et 49 ("0" et "1").


5

Haskell , 21 octets

cprend un Stringet retourne un Bool.

c s=take 1s==[last s]

Essayez-le en ligne!

  • Sans les chaînes vides, cela aurait pu être 16 octets avec c s=s!!0==last s.
  • take 1sdonne une liste qui n'est que le premier élément de sless sest vide, auquel cas il est également vide.
  • last s erreur sur une chaîne vide, mais la paresse de Haskell l'enregistre: Une chaîne avec un seul élément est toujours différente de la chaîne vide, sans évaluer son élément.

5

MATL, 5 octets

&=PO)

Essayez-le sur MATL Online!

Explication

       % Implicitly grab input as a string (of length N)
&=     % Perform an element-wise equality check yielding an N x N matrix
P      % Flip this matrix up-down
O)     % Get the last value in the matrix (column-major ordering)
       % Implicitly display the result

Dans le cas où une chaîne d'entrée vide doit être traitée, alors quelque chose comme ce qui suit (8 octets) fonctionnerait

&=POwhO)

Cette solution ajoute simplement a 0devant la matrice N x N, de sorte que pour une entrée vide, lorsque la matrice est présente 0 x 0, il reste une 0valeur qui est ensuite saisie par0)

Essayez-le sur MATL Online


Approche très intelligente!
Luis Mendo

Aussi 5 octets: 5L)d~.
Sanchises

2
Juste un avertissement: ni mon commentaire ni votre réponse ne gèrent les entrées vides. Cela a été (à mon avis de manière convaincante) contesté dans les commentaires, donc je m'attends à ce que cette exigence change. Cependant, dans l’état actuel, cette entrée est invalide.
Sanchises

1
(Bien sûr, vous pourriez le faire tn?&=PO)}Fpour gérer les entrées vides; vous ne savez pas s'il existe un moyen plus efficace)
Sanchises


4

APL (Dyalog) , 4 octets

⊃⌽=⊃

Essayez-le en ligne!

Explication

  =                     Compare
                       The first element of the right argument with
                       The right argument reversed
                        This will return an array of the length of the reversed argument. Each element in the resulting array will be either 0 or 1 depending on whether the element at that position of the reversed argument equals the first element of the original right argument
                        So with argument 'abcda', we compare 'a' with each character in 'adcba' which results in the array 1 0 0 0 1
                       From this result, pick the first element.

Voici la raison pour laquelle cela fonctionne sur les chaînes vides. L'application à une chaîne vide renvoie un espace . Mais inverser une chaîne vide renvoie toujours une chaîne vide. Par conséquent, comparer une chaîne vide avec une chaîne non vide (dans ce cas ) donne un vecteur numérique vide. Et s’appliquant à un vecteur vide numérique renvoie 0. Par conséquent, passer une chaîne vide revient 0.


C'est en fait une réponse vraiment cool, mais votre explication n'est pas correcte. Ce serait bien pour (⊃⌽)=⊃ou ⊢/=⊃, mais aucun de ceux-ci ne donne le bon résultat. Au lieu de cela, ⌽=⊃compare la chaîne inversée à son premier caractère, puis sélectionne le premier élément de celui-ci. Si la chaîne est vide, elle finit par comparer un espace à une chaîne vide, ce qui donne une liste booléenne vide, dont le premier élément (forcé) est 0- la réponse correcte pour les chaînes vides. Votre expression est équivalente à ⊃⊃=⌽parce que =commutative.
Adám

@ Adám Merci de m'aider à voir l'erreur dans mes explications.
Kritixi Lithos

De rien. Maintenant, votre note n'est pas correcte. ⊃⌽=⊃n'est pas la même chose que (⊃⌽)=⊃. Il est plus coûteux, car il compare tous les éléments au lieu du premier et du dernier. En outre, cela ne fonctionnerait pas si le PO utilisait des nombres au lieu de chaînes.
Adám

The first argument reversedThe right argument reversed
Adám

Vous voudrez peut-être aussi expliquer pourquoi cela fonctionne sur des chaînes vides.
Adám

4

Java, 52 43 octets

s->!s.isEmpty()&&s.endsWith(""+s.charAt(0))

Pour que cela fonctionne, introduisez-le dans une fonction telle que la suivante qui crée un lambda "actif":

private static boolean f(Function<String, Boolean> func, String value) {
  return func.apply(value);
}

1
Vous pouvez raser 9 caractères en utilisant au s.endsWith(""+s.charAt(0))lieu des.charAt(0)==s.charAt(s.length()-1)
SpaceBison

s->""!=s&&s.endsWith(""+s.charAt(0))
JollyJoker

1
@JollyJoker qui ne fonctionne pas: essayez de nourrir new String()le lambda. Il va lancer une exception. La sémantique de référence ne fonctionne pas ici.

2
@KevinCruijssen L'effet de court-circuit de && est nécessaire pour éviter une exception d'index hors limites sur le caractère charAt (0) pour une chaîne vide
PunPun1000

4

Ruby, 26 à 24 octets

Enregistré deux octets grâce à @philomory !

->e{!!e[0]>0&&e[0]==e[-1]}

Premier post sur codegolf -))


1
Bienvenue chez PPCG!
Martin Ender

1
Bienvenue chez PPCG! Nice premier golf. Bonne chance pour le futur!
Arjun

1
Vous pouvez économiser 4 octets simplement en faisant e[0]&&e[0]==e[-1], car si eest vide, e[0]il sera nul. En fait, à bien y penser, ce niln’est pas bon car c’est Falsey mais ce n’est pas le même Falsey que la comparaison revient; encore, après avoir ajouté, !!vous enregistrez encore 2 caractères.
philomory

3

PHP> = 7.1, 23 octets

affiche 1 pour égal et rien si le personnage est différent

<?=$argn[0]==$argn[-1];

3

Rapide, 57 octets

var s=readLine()!,a=Array(s.characters);a[0]==a.last ?1:0

Edité le code.
Leena

Bienvenue chez PPCG! L'espace après est-il a.lastnécessaire?
HyperNeutrino

Soit je peux ajouter des crochets autour de a.last, soit ajouter de l'espace après a.last
Leena

3

C #, 38 30 octets

s=>s!=""&&s[0]==s[s.Length-1];

Sauvegardé 8 octets grâce à @raznagul.


1
Au lieu de vérifier la longueur de ssimplement comparer avec "". De plus, vous n'avez pas besoin de l' ?:opérateur. L'utilisation &&a le même résultat.
Raznagul

@raznagul Bonnes taches merci, je ne peux pas vérifier si cela fonctionne pour le moment alors espérons-le! Aussi n'aurait pas &le même effet aussi?
TheLethalCoder

@TheLeathalCoder: Non, &ça ne marche pas. Avec &&la deuxième expression n'est pas validée si la première expression est fausse. Avec &les secondes, l'expression est toujours validée et échoue avec un IndexOutOfRangeExceptionscénario de test de chaîne vide.
Raznagul

@raznagul Oh oui ... péter le cerveau.
TheLethalCoder

Peut-être que c'est un peu tard, mais vous pouvez économiser 5 octets si vous utilisez s.Last()au lieu des[s.Length-1]
Bojan B

3

R, 40 octets

function(x)x>""&&rev(y<-charToRaw(x))==y

Merci à Nitrodon pour -2 octets.

Merci à MickyT pour -8 octets.

Tester:

f=function(x)x>""&&rev(y<-charToRaw(x))==y
test <- c("10h01", "Nothing", "Acccca", "wow!", "wow", "H", "")
sapply(test, f)
all(sapply(test, f) == c(T, F, F, F, T, T, F))

Sortie:

> f=function(x)x>""&&rev(y<-charToRaw(x))==y
> test <- c("10h01", "Nothing", "Acccca", "wow!", "wow", "H", "")
> sapply(test, f)
  10h01 Nothing  Acccca    wow!     wow       H         
   TRUE   FALSE   FALSE   FALSE    TRUE    TRUE   FALSE 
> all(sapply(test, f) == c(T, F, F, F, T, T, F))
[1] TRUE

2
Vous pouvez supprimer un ensemble de parenthèses avec rev(y<-el(strsplit(x,"")))==y.
Nitrodon

1
les fonctions non nommées sont également acceptables. Vous pouvez donc supprimer le f=
fichier

1
et charToRaw peuvent être utilisés pour diviser la chaîne à des fins de comparaisonfunction(x)x>""&&rev(y<-charToRaw(x))==y
MickyT

3

> <> , 39 33 octets

 2i&01. >~&-?v1v
  i:1+?!^01. >0>n;

C'est la première fois que j'utilise> <> et que je joue au golf, donc des suggestions utiles seraient les bienvenues.

Le code est en trois sections de base.

2i&01. Pushes an arbitrary number (2 in this case, this causes an empty string to print 0) onto the stack and puts the input's first character in the register.

>i:1+?!^01. Main loop. Pushes the next character onto the stack. If the string has been read completely, then go to the last section

>~&-?v1v
     >0>n;  Compare the first and last characters. Print 1 if they're the same, 0 if not

Bonjour! Bienvenue chez PPCG! Nice premier golf! Bonne chance pour le futur! :)
Arjun

3

Feuilles Google, 33 octets

Prend l’entrée de la cellule [A1]et les sorties 1pour l’entrée vérité et l’ 0entrée falsey.

=(A1<>"")*Exact(Left(A1),Right(A1

Il est à noter que les parenthèses dans Exact(etRight( sont laissées non fermées car Google Sheets corrige cela automatiquement dès que l'utilisateur a saisi le texte de la formule et appuyé sur Entrée pour quitter cette cellule.

Sortie

GS Version


La version d'Excel est-elle importante? Dans ma copie de 2013, cela échoue parce que vous ne pouvez pas utiliser &comme ça. En outre, il considère A=aêtre vrai. Le plus court que je puisse obtenir est de 38 octets: =AND(EXACT(LEFT(A1),RIGHT(A1)),A1<>"")ou l’alternative =IFERROR(CODE(A1)=CODE(RIGHT(A1)),1=0).
Ingénieur Toast

Je l'ai essayé dans Excel Online (16.0.9222.5051) et il retourne TRUEpour toute entrée sans erreur. ( capture d'écran ) Cela fonctionne-t-il dans votre copie pour tous les cas de test? ExcelGuy a une réponse qui se termine comme la mienne ci-dessus pour les mêmes raisons.
Ingénieur Toast

1
@ IngénieurToast vous avez parfaitement raison, j'aurais dû utiliser *plutôt &le binaire et l'instruction, mais cela laisse tout de même le "A"="a"problème, que j'avais complètement oublié. Tout cela et un peu de corrections de syntaxe me conduisent à =EXACT(LEFT(A1),RIGHT(A1))*(A1<>"")35, mais j'ai changé le langage pour Google Sheets, ce qui m'a permis de laisser tomber le terminal entre parenthèses dans la Exactdéclaration, rendant =(A1<>"")*Exact(Left(A1),Right(A1pour 33 octets
Taylor Scott

3

R, 50 43 41 40 64

Deuxième solution avec 41 octets pour une fonction appelable - grâce à @ niczky12 & @Giuseppe - modifiée pour x = ""

r=function(x,y=utf8ToInt(x))ifelse(x=="","FALSE",(y==rev(y))[1])

D'abord avec 50 octets mais pas pour le challenge

function(x){charToRaw(x)[1]==rev(charToRaw(x))[1]}

Vous pouvez remplacer charToRawpar utf8ToIntpour produire NAs lorsque la chaîne est vide.
niczky12

Vous pouvez également supprimer les accolades {}entourant le corps de la fonction.
Giuseppe

Je pense que (y==rev(y))[1]c'est plus court d'un octet
Giuseppe

Ce défi nécessite l'utilisation d'une seule valeur Truthy et d'une valeur Falsey, mais cela produit NAune chaîne vide mais FALSEpour "ab". Essayez-le en ligne! .
Ørjan Johansen

@ ØrjanJohansen merci pour votre commentaire, donc "ab" ne devrait pas donner FAUX?
Riccardo Camon

2

Octave, 16 octets

@(s)s(1)==s(end)

Il faut une chaîne sen entrée et compare le premier s(1)élément avec le dernier s(end).

Cela pourrait être @(s)s(1)-s(end)si elle était OK pour échanger true/falseà false/true.


2

GNU grep , 12 octets

^(.)(.*\1)?$

Exécuter en mode étendu ou PCRE.

Je ne sais pas si c'est considéré comme de la triche ou non.


Est-ce que cela gère le cas de chaîne vide?
applaudir

@ConfusedMr_C Oui, chaîne vide ⇒ code 1.
eush77

2

JavaScript, 20 octets

Ajouter f=au début et invoquer comme f(arg).

_=>_[0]==_.slice(-1)

f=_=>_[0]==_.slice(-1)

i.oninput = e => o.innerHTML = f(i.value);
<input id=i><pre id=o></pre>

Explication

Cette fonction prend en argument _. Dans le corps de la fonction, _[0]==_.slice(-1)vérifie si le premier élément de _(at 0th index) est égal au dernier élément de celui-ci et renvoie le type approprié trueou falsebooléen.



2

Common Lisp, 83 74 61 58 octets

Original: 83 octets

Je viens tout juste d’apprendre l’apprentissage de Common Lisp, j’ai donc l’impression d’apporter un putter à un driving range. Il doit y avoir une sorte de macro de magie récursive ou de manipulation de tableau possible que je ne vois pas.

C'est une fonction anonyme qui accepte une chaîne en tant qu'entrée:

(lambda (s) (let ((n (- (length s) 1))) (when (> n 0) (eq (char s 0) (char s n)))))

Prettifié:

(lambda (s)
  (let ((n (- (length s) 1)))
    (when (> n 0)
      (eq (char s 0)
          (char s n)))))

J'aimerais voir une solution plus lisse!

Révision 1: 74 octets

Je dois aimer ces fonctions de la bibliothèque standard!

Laid:

(lambda (s) (when (> (length s) 0) (eq (elt s 0) (elt (reverse s) 0))))

Joli:

(lambda (s)
  (when (> (length s) 0)
    (eq (elt s 0)
        (elt (reverse s) 0))))

Révision 1.5: 61 octets

Les espaces blancs!

(lambda(s)(when(>(length s)0)(eq(elt s 0)(elt(reverse s)0))))

Révision 2: 58 octets

Laid:

(lambda(s)(and(>(length s)0)(not(mismatch s(reverse s)))))

Joli:

(lambda (s)
  (and (> (length s) 0)
       (not (mismatch s (reverse s)))))

C'est tout pour le moment! Je pense que je suis déjà plus intelligent.


1
Proposer au iflieu de andet au (mismatch(reverse s)s)lieu de(mismatch s(reverse s))
ceilingcat

2

AWK, 29 à 34 octets

Celui-ci pourrait tricher légèrement, car il nécessite d'appeler AWK avec l'option:

`-F ''`

Dans GNU Awk, vous pouvez utiliser les synonymes de forme longue:

`--field-separator=''`

J'ai donc ajouté 5 octets au total pour tenir compte de cela.

Laid:

NR==1{a=$1}END{print(a==$NF)}

Joli:

NR == 1
{
    a = $1
}

END
{
    print(a == $NF)
}

1
I believe the rule is that you can use flags/options, but you need to include them in the byte count.
Ørjan Johansen
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.