É um lipograma?


52

Um lipograma é um bloco de palavras que omite um símbolo específico. No momento, estou evitando nosso quinto símbolo de 26, que geralmente aparece. Você já deve saber o que estou omitindo. Caso contrário, procure "lipograma" e você saberá.

Sua tarefa

Com um caractere, um espaço em branco e uma sequência a seguir (os espaços em branco podem aparecer nisso; somente com caracteres ASCII 32-126) na entrada, saída falsa se esse caractere estiver na sequência de entrada, na verdade, se não. Esse caractere que você deve procurar sempre caberá em dois intervalos: "A" a "Z" ou "a" a "z" (ASCII 65-90, 97-122). Não faça distinção entre capitais e não capitais. Além disso, não se preocupe com espaços em branco ou símbolos de pontuação. Ambos os programas e funções satisfazem. Além disso, você pode dividir a entrada char e string em dois argumentos para programas ou funções, e a string como o primeiro argumento é aceitável.

Ilustrações

Truthy

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

Falsy

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.

Versão não lipogramada

Um lipograma é uma série de palavras que deixa de fora uma carta. Eu deixei de fora a letra "e" acima.

Sua tarefa é pegar um caractere e uma string (que podem incluir espaços) como entrada, separados por um espaço ou nova linha, e gerar falsas se o caractere estiver na string e, na verdade, de outra forma. Você pode assumir que a string é composta somente de caracteres ASCII imprimíveis (códigos de caracteres 32-126). O caractere sempre estará no alfabeto inglês e não há diferença entre letras minúsculas e maiúsculas. O personagem não será um espaço ou símbolo. Você pode escrever um programa ou uma função. Para ambos, você pode usar o caractere e a sequência como argumentos separados, e a sequência pode vir primeiro.


Para programas completos, posso receber as entradas como linhas separadas?
Azul

@muddyfish: Sim.
El'endia Starman 22/02

... e string como o primeiro argumento está ok.
Edc65 22/02

@ edc65: Ah, eu gosto mais disso.
El'endia Starman 22/02

11
Você deve tentar "e uma string, pois seu primeiro argumento está correto". ou uma configuração semelhante.
mbomb007

Respostas:


36

C, 42 bytes

#define f(c,s)!strchr(s,c)&!strchr(s,c^32)

8
Codegolfing em C, Ubercodegolfing.
Brain Guider

25

Javascript ES6 34 26 23 Bytes

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

raspado 8 bytes obrigado @ MartinBüttner


9
Uau, eu não sabia o que /iafetou \1!
Neil

18

05AB1E , 7 6 4 3 bytes

Código:

l`-

Explicação:

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"

Experimente online!

Verdade é quando a letra atual é emitida. Falsy é quando nada é produzido.


Tão -eficaz é uma operação de complemento ?
2012rcampion

@ 2012rcampion Sim, está correto. Mas somente quando os dois valores não são números inteiros.
Adnan

14

TeaScript, 5 3 bytes

AµN

Aha \ o /! Eu esqueci a entrada implícita! O TeaScript inserirá automaticamente x.(a entrada) no início. Posso então verificar se tem a outra entrada (na variável µ) e, portanto, um NOT ( N). Eu acho que a melhor vantagem do TeaScript aqui é a sua entrada implícita

Experimente online

Explicação

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

x.A // input, has...
(y) // second input
N   // Logical NOT

Uau. Muito embutido. Isso me lembra que o Japt tem o mesmo built-in ... corta mais dois bytes :) :)
ETHproductions

12

Bash, 16 11 bytes

grep -iv $1

-ié o sinalizador que não -vdiferencia maiúsculas de minúsculas, inverte (verifica se não há correspondência).

O caractere deve ser fornecido como um argumento de linha de comando e a sequência de teste em STDIN.

Reduzido em 5 bytes com a ajuda do @ DigitalTrauma !

Amostras de execuções:

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

Por que não ler a frase de STDIN? grep -iv $1. Eu não vejo nada de errado com mistura STDIN e argumentos de linha de comando como métodos de entrada - I feito isso antes - mas talvez há um precedente meta que eu perdi ...
Digital Trauma

@DigitalTrauma Eu considerei isso, mas achei que seria um pouco superficial. Talvez um tópico a ser discutido na meta.
Maçaneta


Boa descoberta @Dennis!
Digital Trauma

11
Podemos fazer com que mais ^Dusuários comentem esta resposta? @Downgoat - você está aí? ;-)
Digital Trauma

12

Japonês, 12 6 4 bytes

!VoU

Teste online!

A resposta TeaScript da @ Downgoat me lembrou que o Japt possui exatamente o mesmo built-in, cortando os dois bytes finais.

Como funciona

       // 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.

@ CᴏɴᴏʀO'Bʀɪᴇɴ Graças a um built-in eu tinha esquecido, agora é ainda mais curto :)
ETHproductions

6
hum não espere que seja demasiado curto
Conor O'Brien

10

CJam, 6 bytes

lel(&!

Experimente online! lel

Explicação

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.

9

JavaScript (ES6), 29 bytes

(c,s)=>!RegExp(c,'i').test(s)

4
Você pode curry a resposta como c=>s=>!RegExp(c,"i").test(s), salvando um byte.
Conor O'Brien

c=>s=>!s.match(c,'i')é 21. :)
ETHproductions

@ETHproductions matchleva apenas um argumento. O segundo argumento registra um aviso do console no Firefox 39 ou posterior e não funciona no Firefox 47.
Neil

@ Neil Estou usando o Firefox 44, e parece funcionar perfeitamente bem.
ETHproductions

@ETHproductions Claro, mas não tenho motivos para acreditar que funcione em outros navegadores e também deixará de funcionar no Firefox em breve.
Neil

7

Python 3, 36

Ter que ignorar a caixa é surpreendentemente caro.

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

Aceita os argumentos como (char, string)



6

O, 8 bytes

{_.@_-=}

Uma função anônima que recebe um caractere e uma string.

Experimente online.

Explicação

{_.@_-=}

{      }
 _        Lowercase string
  .       Duplicate
   @      Rotate stack
    _     Lowercase character
     -    Remove all instances of the character
      =   Compare to original

Por que isso precisa ser uma função? Por que não apenas ser um programa?
fase

@ Phase eu não conseguia descobrir o que char foi dividido. De qualquer forma, tenho quase certeza de que é mais curto como uma função.
a spaghetto

6

Perl, 11 + 1 = 12 bytes

$_=lc!~lc<>

Requer a -pchave e recebe as entradas como$string\n$letter

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

Como funciona:

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

Você deve especificar seu shell. Para mim, bash no Ubuntu, isso imprime 1 independentemente da entrada, seguindo o modelo que você fornece. (Não sei por que, mas não conheço <<<.) (E usando STDIN normal (não <<<), recebo 1, a menos que a letra seja o último caractere da string, porque você não a mastiga. )
msh210

@ msh210 Você pode usar printf "this is a lipogram\ne\n" | perl -pe'$_=lc!~lc<>'. <<< é a sintaxe do bash.
andlrc

@ msh210 <<<é apenas mais uma maneira de passar o stdin.
andlrc

5

Java, 63 bytes.

boolean f(String s,char c){return!s.matches("(?i:.*"+c+".*)");}

Você também pode escrever uma expressão lambda (s,c)->!s.matches("(?i:.*"+c+".*)")que é mais curta
RAnders00

11
Não seria um método adequado, porém, você tem que colocar Stringe charem algum lugar.
23616 shooqie

5

MATL , 5 bytes

kikm~

Experimente online!

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

5

Sério, 6 bytes

,ù,ùíu

Experimente online!

Aceita entrada como 'string'\n'char'

Explicação:

,ù,ùíu
,ù      get string (lowercase)
  ,ù    get char (lowercase)
    íu  1-based index (0 if not found)

Algo como ,ù,ùìuYtrabalho? (Que é suposto ser o eu que faz indexOf mas eu não lembro qual faz isso)
quintopia

5

Julia 0,3, 22 20 bytes

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

uppercaseé uma palavra longa .

Como funciona

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.

4

Retina, 11

iA`^(.).*\1

Não sei ao certo o que conta como verdade / falsidade na Retina, isso ecoará a linha se for um lipograma para o caractere especificado e retornará a string vazia, se não for.

Isso também funcionará para entrada de várias linhas.

Experimente online!


Uma string vazia é falsa, então isso conta.
El'endia Starman 22/02

4

Minkolang 0.15 , 10 bytes

$or7Z0Z,N.

Experimente aqui.

Explicação

$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.


4

Gelatina, 8 bytes

ḢO^O&95P

Experimente online!

Como funciona

Ḣ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.

Espere, geléia não está ganhando? Deve haver uma maneira de jogar ainda mais!
Usuário genérico

Não quando cordas estão envolvidos ...
Dennis

Isso deve ser corrigido.
CalculatorFeline

4

CJam, 10 bytes

{el\ele=!}

Uma função anônima (bloco) que recebe um caractere (não uma string!) E uma string.

Experimente online.

Explicação

{el\ele=!}

{        }
 el\el      lowercase both args
      e=    count occurrences of the character
        !   logical not


4

Python, 34 bytes

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

Verifica se o caractere cestá na sequência s, ignorando maiúsculas e minúsculas, anexando uma cópia trocada por maiúsculas de spara s. A negação está terminada not, que parece longa, mas não vejo melhor. Este é o mesmo comprimento:

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

Você não pode omitir os parênteses ou o Python interceptará a expressão como uma desigualdade de forma encadeada de três valores _ in _ < _.

O Python 3.5 deve permitir 33 bytes por meio de conversões definidas, embora eu não possa testá-lo agora.

lambda c,s:{*c}-{*s+s.swapcase()}

4

Pyke, 7 bytes

Dl3+R{!

Explicação:

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

3

JavaScript ES6, 41 40 bytes

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

Pega a cadeia inteira como argumento. Não consigo salvar bytes aceitando dois argumentos diferentes, porque minha resposta se fundiria com a outra resposta ES6 :(


Eu ganho desta vez, ES6. ;) Sua sintaxe de função anônima não é páreo para o meu not in.
22416 Morgan Thrapp

@MorganThrapp Gahh, frustrou novamente!
Conor O'Brien

tudo bem eu entendi , você se move @MorganThrapp.
Shaun H

3

R, 26 bytes

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

x é a string, y é a letra, o T na chamada para grepl faz com que não seja sensível a maiúsculas e minúsculas.


3

Jolf, 6 7 bytes

Assim. Muitos. Seis. SMS? Bem, tente aqui mesmo assim. Substitua por \x7f.

⌂ MiI'i
⌂_M      match with flags
   i     the input
    I    with another input
     'i  using i as a flag

2

Ruby, 17 bytes

->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
}

2

Lote, 53 bytes

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

Aceita entrada como dois argumentos de linha de comando. (Cite o segundo argumento, se necessário.) Produz 1 em caso de sucesso, nada se o primeiro argumento for (insensível) encontrado no segundo.


2

Mathematica, 33 32 bytes

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

Adoro quando ## pode ser usado. Entrada é string e, em seguida, char.

Ou, uma versão que diferencia maiúsculas de minúsculas: (11 bytes :)

StringFreeQ

Sim, apenas um builtin.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.