Czy to lipogram?

52

Lipogram to blok słów, który pomija określony symbol. W tej chwili unikam piątego symbolu 26, który zwykle się pojawia. Powinieneś już wiedzieć, co pomijam. Jeśli nie, spójrz na „lipogram”, a dowiesz się.

Twoje zadanie

Z char, spacją i następującym ciągiem znaków (w tym mogą pojawiać się spacje; tylko znaki ASCII 32-126) na wejściu, wypisuje fałsz, jeśli ten char jest w ciągu wejściowym, prawda, jeśli nie. Znak, którego szukasz, zawsze będzie pasował do dwóch zakresów: „A” do „Z” lub „a” do „z” (ASCII 65-90, 97-122). Nie rozróżniaj wielkich i małych liter. Nie martw się również o znaki puste i interpunkcyjne. Zarówno programy, jak i funkcje spełniają. Możesz także podzielić znak wejściowy i ciąg znaków na dwa argumenty dla programów lub funkcji, a ciąg znaków jako pierwszy argument jest w porządku.

Ilustracje

Prawda

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.

Wersja bez lipogramu

Lipogram to seria słów, które pomijają literę. Pominąłem literę „e” powyżej.

Twoim zadaniem jest pobranie znaku i łańcucha (który może zawierać spacje) jako danych wejściowych, oddzielonych spacją lub znakiem nowej linii i wygenerowanie fałszowania, jeśli znak znajduje się w łańcuchu, a tak naprawdę. Możesz założyć, że łańcuch składa się wyłącznie z drukowalnych znaków ASCII (kody znaków 32-126). Znak zawsze będzie w alfabecie angielskim i nie ma różnicy między małymi a wielkimi literami. Postać nie będzie spacją ani symbolem. Możesz napisać program lub funkcję. W obu przypadkach można traktować znak i ciąg jako osobne argumenty, a ciąg może być na pierwszym miejscu.

El'endia Starman
źródło
W przypadku pełnych programów mogę wprowadzać dane jako osobne linie?
Niebieski
@muddyfish: Tak.
El'endia Starman
... i ciąg jako pierwszy argument jest w porządku.
edc65
@ edc65: Och, bardziej mi się podoba.
El'endia Starman
1
Należy spróbować „i ciąg jako swoim pierwszym arg jest w porządku.” lub podobna konfiguracja.
mbomb007,

Odpowiedzi:

36

C, 42 bajty

#define f(c,s)!strchr(s,c)&!strchr(s,c^32)
Josh
źródło
8
Codegolfing w C, Ubercodegolfing.
Brain Guider
25

JavaScript ES6 34 26 23 bajtów

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

ogolono 8 bajtów dzięki @ MartinBüttner

Shaun H.
źródło
9
Wow, nie wiedziałem, że to /idotyczy \1!
Neil
18

05AB1E , 7 6 4 3 bajty

Kod:

l`-

Wyjaśnienie:

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"

Wypróbuj online!

Prawda jest wtedy, gdy wypisywana jest bieżąca litera. Falsy występuje wtedy, gdy nic nie jest wyprowadzane.

Adnan
źródło
Tak -skutecznie działa operacja uzupełniająca ?
2012rcampion
@ 2012rcampion Tak, to prawda. Ale tylko wtedy, gdy obie wartości nie są liczbami całkowitymi.
Adnan
14

TeaScript, 5 3 bajty

AµN

Aha \ o /! Zapomniałem o niejawnych danych wejściowych! TeaScript automatycznie wstawi x.(dane wejściowe) na początku. Następnie mogę sprawdzić, czy ma inne dane wejściowe (w zmiennej µ), a więc NIE ( N). Myślę, że najlepszą zaletą TeaScript jest jego domyślny wkład

Wypróbuj online

Wyjaśnienie

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

x.A // input, has...
(y) // second input
N   // Logical NOT
Downgoat
źródło
Łał. Wiele wbudowanych. To mi przypomina, że ​​Japt ma tę samą wbudowaną ... odcina kolejne dwa bajty :)
ETHproductions
12

Bash, 16 11 bajtów

grep -iv $1

-ijest flaga bez rozróżniania wielkości liter, -vodwraca (sprawdza niezgodność).

Znak musi być podany jako argument wiersza poleceń, a ciąg testowy na STDIN.

Zmniejszony o 5 bajtów z pomocą @ DigitalTrauma !

Przykładowe przebiegi:

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
Klamka
źródło
Dlaczego nie przeczytać zdania ze STDIN? grep -iv $1. Nie widzę nic złego w mieszaniu STDIN i argumentów wiersza poleceń jako metod wprowadzania - zrobiłem to wcześniej - ale być może istnieje meta precedens, za którym tęskniłem ...
Digital Trauma
@DigitalTrauma Rozważyłem to, ale pomyślałem, że będzie to trochę szkicowe. Być może temat do dyskusji na temat meta.
Klamka
Dobre znalezisko @Dennis!
Cyfrowa trauma
1
Czy możemy zachęcić więcej ^Dużytkowników do skomentowania tej odpowiedzi? @Downgoat - jesteś tam? ;-)
Cyfrowa trauma
12

Japt, 12 6 4 bajtów

!VoU

Przetestuj online!

Odpowiedź Teago @ Downgoat przypomniała mi, że Japt ma dokładnie taką samą wbudowaną funkcję, odcinając ostatnie dwa bajty.

Jak to działa

       // 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.
ETHprodukcje
źródło
@ CᴏɴᴏʀO'Bʀɪᴇɴ Dzięki wbudowanemu, o którym zapomniałem, jest teraz jeszcze krótszy :)
ETHproductions
6
hmm, czekaj nie, to za krótko
Conor O'Brien
10

CJam, 6 bajtów

lel(&!

Wypróbuj online! lel

Wyjaśnienie

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
źródło
9

JavaScript (ES6), 29 bajtów

(c,s)=>!RegExp(c,'i').test(s)
Neil
źródło
4
Możesz curry odpowiedź jako c=>s=>!RegExp(c,"i").test(s), oszczędzając bajt.
Conor O'Brien
c=>s=>!s.match(c,'i')jest 21. :)
ETHproductions
@ETHproductions matchbierze tylko jeden argument. Drugi argument rejestruje ostrzeżenie konsoli w przeglądarce Firefox 39 lub nowszej i nie działa w ogóle w przeglądarce Firefox 47.
Neil
@Neil Używam Firefoksa 44 i wydaje się, że działa idealnie dobrze.
ETHprodukcje
@ETHproductions Jasne, ale nie mam powodu sądzić, że działa w innych przeglądarkach, a wkrótce przestanie działać w przeglądarce Firefox.
Neil
7

Python 3, 36

Zignorowanie przypadku jest zaskakująco drogie.

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

Przyjmuje argumenty jako (char, string)

Morgan Thrapp
źródło
6

Pyth, 8 7 bajtów

-rz0rw0

Wyjaśnienie

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

Dzięki @FryAmTheEggman za informację, że mogę użyć -zamiast!}

Wypróbuj tutaj

niebieski
źródło
6

O, 8 bajtów

{_.@_-=}

Anonimowa funkcja, która pobiera znak i ciąg znaków.

Wypróbuj online.

Wyjaśnienie

{_.@_-=}

{      }
 _        Lowercase string
  .       Duplicate
   @      Rotate stack
    _     Lowercase character
     -    Remove all instances of the character
      =   Compare to original
spaghetto
źródło
Dlaczego to musi być funkcja? Dlaczego nie ma to być program?
faza
@ faza Nie mogłem rozgryźć, który znak został podzielony. W każdym razie jestem prawie pewien, że i tak jest on krótszy.
spaghetto
6

Perl, 11 + 1 = 12 bajtów

$_=lc!~lc<>

Wymaga -pprzełącznika i przyjmuje dane wejściowe jako$string\n$letter

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

Jak to działa:

            # -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
źródło
Powinieneś podać swoją powłokę. Dla mnie, bash na Ubuntu, drukuje 1 bez względu na dane wejściowe, zgodnie z danym szablonem. (Nie wiem dlaczego, ale wtedy nie jestem zaznajomiony z <<<.) (I używając normalnego STDIN (nie <<<), dostaję 1, chyba że litera jest ostatnim znakiem w ciągu, ponieważ nie łamiesz litery .)
msh210
@ msh210 Możesz użyć printf "this is a lipogram\ne\n" | perl -pe'$_=lc!~lc<>'zamiast tego. <<< jest składnią bash.
andlrc
@ msh210 <<<to kolejny sposób na przekazanie standardowego wejścia.
andlrc
5

Java, 63 bajty.

boolean f(String s,char c){return!s.matches("(?i:.*"+c+".*)");}
shooqie
źródło
Możesz także napisać wyrażenie lambda, (s,c)->!s.matches("(?i:.*"+c+".*)")które jest krótsze
RAnders00
1
To nie byłaby właściwa metoda choć, trzeba umieścić Stringi chargdzieś.
shooqie
5

MATL , 5 bajtów

kikm~

Wypróbuj online!

k        % take first input (letter) implicitly. Convert to lowercase
ik       % take second input (text). Convert to lowercase
m        % ismember function
~        % negate
Luis Mendo
źródło
5

Poważnie, 6 bajtów

,ù,ùíu

Wypróbuj online!

Pobiera dane wejściowe jako 'string'\n'char'

Wyjaśnienie:

,ù,ùíu
,ù      get string (lowercase)
  ,ù    get char (lowercase)
    íu  1-based index (0 if not found)
Mego
źródło
Czy coś takiego nie ,ù,ùìuYdziałałoby? (To powinien być ja, który indeksuje, ale nie pamiętam, który to robi)
kwintopia
5

Julia 0.3, 22 20 bajtów

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

uppercaseto długie słowo.

Jak to działa

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
źródło
4

Siatkówka, 11

iA`^(.).*\1

Nie jestem pewien, co w Retinie liczy się jako prawda / fałsz, spowoduje to wyświetlenie echa linii, jeśli jest to lipogram dla danego znaku i zwróci pusty ciąg, jeśli nie jest.

Będzie to również działać w przypadku wprowadzania wielowierszowego.

Wypróbuj online!

FryAmTheEggman
źródło
Pusty ciąg jest fałszem, więc się liczy.
El'endia Starman
4

Minkolang 0,15 , 10 bajtów

$or7Z0Z,N.

Wypróbuj tutaj.

Wyjaśnienie

$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
źródło
4

Rdza, 75 bajtów

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

Największy wynik oznacza, że ​​wygrałem, prawda? > _ <

Wypróbuj tutaj.

Klamka
źródło
4

Galaretka, 8 bajtów

ḢO^O&95P

Wypróbuj online!

Jak to działa

Ḣ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
źródło
Zaraz, galaretka nie wygrywa? Musi istnieć sposób na grę w golfa dalej!
Użytkownik ogólny
Nie, gdy w grę wchodzą łańcuchy ...
Dennis
To musi zostać naprawione.
CalculatorFeline
4

CJam, 10 bajtów

{el\ele=!}

Anonimowa funkcja (blok), która pobiera znak (nie ciąg znaków!) I ciąg znaków.

Wypróbuj online.

Wyjaśnienie

{el\ele=!}

{        }
 el\el      lowercase both args
      e=    count occurrences of the character
        !   logical not
spaghetto
źródło
4

PowerShell, 36 32 30 29 25 bajtów

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

Korzysta z -notmatchoperatora i po prostu wyprowadza Truelub False.

AdmBorkBork
źródło
4

Python, 34 bajty

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

Sprawdza, czy znak cjest w ciągu s, ignorując wielkość liter, dodając zamienioną wielkość liter sdo s. Negacja jest zakończona not, co wygląda na długie, ale nie widzę lepiej. Jest to ta sama długość:

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

Nie można pominąć parens, w przeciwnym razie Python interpretuje wyrażenie jako łańcuchową nierówność formy o trzech wartościach _ in _ < _.

Python 3.5 powinien zezwalać na 33 bajty poprzez konwersje zestawów, chociaż nie mogę tego teraz przetestować.

lambda c,s:{*c}-{*s+s.swapcase()}
xnor
źródło
4

Pyke, 7 bajtów

Dl3+R{!

Wyjaśnienie:

D       -     eval_or_not(input()).lower()
 l3     -    ^.swapcase()
   +    -   ^+^
    R   -  rotate 2
     {  -  ^ in ^
      ! - not ^
niebieski
źródło
3

JavaScript ES6, 41 40 bajtów

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

Bierze cały ciąg jako argument. Nie mogę zapisać bajtów, akceptując dwa różne argumenty, ponieważ wtedy moja odpowiedź stopiłaby się z inną odpowiedzią ES6 :(

Conor O'Brien
źródło
Tym razem wygrywam, ES6. ;) Twoja anonimowa składnia funkcji nie pasuje do mojej not in.
Morgan Thrapp
@MorganThrapp Gahh, udaremniony ponownie!
Conor O'Brien
to jest ok, mam to , przenieść @MorganThrapp.
Shaun H
3

R, 26 bajtów

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

x jest łańcuchem, y jest literą, T w wywołaniu grepl powoduje, że wielkość liter nie jest uwzględniana.

mnel
źródło
3

Jolf, 6 7 bajtów

Więc. Wiele. Szóstki. SMS? Cóż, spróbować go tutaj jednak. Wymień się \x7f.

⌂ MiI'i
⌂_M      match with flags
   i     the input
    I    with another input
     'i  using i as a flag
Conor O'Brien
źródło
2

Rubinowy, 17 bajtów

->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
}
Klamka
źródło
2

Partia, 53 bajty

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

Akceptuje dane wejściowe jako dwa argumenty wiersza polecenia. (W razie potrzeby podaj drugi argument.) W przypadku powodzenia zwraca 1, nic, jeśli pierwszy argument (nieczułość) zostanie znaleziony w drugim.

Neil
źródło
2

Mathematica, 33 32 bajty

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

Uwielbiam, kiedy można użyć ##. Dane wejściowe to ciąg znaków, a następnie char.

Lub wersja z rozróżnianiem wielkości liter: (11 bajtów :)

StringFreeQ

Tak, tylko wbudowany.

CalculatorFeline
źródło