無味およびその他のバグ


52

標準のAndroid電卓アプリの一部のバージョンでは、「sin」などのキーを押してから「del」キーを押して「si」にすることができます。おそらく、削除するのが面倒なバグです。

Android計算機のスクリーンショット

次の文字/文字のグループ化が入力可能です:

 

罪
si
s
cos
共同
c
日焼け
た
t
ln
l
ログ
ロ
e

したがって、ta-stelessのために「tasteless」を入力できます。「c-log-s」のために「clogs」も入力可能です。ただし、「got」は入力可能ではなく、「an」または「xyz」でもありません。

単一の単語(または文字のシーケンス、入力ではazのみ)を入力として受け取り、単語が入力可能かどうかを示す出力を生成するプログラムを作成します。

出力は、単一の文字/文字/数字などです。または、より大きくなる場合があります。入力可能な単語はすべて同じ出力を生成する必要があります。入力不可能な単語もすべて同じ出力を生成する必要があります。

PS好奇心だけで、「無味」は辞書に載っている最も長い辞書の単語ですか?


1
明確にするために、単語が入力可能であることを示すために選択した単一の一貫した数字または文字を出力し、単語が入力可能でないことを示すために選択した別の単一で一貫した数字または文字を出力します。あれは正しいですか?
デニス

3
私が見つけた最長の単語は、10文字のcoelostatsです。
コナーオブライエン

1
では、「πe」は言葉ではないのでしょうか?
リスター氏

@Dennis Ya、多かれ少なかれ。
ghosts_in_the_code 16

1
別の11:意気地
クリスH

回答:


20

Perl、47 43 41 + 1 = 42バイト

@Sunny Punのおかげで-4バイト。@Brad Gilbert b2gillsと@Downgoatのおかげで-2バイト

-nフラグを指定して実行します。

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

それは間違いなくさらにゴルフすることができますが、競争の精神で、私は最初に思いついたほとんどオリジナルの正規表現を残しています。trueの1場合、falseの場合、何も返しません。

オンラインでお試しください!

辞書ファイルをダウンロードしましたが、見つかった最長の単語は11文字でした- tattletales


1
:)の世話をするco?ので十分だと思います!sins/log?/
サニーしゃれ

1
それはケース・小文字を区別しない(削除する必要があることを言っていないi)、または単一の結果は、メイク感覚に持っていることを(削除1 !
ブラッド・ギルバートがb2gills

入力はazだけなので、最後にiフラグが必要ですか?
ダウンゴート16

これをより簡単にすることができます:-2:/^(s|sin?|co?|t|tan?|ln?|log?|e)+$/または必要に応じて:/^([celst]|sin?|co|tan?|ln|log?)+$/
チャールズではないチャールズ

1
バウンティをお楽しみください!
ghosts_in_the_code 16

16

JavaScript(ES6)、44バイト

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

私が考えるこれが最短正規表現であるが、もちろん、私は間違っている可能性があります。

説明

明らかな最初の開始点は、すべてのオプションを個別に単純に含む正規表現です。

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

まず、我々はそれを観察することができますcosから形成することができるcos、それが不要になって:

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

sinおよびなどのこれらの一部はsi、最後の文字をオプションにすることで組み合わせることができます。

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

これが機能するのは、最後にの有無にかかわらずsin?一致siするためnsinとの両方をカバーするためですsi

n?sもたくさんあるようです。それらをすべてまとめるとどうなりますか?

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

ゴルフをするもう1つの方法は、残りのシングル文字オプションを1つの文字範囲に結合することですが、これは同じ長さで現れます。

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

そして、それはあなたが単純な正規表現をゴルフする方法です。これは、すべての文字列に正しく一致する可能性のある最短の正規表現ですが、おそらくそうではありません。この正規表現を改善することに成功した人には+100バウンティを授与します。


私は私の答えに使用されることを1ソート似たのである:^(s|t|co?|(l|ta|si)n?|log?|e)+$
ママ楽しいロール

まず、44バイトをカウントします。第二に、代替の、しかしより長い解決策があります/ /.test.bind(/^((si|ta|l)n?|co?|log?|[ste])+$/)
コナーオブライエン

ConorO'Brienおっと@、私はそれを誤カウント方法がわからない...
ETHproductions

a=/^((si|ta|l)n?|co?|log?|[ste])+$/;a.test42バイトでできます。a.test匿名の関数であるため、これは許可されていると思います。
NoOneIsHere

@SeeOneRhinoそれは可能ですf=a.testが、機能しないため実際には許可されません。私はそれが別の名前で呼び出すことを許容できるかどうだろうa.testけれども...
ETHproductions

7

Pyth、37 33 29 28バイト

コードには印刷できない文字が含まれているため、これはxxd16進ダンプです。

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

オンラインでお試しください。

天文学的に非常に非効率的です。時間と空間の複雑さはO(16 n O(24 n)です。

説明

最初に、a Qが暗黙的に追加されます。

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は明確になりました。あなたは必要ありませんs
デニス

6

ゼリー32 31 30 28 26バイト

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

単語が入力可能な場合は0、そうでない場合は1を出力します1バイトのゴルフをしてくれた@JonathanAllanに感謝します!

オンラインでお試しください!

使い方

ŒṖ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バイト

@Synoliのおかげでバグを修正しました。

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

オンラインでお試しください!

true.入力可能な場合またはfalse.そうでない場合に出力します。

説明

連結するすべての文字列がのプレフィックスであるものが見つかるまで、入力の連結解除を試み["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

なぜ.true
Kritixi Lithos

1
@KritixiLithos SWI-Prologでは、クエリがtrueの場合、印刷true.などを行いfalse.ます。私はちょうどこれを再実装:(それはここにあるように)出力が無視され、への書き込みがない場合STDOUT、それが印刷されるtrue.か、false.主な述語が成功したか失敗したかによって異なります。ので、それはSWI-Prologの中にドットを持ってtrue.してfalse.、実際に常に成功/失敗常に有効なプログラムです。
致命的

tanリストに明示的に表示せずに、このソリューションはどのように機能しますか?
Synoli 16

2
@Synoliありません。おかげで、3バイトのコストで修正しました。
16

4

Perl 6の 60の50  44バイト

最初の試行(60

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

Perl 5回答の翻訳(50

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

-nスイッチを使用(43 + 1

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

最初?は結果をブールに変換し、最初は結果を+数値に変換します(1for True0for False


3

Mathematica、101バイト

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

この課題の難しい部分は、最短の正規表現を考え出し、正規表現に一致する最も簡潔な言語を選択しているようです。前者に貢献するものは何もありません。StringMatchQまた、を使用する必要があるので、Mathematicaは後者の候補としては適していませんRegularExpression。私にできることはあなたのPSに答えることです。「無味」とはあなたがタイプできる最長の言葉ですか?

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}

そのため、「タトルテイル」は1人のキャラクターが最も長いようです。


なぜこれが競合しないのですか?定義する関数fは、チャレンジのルールに準拠していませんか?
デニス

いいえ、それは出力TrueまたはFalse単一の文字ではなく。
ngenisis

決定問題でタグ付けされた投稿は、True / Falseの決定に関するものであるため、これは競合していると思います。
FlipTack 16

非競合ステータスは、チャレンジが投稿されたときに存在しなかった、またはバグがあった言語または言語機能を使用する提出物のために予約されています。
デニス

けっこうだ。私は答えを編集して実際の解決策を得ました。
ngenisis

2

ワンダー、41バイト

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

使用法:

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

以前は質問を完全に誤解していましたが、現在はすべて修正されています。F一致の場合と一致Tしない場合の出力。

非競合、35バイト

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

使用法:

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

これは、このチャレンジの後に実装された適切な正規表現を利用します。


2
私の理解では、電卓の最後の文字のみを削除できます。つまりn、入力不可能ではなくsin、そうlnです。
サニーしゃれ

この正規表現は、検出したsa真として
KritixiのLithosに

1
これはテストケースに失敗しますgot
デニス

私はそれが修正されたと信じています。
ママファンロール

?サブ表現おとなしいを作ります。rexegg.com/regex-quantifiers.html#cheat_sheetをご覧ください。しかし、貪欲にし??たり所有したりすることは?+、何らかの理由で機能しません(少なくともPHPでは)。coelostatsトラップをトリガーします(loおよびta)。
タイタス

2

処理中、223バイト

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

最終的に正規表現なしで答えを出すことにしました。関数を呼び出すには、を使用しますl("tasteless");0falseと1trueを返します。

説明付きの拡張コード

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

基本的に、指定された文字列を反復処理して、bcharごとにcharを構築します。私たちが使用してチェックするd()のいずれかの場合にはtanlog、...で始まりますb。存在する場合、有効です。そうでない場合は、その位置のcharが有効かどうかを確認し、resetしbます。無効な場合は0返されるか、そうでない場合でも有効です。最後に、プログラムがまだ何も返していない場合は、を返し1ます。


d関数はaを返すことができませんboolか?
ローマングラフ

@RomanGräf使用するバイト数はのバイト数booleanよりも多くなりますint。また、trueそしてfalseより多くのバイトを必要10
KritixiのLithosを

2

Scala、49バイト

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

指定された文字列が正規表現に一致する場合はtrue、そうでない場合はfalseを返します。


2

Python 3、154バイト

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

オンラインでお試しください!


1
インデントを確認する必要がある場合があります、私はそれを動作させるためにコードを編集する必要がありました
ジョージ

@georgeは、奇妙な、私はIDLEとオンラインコンパイラで試してみました、との両方が動作するようです
ヘンケ

2

Pythonの3149の 130バイト

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)

編集#1:@Henkeソリューションを使用して19バイトを削った


0

Python 2、124バイト

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バイト

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

ETHproductionsから盗まれた正規表現:
コマンドライン引数から入力を受け取ります。入力不可のために、入力可能のために印刷10ます。

古いバージョン、75 73 69バイト

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

考えられるすべての単語を空の文字列で置き換え、結果を返し、否定します。

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

正規表現の一致により入力を分割します。旗は、1の略PREG_SPLIT_NO_EMPTYと告げるpreg_splitだけで、空でない結果を返すこと。入力が入力可能な場合、preg_split空の結果しか得られないため、空の配列が返されますが、これは偽です。!結果を否定します。

どちらのバージョンでは、コマンドライン引数から入力を取る
と、印刷1結果は、(入力が型付け可能である)空の何もないです場合。

注:
正規表現を使用?したパックはここでは機能しません。式を貪欲にレンダリングします。おそらくバックトラッキングによるものです。そして、代替の順序は重要です。ta前に立つt必要がありtます。そうしないと、エンジンはを見つけたときにマッチングを停止します。

私が見つかりました数量詞のチートシートを、と思っ??たり?+かもしれないのヘルプ。しかし、彼らは私のために動作しませんでした。


0

Java 8、55バイト

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

Disclamer:ETHproductionsの正規表現を使用したのは、私のものよりも数バイト短いためです。彼への正規表現の完全な信用。私がしたことは、24バイトを追加してJava関数にしました。

false単語が正規表現に収まらない場合はelseを返しますtrue

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.