Est-ce un lipogramme?

52

Un lipogramme est un bloc de mots qui omet un symbole particulier. En ce moment, j'évite notre cinquième symbole de 26 qui apparaît généralement. Vous devriez savoir maintenant ce que je suis en train d'omettre. Sinon, cherchez "lipogramme" et vous saurez.

Ta tâche

Avec un caractère, un blanc et une chaîne suivante (des blancs peuvent apparaître dans ceci; avec seulement des caractères ASCII 32-126) en entrée, sortie en faux si ce caractère est dans la chaîne en entrée, truey sinon. Ce caractère que vous devez rechercher tiendra toujours dans deux plages: "A" à "Z" ou "a" à "z" (ASCII 65-90, 97-122). Ne pas distinguer les capitales et les non-capitales. Ne vous inquiétez pas non plus des blancs et des symboles de ponctuation. Les programmes et les fonctions satisfont. En outre, vous pouvez diviser le caractère et la chaîne en entrée en deux arguments pour les programmes ou les fonctions, et chaîne en tant que premier argument est acceptable.

Des illustrations

Vérité

e This is a lipogram.
a You need to consider other letters too.
E Capitals also count.

Fausseté

e This sentence is not a lipogram (for e).
t This particular letter is surprisingly hard.
A You don't need to care about any non-alphabetic symbols.

Version sans lipogramme

Un lipogramme est une série de mots qui omet une lettre. J'ai oublié la lettre "e" ci-dessus.

Votre tâche consiste à prendre un caractère et une chaîne (pouvant inclure des espaces) en entrée, séparés par un espace ou une nouvelle ligne, et une sortie falsy si le caractère est dans la chaîne, et une vérité sinon. Vous pouvez supposer que la chaîne est composée uniquement de caractères ASCII imprimables (codes de caractère 32-126). Le caractère sera toujours dans l'alphabet anglais et il n'y a pas de différence entre minuscules et majuscules. Le personnage ne sera ni un espace ni un symbole. Vous pouvez écrire un programme ou une fonction. Dans les deux cas, vous pouvez prendre le caractère et la chaîne comme arguments séparés et la chaîne peut figurer en premier.

El'endia Starman
la source
Pour les programmes complets, puis-je prendre les entrées en tant que lignes séparées?
Bleu le
@ Muddyfish: Oui.
El'endia Starman
... et la corde comme premier argument est ok.
Edc65
@ edc65: Oh, j'aime mieux ça.
El'endia Starman
1
Vous devriez essayer "et une chaîne comme votre premier argument est d'accord". ou une configuration similaire.
mbomb007

Réponses:

36

C, 42 octets

#define f(c,s)!strchr(s,c)&!strchr(s,c^32)
Josh
la source
8
Codegolfing en C, Ubercodegolfing.
Brain Guider
25

Javascript ES6 34 26 23 octets

x=>!/^(.).*\1/i.test(x)

rasé 8 octets merci @ MartinBüttner

Shaun H
la source
9
Wow, je ne savais pas que cela /iaffectait \1!
Neil
18

05AB1E , 7 6 4 3 octets

Code:

l`-

Explication:

l     # Convert both elements to lowercase
 `    # Flatten the array
  -   # Loop over the second line of text and substract each char from the first character
        For example: "abcde""ba"- would result in "cde"

Essayez-le en ligne!

La vérité est quand la lettre courante est sortie. La fausseté est quand rien n'est sorti.

Adnan
la source
Tellement -efficacement une opération de complément ?
2012rcampion
@ 2012rcampion Oui, c'est correct. Mais seulement lorsque les deux valeurs ne sont pas des entiers.
Adnan
14

TeaScript, 5 3 octets

AµN

Aha \ o /! J'ai oublié l'entrée implicite! TeaScript insérera automatiquement x.(l'entrée) au début. Je peux alors vérifier s'il a l'autre entrée (variable µ) et donc un NOT ( N). Je suppose que le meilleur avantage de TeaScript est son entrée implicite

Essayez-le en ligne

Explication

  A µ  N
x.A(y).N  // At compile time

x.A // input, has...
(y) // second input
N   // Logical NOT
Downgoat
la source
Sensationnel. Beaucoup intégré. Cela me rappelle que Japt a la même fonctionnalité intégrée ...
supprime
12

Bash, 16 à 11 octets

grep -iv $1

-iest l'indicateur insensible à la casse, -vinversé (recherche d'une non-correspondance).

Le caractère doit être fourni en tant qu'argument de ligne de commande et la chaîne de test sous STDIN.

Réduit de 5 octets avec l'aide de @ DigitalTrauma !

Échantillons:

llama@llama:~$ echo 'This is a lipogram' | ./lipogram.sh e
This is a lipogram.
llama@llama:~$ echo 'This sentence is not a lipogram (for e).' | ./lipogram.sh e
Poignée de porte
la source
Pourquoi ne pas lire la phrase de STDIN? grep -iv $1. Je ne vois rien de mal à mélanger STDIN et les arguments de ligne de commande comme méthodes de saisie - je l'avais déjà fait auparavant - mais il existe peut-être un précédent précédent qui m'a
Digital Trauma
@ DigitalTrauma J'ai envisagé cela, mais j'ai pensé que ce serait un peu louche. Peut-être un sujet à discuter sur méta.
Poignée de porte
Bonne trouvaille @Dennis!
Trauma numérique
1
Pouvons-nous demander à d'autres ^Dutilisateurs de commenter cette réponse? @Downgoat - êtes-vous là? ;-)
Digital Trauma
12

Japt, 12 6 4 octets

!VoU

Testez-le en ligne!

La réponse TeaScript de @ Downgoat m'a rappelé que Japt a exactement la même fonction intégrée, coupant deux derniers octets.

Comment ça fonctionne

       // Implicit: U = input char, V = input string
VoU    // Keep only the chars in V that are equal to U, ignoring case.
!      // Take logical NOT. Returns true if no matches were found, false otherwise.
ETHproductions
la source
@ CᴏɴᴏʀO'Bʀɪᴇɴ Merci à une fonction intégrée que j'avais oubliée, elle est maintenant encore plus courte :)
ETHproductions
6
euh non, pas trop court
Conor O'Brien
10

CJam, 6 octets

lel(&!

Essayez-le en ligne! lel

Explication

l  e# Read a line of input.
el e# Convert to lower case.
(  e# Pull off the first character.
&  e# Set intersection with the rest of the input.
!  e# Logical NOT.
Martin Ender
la source
9

JavaScript (ES6), 29 octets

(c,s)=>!RegExp(c,'i').test(s)
Neil
la source
4
Vous pouvez curry la réponse comme c=>s=>!RegExp(c,"i").test(s), en sauvegardant un octet.
Conor O'Brien
c=>s=>!s.match(c,'i')a 21 ans :)
ETHproductions
@ETHproductions matchne prend qu'un argument. Le deuxième argument enregistre un avertissement de console dans Firefox 39 ou ultérieur et ne fonctionnera pas du tout dans Firefox 47.
Neil
@ Neil J'utilise Firefox 44 et il semble fonctionner parfaitement.
ETHproductions
@ETHproductions Bien sûr, mais je n'ai aucune raison de croire que cela fonctionne dans les autres navigateurs, et cela cessera bientôt de fonctionner dans Firefox.
Neil
7

Python 3, 36

Avoir à ignorer le cas est étonnamment coûteux.

lambda a,b:a.lower()not in b.lower()

Prend les arguments comme (char, chaîne)

Morgan Thrapp
la source
6

Pyth, 8 7 octets

-rz0rw0

Explication

 rw0    -  input().lower()
-       - ^ - V
    rw0 -  input().lower()

Merci @FryAmTheEggman de me dire que je peux utiliser -au lieu de!}

Essayez-le ici

Bleu
la source
6

O, 8 octets

{_.@_-=}

Une fonction anonyme qui prend un caractère et une chaîne.

Essayez-le en ligne.

Explication

{_.@_-=}

{      }
 _        Lowercase string
  .       Duplicate
   @      Rotate stack
    _     Lowercase character
     -    Remove all instances of the character
      =   Compare to original
un spaghetto
la source
Pourquoi cela doit-il être une fonction? Pourquoi ne pas simplement en faire un programme?
phase
@phase Je ne pouvais pas savoir quel personnage était divisé. En tout cas, je suis presque sûr que sa fonction est plus courte.
Un spaghetto
6

Perl, 11 + 1 = 12 octets

$_=lc!~lc<>

Nécessite le -pcommutateur et prend les entrées comme$string\n$letter

$ perl -pe'$_=lc!~lc<>' <<< $'this is a lipogram\ne'
1

Comment ça fonctionne:

            # -p auto reads input into $_ and auto prints at the end
   lc       # lowercase $_
     !~     # Check against regex
       lc<> # Read next line and lowercase it. '=~' will expect the rValue to be
            # a regex and therefore the result from 'lc<>' will be treated as such
$_=         # Assign result ('1' or '') to $_ which will be printed
andlrc
la source
Vous devriez spécifier votre shell. Pour moi, bash sur Ubuntu, cela affiche 1 peu importe l’entrée, en suivant le modèle que vous donnez. (Je ne sais pas pourquoi, mais, alors, je ne suis pas familier avec <<<.) (Et en utilisant STDIN normal (pas <<<), je reçois 1 à moins que la lettre est le dernier caractère de la chaîne, parce que vous ne chomp pas la lettre .)
msh210
@ msh210 Vous pouvez utiliser à la printf "this is a lipogram\ne\n" | perl -pe'$_=lc!~lc<>'place. <<< est la syntaxe bash.
andlrc
@ msh210 <<<n'est qu'un autre moyen de passer stdin.
andlrc
5

Java, 63 octets.

boolean f(String s,char c){return!s.matches("(?i:.*"+c+".*)");}
Shooqie
la source
Vous pouvez aussi écrire une expression lambda (s,c)->!s.matches("(?i:.*"+c+".*)")qui est plus courte
RAnders00 22/02/2016
1
Ce ne serait pas une méthode appropriée cependant, vous devez mettre Stringet charquelque part.
Shooqie
5

MATL , 5 octets

kikm~

Essayez-le en ligne!

k        % take first input (letter) implicitly. Convert to lowercase
ik       % take second input (text). Convert to lowercase
m        % ismember function
~        % negate
Luis Mendo
la source
5

Sérieusement, 6 octets

,ù,ùíu

Essayez-le en ligne!

Prend en tant que 'string'\n'char'

Explication:

,ù,ùíu
,ù      get string (lowercase)
  ,ù    get char (lowercase)
    íu  1-based index (0 if not found)
Mego
la source
Ne serait pas quelque chose comme le ,ù,ùìuYtravail? (C'est supposé être le moi qui indexe mais je ne me souviens plus lequel fait ça)
quintopia
5

Julia 0.3, 22 20 octets

c%s=c&95∉[s...]&95

uppercaseest un long mot.

Comment ça fonctionne

c%s=c&95∉[s...]&95

c%s=                Redefine the binary operator % so it takes a character c and
                    a string s and...
     c&95                Compute lo bitwise AND of c and 95.
                         This casts the character c to uppercase.
          [s...]         Yield the list of the characters of the string s.
                &95      Compute lo bitwise AND of each chararacter and 95.
                         This casts the characters of s to uppercase.
         ∉               Return a Boolean, signaling non-membership.
Dennis
la source
4

Rétine, 11

iA`^(.).*\1

Je ne suis pas sûr que ce qui compte comme véracité / fausseté dans Retina, cela fera écho à la ligne s'il s'agit d'un lipogramme pour le caractère donné, et la chaîne vide sera renvoyée si ce n'est pas le cas.

Cela fonctionnera également pour une entrée multiligne.

Essayez-le en ligne!

FryAmTheEggman
la source
Une chaîne vide est de la fausseté, donc ça compte.
El'endia Starman
4

Minkolang 0,15 , 10 octets

$or7Z0Z,N.

Essayez ici.

Explication

$o            Read in whole input as characters
  r           Reverse stack
   7Z         Lowercase everything
     0Z       Pop top of stack (a) and count how many 'a's are in the stack
       ,      'not' the top of stack
        N.    Output as number and stop.
El'endia Starman
la source
4

Rouille, 75 octets

|c:char,s:&str|!s.to_lowercase().contains(c.to_lowercase().next().unwrap())

Le plus gros score signifie que je gagne, non? > _ <

Essayez ici.

Poignée de porte
la source
4

Gelée, 8 octets

ḢO^O&95P

Essayez-le en ligne!

Comment ça fonctionne

ḢO^O&95P  Main link. Input: S (string)

Ḣ         Pop the first character of S.
 O        Ordinal; compute its code point.
  ^O      XOR it with the code points of the remaining characters.
    &95   AND each result with 95.
       P  Take the product of the results.
Dennis
la source
Attends, la gelée ne gagne pas? Il doit y avoir un moyen de jouer au golf plus loin!
Utilisateur générique
Pas quand les cordes sont impliquées ...
Dennis
Cela doit être rectifié.
CalculatriceFeline
4

CJam, 10 octets

{el\ele=!}

Une fonction anonyme (bloc) qui prend un caractère (pas une chaîne!) Et une chaîne.

Essayez-le en ligne.

Explication

{el\ele=!}

{        }
 el\el      lowercase both args
      e=    count occurrences of the character
        !   logical not
un spaghetto
la source
4

PowerShell, 36 32 30 29 25 octets

param($a,$b)$b-notmatch$a

Utilise l' -notmatchopérateur et affiche simplement Trueou False.

AdmBorkBork
la source
4

Python, 34 octets

lambda c,s:c not in s+s.swapcase()

Vérifie que le caractère cest dans la chaîne s, ignorant la casse en ajoutant une copie de casse sà s. La négation est terminée not, ce qui a l'air long mais je ne vois pas mieux. C'est la même longueur:

lambda c,s:(c in s+s.swapcase())<1

Vous ne pouvez pas omettre les parens sinon Python interprétera l'expression comme une inégalité de forme chaînée à trois valeurs _ in _ < _.

Python 3.5 devrait autoriser 33 octets via des conversions définies, bien que je ne puisse pas le tester pour le moment.

lambda c,s:{*c}-{*s+s.swapcase()}
Xnor
la source
4

Pyke, 7 octets

Dl3+R{!

Explication:

D       -     eval_or_not(input()).lower()
 l3     -    ^.swapcase()
   +    -   ^+^
    R   -  rotate 2
     {  -  ^ in ^
      ! - not ^
Bleu
la source
3

JavaScript ES6, 41 à 40 octets

x=>!~x.slice(2).search(RegExp(x[0],"i"))

Prend la chaîne entière comme argument. Je ne peux pas économiser d'octets en acceptant deux arguments différents car ma réponse se fondrait alors dans l'autre réponse ES6 :(

Conor O'Brien
la source
Je gagne cette fois, ES6. ;) Votre syntaxe de fonction anonyme ne correspond pas à my not in.
Morgan Thrapp
@ MorganThrapp Gahh, déjoué à nouveau!
Conor O'Brien
c'est ok j'ai ça , tu bouges @ MorganThrapp.
Shaun H
3

R, 26 octets

 function(x,y)!grepl(y,x,T)

x est la chaîne, y est la lettre, le T dans l'appel à grepl la rend insensible à la casse.

couloir
la source
3

Jolf, 6 7 octets

Alors. Beaucoup. Six. SMS? Eh bien, essayez néanmoins ici . Remplacer par \x7f.

⌂ MiI'i
⌂_M      match with flags
   i     the input
    I    with another input
     'i  using i as a flag
Conor O'Brien
la source
2

Ruby, 17 octets

->c,s{/#{c}/i!~s}
->c,s{  # lambda with two arguments
/#{c}/  # turn the input character into a regexp w/ interpolation
i       # case insensitive
!~      # does not match
s       # input string
}
Poignée de porte
la source
2

Lot, 53 octets

@set s=%2
@call set t=%%s:%1=%%
@if %s%==%t% echo 1

Accepte les entrées en tant que deux arguments de ligne de commande. (Citez le deuxième argument si nécessaire.) Affiche 1 en cas de succès, rien si le premier argument est (insensiblement) trouvé dans le second.

Neil
la source
2

Mathematica, 33 32 octets

StringFreeQ[##,IgnoreCase->1>0]&

J'adore quand ## peut être utilisé. L'entrée est une chaîne, puis char.

Ou, une version sensible à la casse: (11 octets :)

StringFreeQ

Oui, juste un construit.

CalculatriceFeline
la source