Bir lipogram mı?


52

Bir lipogram, belirli bir sembolü ihmal eden bir kelime bloğudur. Şu anda, yaygın olarak görülen 26 numaralı beşinci sembolümüzden kaçınıyorum. Şimdi ne atladığımı bilmelisin. Değilse, "lipogram" konusuna bakın ve bileceksiniz.

Senin görevin

Bir karakter, bir boşluk ve aşağıdaki bir karakter dizisi (bunlarda boşluklar görünebilir; yalnızca ASCII 32-126 karakterleri ile) girişinde, bu karakter giriş dizgisinde ise yanlış çıktı verir, eğer değilse truthy. Aramanız gereken bu karakter daima iki alana sığacaktır: "A" - "Z" veya "a" - "z" (ASCII 65-90, 97-122). Büyük harfleri ve büyük harfleri ayırt etmeyin. Ayrıca, boşluklar veya noktalama işaretleri hakkında endişelenmeyin. Hem programlar hem de işlevler tatmin edicidir. Ayrıca, giriş karakterini ve dizgisini programlar veya işlevler için iki kısma bölebilirsiniz ve dize ilk argüman olduğu için dize.

Çizimleri

Doğru

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.

Lipogramlanmamış versiyon

Bir lipogram, bir harf bırakan bir dizi kelimedir. Yukarıdaki "e" harfini bıraktım.

Göreviniz bir karakter veya bir karakter dizisi (boşluklar içerebilir) girdi olarak, boşluk veya satırsonu ile ayrılmış ve karakter dizgede ise yanlış çıktı, aksi halde truthy almaktır. Dizenin yalnızca yazdırılabilir ASCII karakterlerinden oluştuğunu varsayabilirsiniz (karakter kodları 32-126). Karakter her zaman İngilizce alfabesinde olacak ve küçük harf ve büyük harf arasında bir fark yoktur. Karakter boşluk veya sembol olmayacak. Bir program veya işlev yazabilirsiniz. Her iki durumda da, karakter ve dizgiyi ayrı argümanlar olarak alabilir ve dize önce gelebilir.


Tüm programlar için girişi ayrı satırlar olarak alabilir miyim?
Mavi,

@muddyfish: Evet.
El'endia Starman,

... ve ilk argüman olarak dize tamam.
edc65

@ edc65: Oh, daha çok hoşuma gitti.
El'endia Starman,

1
Denemelisin "ve ilk argüman tamam olduğu için bir dize ." veya benzer bir konfigürasyon.
mbomb007

Yanıtlar:



25

Javascript ES6 34 26 23 Bayt

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

MartinBüttner @ 8 bayt teşekkürler tıraş


9
Vay canına, bunun /ietkilendiğini bilmiyordum \1!
Neil

18

05AB1E , 7 6 4 3 bayt

Kod:

l`-

Açıklama:

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"

Çevrimiçi deneyin!

Gerçek şu ki, geçerli harf çıktığında. Sahte, hiçbir şey çıkmadığı zamandır.


Peki -bir tamamlayıcı operasyon etkili mi?
2012rampamp

@ 2012rcampion Evet, bu doğru. Ancak, yalnızca her iki değer de tamsayı olmadığında.
Adnan

14

TeaScript, 5 3 bayt

AµN

Aha \ o /! Örtük girişleri unuttum! TeaScript x.başında otomatik olarak (giriş) ekleyecektir . Daha sonra başka bir girişi olup olmadığını (değişkende µ) ve böylece bir NOT ( N) olup olmadığını kontrol edebilirim . Sanırım TeaScript'in buradaki en büyük avantajı üstü kapalı bir giriş.

Çevrimiçi deneyin

açıklama

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

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

Vay. Çok yerleşiktir. Bu bana hatırlatıyor, Japt aynı yerleşik yapıya sahip ... başka bir iki
byte'ı

12

Bash, 16 11 bayt

grep -iv $1

-ibüyük / küçük harfe duyarlı olmayan bayrak, -vters çevirir (eşleşmeyen birini denetler).

Karakter bir komut satırı argümanı ve STDIN'deki test dizgisi olarak sağlanmalıdır.

@ DigitalTrauma'nın yardımı ile 5 byte azaltıldı !

Örnek çalışır:

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

Neden cümleyi STDIN'den okumuyorsun? grep -iv $1. STDIN ve komut satırlarının argümanlarını giriş yöntemleri olarak karıştırırken yanlış bir şey görmüyorum - Daha önce yaptım - ama belki de kaçırdığım bir emsal var ...
Digital Trauma,

@DigitalTrauma Bunu düşündüm, ama biraz kabataslak olacağını düşündüm. Belki de meta üzerinde tartışılacak bir konu.
Doorknob


İyi bulmak @ Dennis!
Dijital Travma,

1
Daha fazla ^Dkullanıcının bu cevap hakkında yorum yapmasını sağlayabilir miyiz ? @Downgoat - orada mısın? ;-)
Digital Trauma

12

Japt, 12 6 4 bayt

!VoU

Çevrimiçi test edin!

@ Downgoat'ın TeaScript yanıtı, Japt’ın tamamen aynı bir dahili paya sahip olduğunu ve son iki baytı kesildiğini hatırlattı.

Nasıl çalışır

       // 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ʀɪᴇɴ Unuttuğum bir yerleşik sayesinde, şimdi daha da kısa :)
ETHproductions 23'16

6
um bekleyin hayır bu çok kısa
Conor O'Brien

10

CJam, 6 bayt

lel(&!

Çevrimiçi deneyin! lel

açıklama

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 bayt

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

4
Cevabı c=>s=>!RegExp(c,"i").test(s)bir bayt kaydederek körleyebilirsiniz.
Conor O'Brien,

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

@ETHproductions matchsadece bir argüman alır. İkinci argüman, Firefox 39 veya sonraki sürümlerinde bir konsol uyarısı kaydeder ve Firefox 47'de hiç çalışmaz.
Neil

@Neil Firefox 44 kullanıyorum ve mükemmel çalışıyor gibi görünüyor.
ETHProductions

@ETHproductions Elbette, ancak diğer tarayıcılarda çalıştığına inanmak için hiçbir nedenim yok ve yakında Firefox'ta çalışmayı bırakacak.
Neil

7

Python 3, 36

Davayı yok saymak zorunda kalmak şaşırtıcı derecede pahalıdır.

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

Argümanları şu şekilde alır (char, string)


6

Pyth, 8 7 bayt

-rz0rw0

açıklama

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

@FryAmTheEggman- yerine bana kullanabileceğimi söylediğiniz için teşekkürler!}

Burada dene


6

O, 8 bayt

{_.@_-=}

Karakter ve dize alan anonim bir işlev.

Çevrimiçi deneyin.

açıklama

{_.@_-=}

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

Bunun neden bir fonksiyon olması gerekiyor? Neden sadece bir program olmadı?
faz

@phase Hangi karakterin bölündüğünü bulamadım. Her halükarda, zaten bir fonksiyon olarak daha kısa olduğuna eminim.
Bir

6

Perl, 11 + 1 = 12 bayt

$_=lc!~lc<>

-pAnahtarı gerektirir ve girişi olduğu gibi alır.$string\n$letter

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

Nasıl çalışır:

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

Kabuğunu belirtmelisin. Benim için, Ubuntu'da bash, bu giriş ne olursa olsun, verdiğiniz şablonu takip ederek 1 basar. (Nedenini bilmiyorum ama o zaman aşina değilim <<<.) (Ve normal STDIN (no <<<) kullanarak , karakter dizedeki son karakter olmadıkça 1 alırım, çünkü harfi Chomp .)
msh210

@ msh210 Bunun printf "this is a lipogram\ne\n" | perl -pe'$_=lc!~lc<>'yerine kullanabilirsiniz . <<< bash sözdizimidir.
andlrc

@ msh210 stdin'i geçmenin <<<başka bir yoludur.
andlrc

5

Java, 63 bayt.

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

Ayrıca (s,c)->!s.matches("(?i:.*"+c+".*)")kısa olan bir lambda ifadesi de yazabilirsiniz
RAnders00

1
Ama uygun bir yöntem olmaz, sen koymak zorunda Stringve charbir yerde.
shooqie

5

MATL , 5 bayt

kikm~

Çevrimiçi deneyin!

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

5

Cidden, 6 bayt

,ù,ùíu

Çevrimiçi deneyin!

Girişi alır 'string'\n'char'

Açıklama:

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

,ù,ùìuYİş gibi bir şey olmaz mı? (Bu indexOf yapar ben olması gerekiyordu ama hangisinin bunu yaptığını hatırlamıyorum)
quintopia

5

Julia 0.3, 22 20 bayt

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

uppercaseBir olan uzun kelime.

Nasıl çalışır

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

Retina’da truthy / falsy sayılan şeyin ne olduğundan emin değilim, bu verilen karakter için bir lipogram ise çizgiyi yankılanacak ve eğer değilse boş dizgeye dönecektir.

Bu aynı zamanda multiline giriş için de işe yarayacaktır.

Çevrimiçi deneyin!


Boş bir dize sahtedir, bu sayılır.
El'endia Starman,

4

Minkolang 0,15 , 10 bayt

$or7Z0Z,N.

Burada dene.

açıklama

$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

Pas, 75 bayt

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

En büyük puan kazandığım anlamına gelir, değil mi? > _ <

Burada dene.


4

Jöle, 8 bayt

ḢO^O&95P

Çevrimiçi deneyin!

Nasıl çalışır

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

Bekle, jöle kazanmıyor mu? Daha da golf oynamak için bir yol olmalı!
Genel Kullanıcı

İpler söz konusu olduğunda değil ...
Dennis,

Bu düzeltilmeli.
Hesap MakinesiFeline

4

CJam, 10 bayt

{el\ele=!}

Bir karakter (bir dize değil!) Ve bir dize alan anonim bir işlev (blok).

Çevrimiçi deneyin.

açıklama

{el\ele=!}

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


4

Python, 34 bayt

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

Karakter için Çekler cdizede olmanın s, bir harf takas kopyasını ekleyerek davayı görmezden siçin s. Olumsuzluk notuzun görünüyor, ancak daha iyi göremiyorum. Bu aynı uzunluktadır:

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

Parenleri ihmal edemezsiniz ya da Python ifadeyi biçimsel üç değer eşitsizliği olarak araya sokar _ in _ < _.

Python 3.5, ayarlanmış dönüşümler üzerinden 33 bayta izin vermelidir, ancak şimdi test edemiyorum.

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

4

Pyke, 7 bayt

Dl3+R{!

Açıklama:

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

3

JavaScript ES6, 41 40 bayt

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

Dizenin tamamını bir argüman olarak alır. İki farklı argümanı kabul ederek baytları kaydedemem, çünkü cevabım diğer ES6 cevabına eriyebilir :(


Bu sefer kazanıyorum, ES6. ;) Anonim işlev sözdiziminiz benim için eşleşmiyor not in.
Morgan Thrapp

@ MorganThrapp Gahh, yine foiled!
Conor O'Brien,

Tamam, bunu anladım , sen @ Morganorganrapp.
Shaun H,

3

R, 26 bayt

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

x dizgedir, y harftir, grepl çağrısındaki T harfin büyük / küçük harf duyarsız olmasını sağlar.


3

Jolf, 6 7 bayt

Yani. Birçok. Altı. SMS? Eh, burada deneyin yine. Değiştir ile \x7f.

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

2

Ruby, 17 bayt

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

Toplu iş, 53 bayt

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

Girişi iki komut satırı argümanı olarak kabul eder. (Gerekirse ikinci argümanı alıntılayın.) İlk argümanın (duyarsız şekilde) ikincisinde bulunması durumunda hiçbir şey olmaz.


2

Mathematica, 33 32 bayt

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

## kullanılabildiğinde seviyorum. Giriş string, ardından char.

Veya büyük / küçük harfe duyarlı bir sürüm: (11 bayt :)

StringFreeQ

Evet, sadece bir yerleşik.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.