Bug hambar dan lainnya

52

Beberapa versi aplikasi kalkulator Android standar memungkinkan Anda untuk menekan tombol, seperti 'sin' dan kemudian tombol 'del' untuk membuatnya 'si'. Mungkin hanya bug yang tidak bisa mereka singkirkan.

Tangkapan layar kalkulator Android

Pengelompokan huruf / huruf berikut ini dapat diketik:

 

dosa
si
s
cos
bersama
c
berjemur
ta
t
dalam
l
catatan
lihat
e

Jadi, 'hambar' dapat diketik, karena ta-steless dan begitu juga 'bakiak' karena 'c-log-s'. Namun 'punya' tidak bisa diketik, juga 'an' atau 'xyz'.

Tulis program yang menggunakan satu kata (atau urutan huruf, hanya input az) sebagai input dan menghasilkan output untuk menunjukkan apakah suatu kata dapat diketik atau tidak.

Output dapat berupa karakter tunggal / huruf / digit / dll. atau mungkin lebih besar. Semua kata yang dapat diketik harus menghasilkan output yang sama. Semua kata yang tidak dapat diketik juga harus menghasilkan output yang sama.

PS Hanya karena penasaran, apakah 'hambar' kata kamus terpanjang yang dapat diketik?

ghosts_in_the_code
sumber
1
Untuk lebih jelasnya: Kami mengeluarkan satu digit, atau angka yang konsisten dari pilihan kami untuk menunjukkan bahwa kata tersebut dapat diketik, dan angka, atau angka yang berbeda, tunggal, dan konsisten dari pilihan kami untuk menunjukkan kata tersebut tidak dapat diketik. Apakah itu benar?
Dennis
3
Kata terpanjang yang bisa saya temukan adalah 10 huruf, coelostats .
Conor O'Brien
1
Jadi, apakah "kita" bukan sebuah kata?
Tn. Lister
@ Dennis Ya, lebih atau kurang.
ghosts_in_the_code
1
11 lainnya: banci
Chris H

Jawaban:

20

Perl, 47 43 41 + 1 = 42 byte

-4 byte terima kasih kepada @Sunny Pun. -2 byte terima kasih kepada @Brad Gilbert b2gills dan @Downgoat

Jalankan dengan -nbendera.

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

Pasti bisa bermain golf lebih lanjut, tetapi dalam semangat kompetisi, saya meninggalkan regex yang kebanyakan orisinal yang saya buat pada awalnya. Tidak menghasilkan apa-apa jika benar, 1jika salah.

Cobalah online!

Saya mengunduh file kamus, dan kata terlama yang saya temukan adalah 11 huruf - tattletales

Gabriel Benamy
sumber
1
Saya pikir co?harus cukup karena sinakan mengurus s:) Bermain bagus dengan /log?/!
Sunny Pun
1
Itu tidak mengatakan bahwa itu harus peka huruf besar-kecil (hapus i), atau bahwa hasil tunggal harus masuk akal (hapus satu !)
Brad Gilbert b2gill
Apakah Anda perlu menandai pada bagian paling akhir karena input hanya az?
Downgoat
Anda dapat membuat ini lebih sederhana: -2: /^(s|sin?|co?|t|tan?|ln?|log?|e)+$/atau jika Anda lebih suka:/^([celst]|sin?|co|tan?|ln|log?)+$/
Bukan karena Charles
1
Nikmati hadiahmu!
ghosts_in_the_code
16

JavaScript (ES6), 44 byte

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

Saya pikir ini adalah regex terpendek yang mungkin, tetapi tentu saja saya mungkin salah.

Penjelasan

Tempat pertama yang jelas untuk memulai adalah regex yang hanya mencakup semua opsi secara terpisah:

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

Pertama, kita dapat mengamati bahwa cosdapat dibentuk dari codan s, membuatnya tidak perlu:

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

Beberapa di antaranya, seperti sindan si, dapat dikombinasikan dengan menjadikan huruf terakhir opsional:

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

Ini berfungsi karena sin?cocok sidengan atau tanpa nakhir, sehingga mencakup keduanya sindan si.

Sepertinya ada banyak n?juga. Bagaimana jika kita menyatukan semuanya?

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

Satu lagi cara untuk bermain golf ini adalah dengan menggabungkan opsi char tunggal yang tersisa ke dalam rentang karakter, tetapi ini keluar pada panjang yang sama:

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

Dan itulah cara Anda golf regex sederhana. Saya percaya ini adalah regex terpendek yang mungkin cocok dengan setiap string dengan benar, tetapi mungkin tidak. Saya akan memberikan hadiah +100 kepada siapa saja yang berhasil meningkatkan regex ini.

Produksi ETH
sumber
Salah satu yang saya gunakan dalam jawaban saya agak mirip:^(s|t|co?|(l|ta|si)n?|log?|e)+$
Mama Fun Roll
Pertama, saya menghitung 44 byte. Kedua, inilah solusi alternatif tapi lagi: / /.test.bind(/^((si|ta|l)n?|co?|log?|[ste])+$/).
Conor O'Brien
@ ConorO'Brien Whoops, tidak tahu bagaimana saya salah
menghitung
Anda dapat melakukannya a=/^((si|ta|l)n?|co?|log?|[ste])+$/;a.testselama 42 byte. Saya percaya ini diizinkan, karena a.testmerupakan fungsi anonim.
NoOneIsHere
@SeeOneRhino Ya, tapi itu tidak diijinkan karena f=a.testtidak berfungsi. Saya bertanya-tanya apakah itu dapat diterima untuk memanggil dengan nama alternatif a.test...
ETHproduksi
7

Pyth, 37 33 29 28 byte

Kode berisi karakter yang tidak patut xxddicetak , jadi ini adalah hexdump.

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

Cobalah online.

Sangat tidak efisien secara astronomi. Kompleksitas waktu dan ruang adalah O (16 n ) O (24 n ).

Penjelasan

Pertama, a Qsecara implisit ditambahkan.

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
PurkkaKoodari
sumber
OP telah mengklarifikasi; Anda tidak membutuhkannya s.
Dennis
6

Jelly , 32 31 30 28 26 byte

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

Menghasilkan 0 jika kata tersebut dapat diketik, 1 jika tidak. Terima kasih kepada @JonathanAllan untuk bermain golf 1 byte!

Cobalah online!

Bagaimana itu bekerja

ŒṖ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).
Dennis
sumber
6

Brachylog , 33 byte

Memperbaiki bug berkat @Synoli.

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

Cobalah online!

Output true.jika dapat diketik atau false.sebaliknya.

Penjelasan

Kami mencoba mendamaikan input sampai kami menemukan satu untuk mana semua string yang kami gabungkan adalah awalan dari salah satu ["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
Fatalisasi
sumber
Kenapa .setelahnya true?
Kritixi Lithos
1
@KritixiLithos Di SWI-Prolog ketika kueri benar itu dicetak true.dan false.sebaliknya. saya baru saja mengimplementasikan ini: jika output diabaikan (seperti di sini) dan tidak ada tulisan untuk STDOUT, maka akan mencetak true.atau false.tergantung pada apakah predikat utama berhasil atau gagal. Ini memiliki titik di SWI-Prolog karena true.dan false.sebenarnya program yang valid yang selalu berhasil / selalu gagal.
Fatalkan
Bagaimana cara kerja solusi ini tanpa tanmuncul secara eksplisit dalam daftar?
Synoli
2
@ Sinoli Tidak. Saya memperbaikinya dengan biaya 3 byte, terima kasih.
Fatalkan
4

Perl 6 ,  60 50  44 byte

upaya pertama ( 60 )

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

terjemahan dari jawaban Perl 5 ( 50 )

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

menggunakan -nsakelar ( 43 +1 )

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

Yang pertama ?mengonversi hasilnya menjadi Boolean, dan yang pertama +mengonversi itu menjadi angka ( 1untuk True, 0untuk False)

Brad Gilbert b2gills
sumber
3

Mathematica, 101 byte

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

Tampaknya bagian-bagian sulit dari tantangan ini datang dengan regex terpendek dan memilih bahasa yang paling ringkas untuk dicocokkan dengan regex. Saya tidak punya apa-apa untuk disumbangkan ke yang pertama, dan Mathematica bukan kandidat yang baik untuk yang terakhir karena Anda harus menggunakan StringMatchQdan RegularExpression. Yang bisa saya lakukan adalah menjawab PS Anda: apakah "hambar" adalah kata terpanjang yang bisa Anda ketikkan?

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}

Jadi "tattletale" tampaknya menjadi yang terpanjang oleh satu karakter.

ngenisis
sumber
Mengapa ini tidak bersaing? Apakah fungsi f Anda mendefinisikan tidak mematuhi aturan tantangan?
Dennis
Tidak, ini menghasilkan Trueatau Falselebih dari satu karakter.
ngenisis
Posting yang ditandai dengan masalah-keputusan adalah tentang menentukan Benar / Salah, jadi saya pikir ini bersaing.
FlipTack
Status yang tidak bersaing diperuntukkan bagi kiriman yang menggunakan fitur bahasa atau bahasa yang tidak ada atau memiliki bug saat tantangan dipasang.
Dennis
Cukup adil. Saya mengedit jawaban saya untuk mendapatkan solusi yang sebenarnya.
ngenisis
2

Bertanya-tanya , 41 byte

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

Pemakaian:

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

Benar-benar salah paham pertanyaan sebelumnya, tapi sekarang semuanya sudah diperbaiki. Output Funtuk pertandingan dan Ttanpa pertandingan.

Tidak bersaing, 35 byte

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

Pemakaian:

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

Ini memanfaatkan regex yang berlaku, yang diimplementasikan setelah tantangan ini.

Mama Fun Roll
sumber
2
Dari pemahaman saya, Anda hanya dapat menghapus karakter terakhir dalam kalkulator, yang berarti ntidak dapat diketik tetapi sindan lnsedang.
Sunny Pun
Regex ini terdeteksi sasebagai benar
Kritixi Lithos
1
Ini gagal dalam ujian got.
Dennis
Saya yakin itu sudah diperbaiki.
Mama Fun Roll
The ?membuat sub ekspresi jinak; lihat rexegg.com/regex-quantifiers.html#cheat_sheet . Tetapi bahkan membuatnya serakah dengan ??atau posesif dengan ?+tidak bekerja karena suatu alasan (setidaknya dalam PHP). coelostatsmemicu jebakan (pada lodan ta).
Titus
2

Memproses, 223 byte

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

Akhirnya memutuskan untuk melakukan jawaban tanpa regex. Untuk memanggil fungsi, gunakan l("tasteless");. Pengembalian 0untuk false dan 1true.

Kode diperluas dengan penjelasan

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

Pada dasarnya, kita beralih pada string yang diberikan, membangun bchar dengan char. Kami memeriksa menggunakan d()jika salah satu tan, log... mulai dengan b. Jika ya, maka itu valid. Selain itu, kami memeriksa apakah karakter pada posisi itu valid dan kami menyetel ulang b. Sekarang jika itu tidak valid, 0akan dikembalikan, atau yang lain itu masih akan valid. Pada akhirnya, jika program belum mengembalikan sesuatu, maka kembali 1.

Kritixi Lithos
sumber
Tidak bisakah dfungsi mengembalikan a bool?
Roman Gräf
@ RomanGräf Lebih banyak byte yang digunakan booleandaripada int. Juga truedan falsemembutuhkan lebih banyak byte daripada 1dan0
Kritixi Lithos
2

Scala, 49 byte

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

Mengembalikan nilai true jika string yang diberikan cocok dengan regex, false jika tidak.

corvus_192
sumber
2

Python 3 , 154 byte

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=='')

Cobalah online!

Henke
sumber
1
Anda mungkin perlu memeriksa indentasi, saya harus mengedit kode untuk membuatnya bekerja
george
@george, aneh, saya mencoba di IDLE dan kompiler online, dan keduanya sepertinya berfungsi
Henke
2

Python 3 , 149 130 byte

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)

sunting # 1: dicukur 19 byte menggunakan solusi @ Henke

Dillanm
sumber
0

Python 2, 124 byte

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
TFeld
sumber
0

PHP, 60 byte

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

regex dicuri dari produk ETH :
mengambil input dari argumen baris perintah; cetakan 1untuk diketik, 0untuk tidak diketik.

versi yang lebih lama, 75 73 69 byte

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

mengganti semua kata yang mungkin dengan string kosong, mengembalikan hasilnya, meniadakan.

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

membagi input dengan pencocokan regex. Bendera 1adalah singkatan PREG_SPLIT_NO_EMPTYdan memberi tahu preg_splituntuk hanya mengembalikan hasil yang tidak kosong. Jika input dapat diketik, preg_splithanya akan memiliki hasil kosong, sehingga akan mengembalikan array kosong, yang salah. !meniadakan hasilnya.

Kedua versi mengambil input dari argumen baris perintah
dan mencetak 1jika hasilnya kosong (input dapat diketik), selain itu tidak ada.

Catatan:
Mengemas regex menggunakan ?tidak berfungsi di sini; itu membuat ekspresi tanpa ekspresi; mungkin karena mundur. Dan urutan alternatif itu penting: taharus berdiri di depan tatau mesin akan berhenti cocok ketika ditemukan t.

Saya menemukan lembar cheat quantifier , pemikiran ??atau ?+mungkin membantu; tetapi mereka tidak bekerja untuk saya.

Titus
sumber
0

Java 8, 55 byte

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

Disclamer: Saya menggunakan regex ETHproductions karena jauh lebih pendek dari byte saya. Kredit penuh pada Regex kepadanya. Apa yang saya lakukan adalah menambahkan 24 byte untuk menjadikannya fungsi Java.

Kembali falsejika kata itu tidak cocok dengan Regex, yang lain true.

RudolfJelin
sumber