チェックボックスはオフではありませんか?


65

コードレビューを行うと、チェックボックスのステータスをテストする次のコードに出くわしました。

if (!isNotUnchecked()) { ... }

コードが期待している実際のチェックボックスの状態を調べるために、30分間ブレインストーミングをしなければなりませんでした。これらの愚かな表現を簡素化できるプログラムを書いてください!


プログラムは、単純化する式を表す文字列を入力として受け入れる必要があります(例:)!isNotUnchecked()。プログラムは、論理的に同等の単純化された式、isChecked()またはを出力する必要があります!isChecked()

入力式のメソッド名は常にis0 から始まり、0..nを含みNotChecked()またはで終わりUnchecked()ます。メソッドには、任意の数の接頭辞を付けることができます!

isChecked() => isChecked()
isUnchecked() => !isChecked()
isNotChecked() => !isChecked()
!isNotChecked() => isChecked()
!!!isNotNotUnchecked() => isChecked()

テキストでは常に大文字と小文字が区別されますか?入力はありnotunischeckedますか?
-stevefestl

1
@SteveFestいいえ、入力は常に上記の形式であると想定できます。isnotuncheckedたとえば、処理する必要はありません。
アルノー

6
そのような関数名では、命名と一致するチェックされた条件を実際にテストしなかったという10対1のオッズを与えます。
カレブ

2
言い換えれば、未チェックのボックスとは何か、未チェックのボックスとは何かを知っています(「checked」と「unchecked」が2つの可能な状態である場合にのみチェックされます。それ以外の場合は、チェックボックス:int、sign ...)、この特定のチェックボックスでは、チェックマークが付いているかどうかに関係なく、「チェック」されていません。trueの場合、チェックボックスは何も「チェック」されていません。falseの場合、チェックボックスは未チェックのボックスですが、可能な状態が2つしかない(チェックされている)場合を除き、必ずしもチェックされるというわけではありません。
Jドー

1
@J Doeは説明をありがとう!
アルノー

回答:


31

Python、51バイト

lambda s:sum(map(s.count,'!NU'))%2*'!'+'isC'+s[-8:]

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


あなたは純粋な天才です!考えたことがないだろうs[-8:]
氏Xcoder

確か'isC'+s[-8:]に、バイトは'isChecked'
ニール

9
しかし「)(にisChecked」より短い1バイト
アンドリュー・スミス

誰かが何をするのか説明できますかs[-8:]
ESR

1
@EdmundReed入力の最後の8文字を使用します。これは常にhecked()です。
xnor

24

網膜、23バイト

Unc
!C
Not
!
O`is|!
!!

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

説明

Unc
!C

ターンUnchecked!Checked

Not
!

すべてNotのをに変え!ます。今のようになり!!!is!!!!Checked()ます。

O`is|!

isまたはのすべての一致をソートします!。以来! < is、これはすべて!文字列の先頭に移動するため、上記の例はになり!!!!!!!isChecked()ます。

!!

!繰り返しの否定をキャンセルするには、ペアを削除します。



13

Python、43バイト

lambda s:sum(map(ord,s))%2*'!'+'isC'+s[-8:]

文字列sを受け取り、文字列を返す名前のない関数。

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

とき、文字の存在をチェックする必要はありませんが!Notと、Un正確に一つの奇数序を持っている(とすべてcC両方の奇数です)、これだけ序を総括し、私たちが望むかどうかを判断するための値モジュロ2を使用し!たりしませ。

それ以外は、フォームはxnorの回答と同じですが、私はそれ以上良いものを見つけられませんでした。以下も43です。

lambda s:'!isC'[~sum(map(ord,s))%2:]+s[-8:]

10

JavaScript(ES6)、51 50バイト

f=
s=>(s.split(/!|n/i).length%2?'':'!')+'isChecked()'
<input oninput=o.textContent=f(this.value)><pre id=o>

チェックされた状態を反転させる、、および文字を探すこと!で機能します。デフォルトでは奇数の配列の長さを返すため、長さが偶数の場合に追加します。編集:@ETHproductionsのおかげで1バイト保存されました。50バイト用の代替バージョン:Nnsplit!split

s=>`${s.split(/!|n/i).length%2?``:`!`}isChecked()`

ええと、今私は戻って他の答えを見て、彼らはすべてこれをやっています。
ニール

RegExからグローバルフラグをドロップして、バイトを保存できるはずです。
シャギー

@Shaggy実際、私の長さは正しいgです。最新の編集で削除に失敗しました。
ニール

1
/!|N/i
ETHproductions

@ETHproductions私はあなた/!|N/i修飾子なしで意味したと思う
-SplittyDev


7

ジャワ7、100の 77バイト

String c(String s){return(s.split("[!NU]").length%2<1?"!":"")+"isChecked()";}

説明:

String c(String s){  // Method with String parameter and String return-type
  return(s.split("[!NU]").length
                     //  Count the amount of '!', 'N' and 'U' in the input String (+ 1)
    %2<1?            //  and if they are an even number:
     "!"             //   Start with an examination mark
    :                //  Else:
     "")             //   Start with nothing
    +"isChecked()";  //  And append "isChecked()" to that
}                    // End of method

テストコード:

ここで試してみてください。

class M{
  static String c(String s){return(s.split("[!NU]").length%2<1?"!":"")+"isChecked()";}

  public static void main(String[] a){
    System.out.println(c("isChecked()"));
    System.out.println(c("isUnchecked()"));
    System.out.println(c("isNotChecked()"));
    System.out.println(c("!isNotChecked()"));
    System.out.println(c("!!!isNotNotUnchecked()"));
  }
}

出力:

isChecked()
!isChecked()
!isChecked()
isChecked()
isChecked()

7

Aceto、49バイト

&M"pp"
L!)(de
&c;`Che"
`!d!sick
!',@p"!'
'N'U`!Lu

yadda yaddaヒルベルト曲線。

まず、スタック上の3つの重要なキャラクターをプッシュします。

!'
'N'U

次に、キャッチマークを設定し、1文字を読み取ることから始めます。それをd複製して否定し、その結果が真である場合(したがって、文字列が空の場合、入力が終了した場合)、最後にジャンプします。

;`
d!
,@

入力文字の残りのコピーで、それがスタックの残りに含まれているかどうかを確認します(つまり、!、N、Uのいずれか)。そうでない場合は、エラーを発生させ、キャッチマークに戻って別の文字を読み取ります。

&c
`!

それ以外の場合は、クイックストレージ(基本的に最初は空の文字列であるレジスタ;偽)にあるものをロードし、それを無効にしてクイックストレージに送り返し、エラーを発生させます(文字の読み取りに戻ります)。

&M
L!

入力が停止すると、最後まで送信されます。そこで、方向を逆にして感嘆符を押し、クイックストレージをロードして無効にします。それが真実である場合(つまり、否定の数が奇数である場合)、プッシュした感嘆符を出力します。

p !'
`!Lu

最後に、文字列を2つの部分にプッシュして印刷します(スペースを節約するため)。

"pp"
)(de
  Che"
  sick
   "

その後、プログラムは元の始まりに戻りますが、コマンドが何も出力したり、ループ動作をしたりすることはないので、それは問題ではありません。実際、最初に到達した非noppingコマンドは例外を発生させ、キャッチマークにジャンプするためコードの大部分をスキップします。つまり、その部分でAcetoが見るすべてのことを意味します。

&



!' @
'N'U

以来U、今の単一引用符文字が付け加えていないため、リテラル文字として見られていない、それがコマンドとして解釈されます:Uスタック上のすべての要素を逆に(今それはだ!NU、上から)、そして'Nそして'!もっとプッシュします文字、つまりスタックで終わることを意味します[U, N, !, N, !]

サイドノート:これは、Acetoの新しいエディターの助けを借りて(部分的に)書かれた最初のAcetoプログラムです。


6

C、78 70 68バイト

クリストフありがとう!

c;f(char*s){for(c=1;*s;)c^=!!strchr("!NU",*s++);s="!isChecked()"+c;}

オンラインで試す

出力:

isChecked() => isChecked()
isUnchecked() => !isChecked()
isNotChecked() => !isChecked()
!isNotChecked() => isChecked()
!!!isNotNotUnchecked() => isChecked()

1
c;f(char*s){for(c=1;*s;)c^=!!strchr("!NU",*s++);s="!isChecked()"+c;}xorを使用してフリップすると、c2バイト節約されます。
クリストフ

6

Perl 5、31バイト

@Dom Hastingsのおかげで-2バイト。

30バイトのコード+ -pフラグ。

/c/i;$_="!"x(y/UN!//%2).isC.$'

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

y/UN!//出現回数をカウントしUnNot、と!。その結果!、2を法とする多くのモジュロが続きisChecked()ます。


正規表現に基づく38バイトの別の試み(Dom Hastingsは1バイトを節約しました):

s/isNot|isUn(c)/!is\u$1/?redo:s/!!//g

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


2つのがあるので、あなたの正規表現のバージョンは動作しませんcsがでUnchecked
ニール

1
@Neilは正規表現のみを置き換えます(/gフラグを使用していないため)。テストケースは私にとって見栄えが良い(TryItOnlineリンクを参照)。だから私はあなたが何を意味するのか本当にわかりません
ダダ

申し訳ありませんが、正規表現のバージョンが機能しない正しい理由は、cin Uncheckedがありますが、in もあるCheckedため、それを置換すると、になりますCheCked
ニール

1
ねえ、あなたが大丈夫だと思います!私はしばらくここにいなかったが、私はのためにこれらと少しの遊びを持っていた第二に最初に-2と-1
ドムヘイスティングス

1
@DomHastingsやあ!素晴らしい、ありがとう!よろしくお願いします:
ダダ





3

Japt24 23バイト

o"!N" l u)ç'! +`‰C”×B()

説明

 o"!N" l u)ç'! +`‰C”×B()
Uo"!N" l u)ç'! +`‰C”×B()`
Uo"!N"                     # Only keep "!", "n" and "N" from the input
           ç'!             # Repeat the string "!" by
       l u)                # the parity of the length of the newly formed string
               +`‰C”×B()` # and concatenate with the string "isChecked()"

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


1
待って...どうして...なぜ... o大文字と小文字を区別しないのですか?私はそれを知りませんでした
-ETHproductions

私もそれを知りませんでしたが、「!NU」でテストしたときにわかりました。「未チェック」の小文字の「n」も残っていたため、「U」をドロップできました。)
ルーク

3

PHP(5.5-5.6)、52 50 49バイト

<?='!'[count(spliti('!|N',$argn))%2]?>isChecked()

ここで試してみてください

-2 Bytes by @Titus. Ty :)
-1 Byte  by @ETHproductions. Ty :)

PHP(> = 5.5)、66 65 61

for($b=b;$a=$argn[$i++];)$b^=$a;echo$b&"!"|" ","isChecked()";

正規表現がなければ、もう少しcompexが得られます :) ここで試してみてください

-4 Bytes by @Titus. Ty :)

1
error_reportingデフォルト値はE_ALL&~E_NOTICE&~E_STRICT&~E_DEPRECATEDです。
タイタス

1
@Titusは正規表現でJSを破って挑戦します!
クリストフ

$b^=$aとても素敵な発見!同じサイズのPHPタグなしでそれを行うこともできます。
タイタス

1
先頭の空白が許可されている場合は61バイト:for($b=b;$a=$argn[$i++];)$b^=$a;echo$b&"!"|" ","isChecked()";
タイタス

@Titus この答えに触発されたことを認めざるを得ません。
クリストフ

3

ゼリー 16  15 バイト

OSḂ⁾!iṫ⁾sCø³ṫ-7

文字列をコマンドライン引数として受け取り、結果を出力する完全なプログラム

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

OSḂ⁾!iṫ-7³ṫṭ⁾sCまたはOSḂ⁾!iṫ-7³ṫ⁾sC;、両方とも15で動作します。

どうやって?

私のPythonの答えと同じアイデアを使用しますが、Jellyの異なる構造!isCまたはisC暗黙的な印刷を使用してバイトを節約します...

OSḂ⁾!iṫ⁾sCø³ṫ-7 - Main link: s
O               - cast to ordinals
 S              - sum
  Ḃ             - mod 2
   ⁾!i          - literal ['!','i']
      ṫ         - tail -> ['i'] if OSḂ was 0; ['!','i'] if OSḂ was 1
                - this is printed due to the following starting a new leading
                - constant chain. Printing smashes so either "i" or "!i" is printed.
       ⁾sC      - literal ['s','C']
                - this is printed (as "sC") due to the following niladic chain.
          ø     - start a new niladic chain
           ³    - program's first input (3rd command line argument), s
            ṫ-7 - tail from index -7 = ['h','e','c','k','e','d','(',')']
                - implicit print (of "hecked()")

previous @ 16バイト9(連結と同じ基になるアイデアとのペアリングを使用):

OSḂ⁾!iṫ;⁾sC,ṫ€-7

ああ、私はmod 2のトリックで何かに取り組んでいると思った。それから私はこれを見つけた:PIは、多分それは助けることができる、18バイトのためにこれを持っていた:OS1&”!x;“isC”;ṫ-7$
コナー・オブライエン


2

Sed、36バイト

他のすべての直接代替回答と同じ考え。

:
s/Unc/NotC/
s/isNot/!is/
s/!!//
t

2

sed、37 38バイト

:;s/is(Not|Un)/!is/;s/!!//;t;s/ch/Ch/

-rスイッチの場合は37 + 1 :

sed -r ':;s/is(Not|Un)/!is/;s/!!//;t;s/ch/Ch/'

1
それは最後にs/c/C/Perl 5の答えに問題を引き起こし
ニール

うん、s/c/C/「Un」のないケースで2番目の「c」をキャッチしているように見える
ケビン

1
また、ループをドロップしてループ内gを移動することで、バイトを節約できs/!!//ます。
ケビン

2

Mathematica、82 61 60バイト

小さな調整、もう1つの挿入演算子が追加されました。

"!"~Table~Mod[#~StringCount~{"o","n","!"},2]<>"isChecked()"&

以前:

"!"~Table~Mod[StringCount[#,{"o","n","!"}],2]<>"isChecked()"&

すべてのo、n、および!をmod 2で数え、その数を入れます!前に。

旧版:

"!"~Table~Mod[StringCount[StringReplace[#,{{"o","n"}->"!"}],"!"],2]<>"isChecked()"&


2

Windowsバッチ、120バイト

以前は268257253245245221221182176169123バイト

@set a=%1
@set s=#%a:~,-2%
@set s=%s:!=N#%
@for %%a in (%s:N= %)do @set/ac+=5
@if %c:~-1%==0 cd|set/p=!
@echo isC%a:~-8%

プログラムは、すべての置き換え!にしますN#。これで、すべての否定記号!(Now it is N#)、、NotおよびUncontainsを含むNため、プログラムは出現回数をカウントしN、先行!が必要かどうかを判断できます。

プログラムがanをカウントするたびNに、カウンターが5ずつ加算されます。5を加算する理由は、5を加算するときの各交互の値が0または5で終わるためです。!必要に応じて追加しました。

さらに、xnorの最後の8文字のトリックが利用されます。


Windowsバッチでのプログラミングは不可能だと思うかもしれません
...-NieDzejkob

もちろん......バッチスクリプトは不条理です
。...-stevefestl

1

ゼリー29 28 25 21バイト

f“NU!”LḂ”!x;“µịÆẹṠƊẹ»

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

f“NU!”LḂ”!x;“µịÆẹṠƊẹ»  Main link, argument is z
f“NU!”                 Filter to only keep "NU!"
      LḂ”!x            Repeat exclamation mark by the parity of the length
           ;“µịÆẹṠƊẹ»  Concatenate to "isChecked()"

ジョナサンアランのおかげで-4バイト!
ジョナサンアランのおかげで-4バイト!(圧縮された文字列を使用して)


ここで作成したインターフェイス(モジュールjellyCompress.pyなど)をLynnに保存すると、それはで作成されjellyCompress.Compress().string("is").dictionary("Checked").string("()").go()ます。(Windows cmdインストールで実行し、フォントDejaVu Sans Monoに切り替え、chcp 65001Pythonを起動して文字を表示する前にコマンドでコードページを変更した場合)
ジョナサンアラン

@JonathanAllanああ大丈夫。ありがとう!
ハイパーニュートリノ

1

PHP、55バイト

<?=preg_match_all("#!|N#i",$argn)&1?"!":""?>isChecked()

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

PHP、58バイト

<?=preg_match_all("#[!NU]#",$argn)%2?"!":"","isChecked()";

代わりに"#[!NU]#"使用できます"#[!N]#i"

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

PHP、68バイト

正規表現なしのバージョン

for(;$c=$argn[$i++];)$d^=!trim($c,"UN!");echo"!"[!$d],"isChecked()";

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


3
<?=preg_match_all("#[!UN]#",$argn)&1?"!":""?>isChecked()-2バイト
タイタス

count(split()):D @Titusいいアイデアを思いつく前に、まったく同じ答えがありました!
クリストフ

1
" !"[$d&1]先頭の空白が適切な場合、別のバイトを保存します。$d^=!trim($c,"UN!")&1もう必要ないので)3バイトを節約します。
タイタス

1
@Titusはい、私よりも知識が豊富な例があります。ありがとう、そして私が"!"[!$d]代わりに持っている末尾の空白の問題のために
ヨルグヒュルサーマン

1
@クリストフはあなたが正しいです私はそれについてごめんそれを忘れてしまった
ヨルクヒュルサーマン


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