Tatsız ve diğer hatalar


52

Standart Android hesap makinesi uygulamasının bazı sürümleri, 'sin' ve 'si' yapmak için 'sin' gibi bir tuşa basmanıza izin verir. Muhtemelen çıkarmadan rahatsız olamayacakları bir böcek.

Android hesap makinesinin ekran görüntüsü

Aşağıdaki harfler / harf gruplamaları yazılabilir:

 

günah
si
s
marul
ko
c
taba rengi
ta
t
ln
l
kütük
bak
e

Bu yüzden, 'tatsız' yazılabilirdir, çünkü tatsızdır ve 'clogs'tur çünkü' c-log-s '. Ancak 'got' yazılabilir değildir, 'an' veya 'xyz' değildir.

Girdi olarak tek bir kelime (veya sadece harf girişi, sadece harf girişi) alan ve bir kelimenin yazılabilir olup olmadığını belirtmek için çıktı üreten bir program yazın.

Çıktı, tek bir karakter / harf / rakam / etc olabilir. veya daha büyük olabilir. Tüm yazılabilir kelimeler aynı çıktıyı üretmelidir. Yazılabilir olmayan sözcüklerin tümü aynı çıktıyı üretmelidir.

Ps meraktan sadece, 'tatsız' yazılabilir en uzun sözlük kelime mi?


1
Daha açık olmak gerekirse: Kelimenin yazılabilir olduğunu belirtmek için tercih ettiğimiz tek, tutarlı bir rakam veya tek bir harf veya kelimenin yazılabilir olmadığını belirtmek için seçtiğimiz farklı, tek, tutarlı bir rakam veya harf çıkar. Bu doğru mu?
Dennis,

3
Bulabildiğim en uzun kelime 10 harf, coelostats .
Conor O'Brien,

1
Yani "πe" bir kelime değil mi?
Bay Lister,

@Dennis Ya, az ya da çok.
ghosts_in_the_code

1
Başka 11: sissinesses
Chris H

Yanıtlar:


20

Perl, 47 43 41 + 1 = 42 bayt

@Sunny Pun sayesinde -4 bayt. @Brad Gilbert b2gills ve @Downgoat sayesinde -2 bayt

-nBayrakla koş .

say!/^(s(in?)?|co?|t(an?)?|ln?|log?|e)+$/

Kesinlikle daha ileride golf oynayabilir, ancak rekabet ruhu içerisinde, başlangıçta ortaya çıktığım en orijinal regex'ten ayrılıyorum. True 1olursa, false olursa hiçbir şey döndürmez.

Çevrimiçi deneyin!

Bir sözlük dosyası indirdim ve bulduğum en uzun kelime 11 harften - tattletales


1
Bence co?yeterli sinolacağından beri yeterli olacak s:) Güzel oynama /log?/!
Güneşli Pun

1
Büyük / küçük harf duyarsız olması (kaldırılması i) veya tek sonucun mantıklı olması gerektiği (bir tanesini kaldırması !)
gerektiğini söylemez

Girdi yalnızca az olduğu için en sonunda bayrak yazmam gerekiyor mu?
Downgoat

Bunu daha basit yapabilirsiniz: -2: /^(s|sin?|co?|t|tan?|ln?|log?|e)+$/ya da eğer istersen:/^([celst]|sin?|co|tan?|ln|log?)+$/
Charles

1
Ödülünün tadını çıkar!
ghosts_in_the_code

16

JavaScript (ES6), 44 bayt

s=>/^((si|ta|l)n?|co?|log?|[ste])+$/.test(s)

Bunun mümkün olan en kısa regex olduğunu düşünüyorum , ama elbette yanılıyor olabilirim.

açıklama

Başlamak için açık bir ilk yer, tüm seçenekleri ayrı ayrı içeren bir regex olacaktır:

s=>/^(sin|si|s|cos|co|c|tan|ta|t|log|lo|l|ln|e)+$/.test(s)

İlk olarak, o gözlemleyebilirsiniz cosoluşturulabilir cove sgereksiz kılarak:

s=>/^(sin|si|s|co|c|tan|ta|t|log|lo|l|ln|e)+$/.test(s)

Bunlardan bazıları, örneğin sinve sison mektup isteğe bağlı hale getirerek birleştirilebilir:

s=>/^(sin?|s|co?|tan?|t|log?|ln?|e)+$/.test(s)

Bunun nedeni çalışır sin?maçları siile veya olmadan n, böylece hem kapsayan ucunda sinve si.

Bir sürü de var gibi gözüküyor n?. Ya hepsini bir araya getirirsek?

s=>/^((si|ta|l)n?|s|co?|t|log?|e)+$/.test(s)

Bunu yapmanın bir başka yolu da, kalan tek kişilik karakter seçeneklerini bir karakter aralığında bir araya getirmektir, ancak bu aynı uzunlukta gerçekleşir:

s=>/^((si|ta|l)n?|co?|log?|[ste])+$/.test(s)

Ve işte böyle basit bir regex golf. Her dize ile doğru eşleşen, belki de değil, mümkün olan en kısa regex olduğuna inanıyorum. Bir ödüllendireceğiz 100 ödül bu regex geliştirmek için yönetir herkese.


^(s|t|co?|(l|ta|si)n?|log?|e)+$
Mama Fun Roll

İlk önce 44 bayt sayıyorum. İkincisi, burada alternatif bir ama artık çözüm: / /.test.bind(/^((si|ta|l)n?|co?|log?|[ste])+$/).
Conor O'Brien,

@ ConorO'Brien Whoops, nasıl yanlış
saydım

a=/^((si|ta|l)n?|co?|log?|[ste])+$/;a.test42 bayt için yapabilirsiniz . Buna izin verildiğine inanıyorum, çünkü a.testadsız bir işlev.
HayırOneIs:

@SeeOneRhino Öyle, ama f=a.testişe yaramadığı için gerçekten izin verilemez. Acaba alternatif ismiyle çağırmanın kabul edilebilir olup olmadığını merak ediyorum a.test...
ETHproductions

7

Pyth, 37 33 29 28 bayt

Kod yazdırılamaz bir karakter içeriyor, bu yüzden burada bir xxdhexdump.

00000000: 737d 5173 4d5e 733c 5252 6336 2e22 6174  s}QsM^s<RRc6."at
00000010: 14d0 69ba 76f1 ac59 6422 346c            ..i.v..Yd"4l

Çevrimiçi deneyin.

Son derece Astronomik olarak verimsiz. Zaman ve mekan karmaşıklığı, O (16 n ) O (24 n ) 'dir.

açıklama

Birincisi, Qdolaylı olarak eklenir.

s}QsM^s<RRc6."…"4lQ     Implicit: Q = input
            ."…"        Generate "logsincostanlnee"
          c6            Split in 6 parts: ["log", "sin", "cos", "tan", "ln", "ee"]
         R      4       For each n from 0 to 3
       <R               Take the first n chars from each string
      s                 Flatten the results
                 lQ     Get length of input
     ^                  Take that Cartesian power of the list
   sM                   Join each resulting list
 }Q                     Check if the input is found
s                       Cast to integer

OP netleştirildi; ihtiyacın yok s.
Dennis,

6

Jelly , 32 31 30 28 26 bayt

ŒṖw@€€“¡Ṡ[ẈKœịḲ-¢ȧ?-»’%3ḌẠ

Çıkışlar 0 kelime, tipleme ise 1 değilse. 1 byte'lık golf için @JonathanAllan'a teşekkürler!

Çevrimiçi deneyin!

Nasıl çalışır

ŒṖw@€€“¡Ṡ[ẈKœịḲ-¢ȧ?-»’%3ḌẠ  Main link. Argument: s (string of lowercase letters)

ŒṖ                          Yield all partitions of s.
      “¡Ṡ[ẈKœịḲ-¢ȧ?-»       Yield "sine  logcostanln". Every third character
                            marks the start of a typeable word.
  w@€€                      Find the indices of all substrings in the partitions
                            in the string to the right (1-based, 0 if not found).
                     ’      Decrement. "Good" indices are now multiples of 3.
                      %3    Modulo 3. "Good" indices are mapped to 0, "bad"
                            indices are mapped to 1 or 2.
                        Ḍ   Convert from decimal to integer. A partition will
                            yield 0 iff all indices are "good".
                         Ạ  All; yield 0 if one or more integers are falsy (0), 1
                            if all integers are truthy (non-zero).

6

Brachylog , 33 bayt

@Synoli sayesinde bir hata düzeltildi.

~c:1a
,"sincostanloglneeee"@6e@[?

Çevrimiçi deneyin!

true.Tipik veya false.başka şekilde ise çıktılar .

açıklama

Birleştirdiğimiz tüm dizelerin birinin öneki olduğu birini bulana kadar girişin dekonksiyonlarını denedik ["sin", "cos", "tan", "log", "lne", "eee].

~c                          A list of strings which when concatenated results in the Input
  :1a                       All strings of this list satisfy the predicate below:

,"sincostanloglneeee"@5           The list ["sin", "cos", "tan", "log", "lne", "eee"]
                       e          Take one element of that list
                        @[?       The input is a prefix of that element

Neden .sonra true?
Kritixi Lithos

1
@KritixiLithos Bir sorgu doğru olduğunda SWI-Prolog'da basar true.ve false.başka türlü. Ben sadece bunu yeniden uygulamaya koydum: çıktı (burada olduğu gibi) dikkate alınmazsa ve yazılacak bir yazı yoksa, STDOUTyazdıracak true.veya false.ana yüklemin başarılı veya başarısız olmasına bağlı olarak yazacaktır. Çünkü SWI-Prolog içinde bir nokta vardır true.ve false.her zaman başarılı aslında geçerli programlardır / hep başarısız olur.
16'da 18

Bu çözüm tanlistede açıkça görünmeden nasıl çalışır ?
Synoli,

2
@ Synoli O değil. 3 byte pahasına düzelttim, teşekkürler.
16'da

4

Perl 6 ,  60 50  44 bayt

ilk girişimi ( 60 )

put +?(get~~/^<{<sin cos tan ln log e>».&{|m:ex/^.+/}}>*$/)

Perl 5 cevabının çevirisi ( 50 )

put +?(get~~/^[s[in?]?|co?|t[an?]?|ln?|log?|e]*$/)

-nanahtar kullanarak ( 43 + 1 )

put +?/^[s[in?]?|co?|t[an?]?|ln?|log?|e]*$/

Birincisi ?, sonucu Boolean'a, ilkini +ise bir sayıya dönüştürür ( 1for True, 0for False)


3

Mathematica, 101 bayt

If[StringMatchQ[#,("sin"|"si"|"s"|"cos"|"co"|"c"|"tan"|"ta"|"t"|"ln"|"l"|"log"|"lo"|"e")..],"T","F"]&

Bu zorluğun zor kısımlarının en kısa regex ile geldiği ve regex ile eşleşecek en özlü dili seçtiği anlaşılıyor. Ben eski katkıda şey yok ve kullanmak zorunda beri Mathematica ikincisi için iyi bir aday değildir StringMatchQve RegularExpression. Yapabileceğim şey PS'inize cevap vermek: "tatsız" yazabileceğiniz en uzun sözcük mü?

In[1]:= f=StringMatchQ[#,("sin"|"si"|"s"|"cos"|"co"|"c"|"tan"|"ta"|"t"|"ln"|"l"|"log"|"lo"|"e")..]&;

In[2]:= Select[EntityList@"Word",f@#[[2,1]]&][[All,2,1]]//SortBy[StringLength]//DeleteDuplicates
Out[2]= {c,e,l,s,t,cc,cl,el,et,lo,si,sl,ta,te,ccc,col,cos,cot,eel,ell,eta,etc,lee,let,log,lot,sec,see,set,sic,sin,sit,tae,tan,tat,tec,tee,cell,clog,clot,coco,cole,colt,coss,cost,cote,else,less,loco,loge,loll,lose,loss,lota,sect,seel,sell,sess,seta,sett,sill,silo,silt,sine,sise,siss,site,sloe,slog,slot,stet,taco,tact,tael,talc,tale,tall,tect,tell,test,cello,close,cosec,costa,cotan,eccle,elect,elsin,ettle,loess,lotte,secle,setee,since,sleet,stale,stall,state,steel,stele,tasse,taste,tatee,teest,telco,testa,tetel,tsine,cellco,closet,coleta,collet,coltan,cosine,cosset,costal,ecesis,estate,lessee,scelet,select,sellee,sestet,settee,settle,siesta,silole,stacte,stance,stasis,tallet,tallot,taslet,tassel,tasset,tattle,tectal,teetan,tellee,testee,tsetse,celesta,cessile,cocotte,collect,costate,ecolect,ectasis,electee,sessile,sinless,sitelet,statant,tassell,tastant,testate,coestate,colessee,colocolo,cosiness,costless,electant,lossless,sceletal,siletane,statelet,tactless,tallness,telltale,telocoel,coelostat,sissiness,stateless,tasteless,tattletale}

Bu yüzden "tattletale" bir karakter tarafından en uzun gibi görünüyor.


Bu neden rekabet etmiyor? Tanımladığınız f işlevi , meydan okuma kurallarına uymuyor mu?
Dennis,

Hayır, bu çıkışı Trueveya Falsetek karakter yerine.
ngenis,

Karar sorunu ile etiketlenen gönderiler Doğru / Yanlış'ı belirlemekle ilgilidir, bu yüzden bunun rekabet ettiğini düşünüyorum.
FlipTack

Rekabet etmeme durumu, itiraz edildiğinde mevcut olmayan veya hata içeren bir dil veya dil özelliği kullanan gönderiler için ayrılmıştır.
Dennis,

Yeterince adil. Gerçek bir çözüme ulaşmak için cevabımı düzenledim.
ngenis,

2

Wonder , 41 bayt

!.(mstr"^(s|t|co?|(l|ta|si)n?|log?|e)+$")

Kullanımı:

(!.(mstr"^(s|t|co?|(l|ta|si)n?|log?|e)+$")) "tasteless"

Daha önce soruyu tamamen yanlış anlıyordum, ama şimdi her şey düzeldi. Eşleşme Fve eşleşme Tiçin çıktılar .

Rekabet etmeyen, 35 bayt

!.`^(s|t|co?|(l|ta|si)n?|log?|e)+$`

Kullanımı:

(!.`^(s|t|co?|(l|ta|si)n?|log?|e)+$`) "tasteless"

Bu, bu zorluğun ardından uygulanan uygulanabilir regex'leri kullanır.


2
Anladığım kadarıyla, hesap makinesinde yalnızca son karakteri silebilirsiniz, bu da yazılabilir ndeğil sinve anlamına gelir ln.
Güneşli Pun

Bu regex sadoğru olarak algılar
Kritixi Lithos 4:16

1
Bu test davası başarısız olur got.
Dennis,

Sabit olduğuna inanıyorum.
Mama Fun Roll

?Alt ifadesi uysal yapmak; rexegg.com/regex-quantifiers.html#cheat_sheet bakın . Fakat onu açgözlü ??ya da ?+iyelikle yapmak bile bir nedenden dolayı işe yaramaz (en azından PHP'de). coelostatstuzağı tetikler (at love ta).
Titus,

2

İşlem, 223 bayt

int d(String b){for(String p:"tan0log0sin0cos0ln0e".split("0"))if(p.startsWith(b))return 1;return 0;}

int l(String p){String b="";int t=1;for(char c:p.toCharArray()){b+=c;if(d(b)<1){b=c+"";t=d(b);}if(t<1)return t;}return t;}

Sonunda regex olmadan bir cevap yapmaya karar verdi. Fonksiyonu aramak için kullanın l("tasteless");. 0False ve 1true için döndürür .

Açıklamalı genişletilmiş kod

int d(String b){
  for(String p:"tan0log0sin0cos0ln0e".split("0"))
    if(p.startsWith(b))
      return 1;
  return 0;
}
//main function
int l(String p){
  String b="";
  int t=1;
  for(char c:p.toCharArray()){
    b+=c;
    if(d(b)<1){
      b=c+"";
      t=d(b);
    }
    if(t<1)return t;
  }
  return t;
}

Temel olarak, verilen karakter dizisi üzerinde byineliyoruz, char char char. Biz kullanarak kontrol d()herhangi eğer tan, log... ile başlayan b. Eğer öyleyse, o zaman geçerlidir. Aksi halde, bu pozisyondaki karakterin geçerli olup olmadığını kontrol ederiz ve sıfırlarız b. Şimdi geçersizse 0iade edilir veya başka bir şekilde geçerli olur. Sonunda, program zaten bir şey döndürmediyse geri dönün 1.


Can not dişlevi, bir dönüş bool?
Roman Gräf

@ RomanGräf kullanmak daha bayt booleandaha int. Ayrıca trueve falsedaha fazla bayt gerektirir 1ve0
Kritixi Lithos

2

Scala, 49 bayt

s=>s.matches("(s(in?)?|co?|t(an?)?|ln?|log?|e)+")

Verilen dize regex ile eşleşirse true, aksi takdirde false değerini döndürür.


2

Python 3 , 154 bayt

r=1;i=input()
while r:
 r=0
 for s in'sin,cos,tan,log,ln,co,lo,si,ta,s,c,t,l,e'.split(','):
  if i.startswith(s):r=i=i.replace(s,'',1);break
print(i=='')

Çevrimiçi deneyin!


1
Girintiyi denetlemeniz gerekebilir, çalışabilmesi için kodu düzenlemek zorunda kaldım
george

@george, garip, IDLE'de ve çevrimiçi derleyicide denedim ve her ikisi de çalışıyor gibi görünüyor
Henke

2

Python 3 , 149 130 bayt

i=input()
for a in 'tan,sin,cos,log,si,co,ta,lo,lo,ln,s,c,t,l,e'.split(','):
    if a in i:
        i=i.replace(a,"")
print(not i)

düzenleme # 1: shaved 19 bytes @Henke çözümünü kullanarak


0

Python 2,121 bayt

f=lambda w:any(f(w[len(s):])if w[:len(s)]==s else 0for s in'sin,cos,tan,log,ln,co,lo,si,ta,s,c,t,l,e'.split(','))if w else 1

0

PHP, 60 bayt

<?=preg_match("#^((si|ta|l)n?|co?|log?|s|e|t)+$#",$argv[1]);

ETHproductions'tan çalınan regex :
komut satırı argümanından girdi alır; baskılar 1Tiplendirilemeyen için, 0tipleme değil.

eski sürümler, 75 73 69 bayt

<?=!preg_replace("#co|log|ln|lo|sin|si|tan|ta|[celst]#","",$argv[1]);

olası tüm kelimeleri boş dizeyle değiştirir, sonucu döndürür, olumsuzlar.

<?=!preg_split("#co|log|ln|lo|sin|si|tan|ta|[celst]#",$argv[1],-1,1);

Regex eşleşmeleri ile girişi böler. Bayrak 1anlamına gelir PREG_SPLIT_NO_EMPTYve preg_splityalnızca boş olmayan sonuçları döndürmesini söyler . Girdi yazılabilir ise preg_split, yalnızca boş sonuçlara sahip olur, bu nedenle sahte olan boş bir dizi döndürür. !sonucu olumsuzlar.

Her iki sürüm de komut satırı argümanından girdi alır
ve 1sonuç boşsa yazdırılır (giriş yazdırılabilir ), başka bir şey yoktur.

Notlar:
kullanarak regex paketleme ?burada çalışmıyor; ifadeleri geçersiz kılar; muhtemelen geri izleme nedeniyle. Alternatiflerin sırası önemlidir: taönce durmak zorunda kalırsa tmotor bulduğu zaman eşleşmeyi durduracaktır t.

Bir niceleyici kopya kağıdı buldum , düşündüm ??ya ?+da yardım edebilirim; ama onlar benim için işe yaramadı.


0

Java 8, 55 bayt

s->return s.matches("^((si|ta|l)n?|co?|log?|[ste])+$");

Feragatname : ETHproductions'un regex'ini kullandım çünkü benimkinden daha kısa bayttı . Regex'in ona verdiği tam kredi. Yaptığım şey onu Java işlevi yapmak için 24 bayt eklemek oldu.

İade falsekelimesi başka, Regex içine uymasaydı true.

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.