自己検証三角チェッカーボードプログラム


10

チェッカーボードプログラムは、個々の文字の序数値が偶数から奇数に変化するプログラムで、ラインターミネーター(標準の行末)を除きます。

三角プログラムは、各行に前の行よりも1文字多い追加プログラムで、最初の行には1文字があります。空の入力を処理する必要はありません。

あなたの仕事は、与えられた入力がそれらの基準に準拠していることを検証し、プログラムが基準を満たしている場合は真実、それ以外の場合は偽の何かを出力/返すプログラムを構築することです。

プログラムもこれらの基準を満たしている必要があります。

有効なプログラムの例

G
`e
@u^
5r{B

^
cB
+$C
VA01

ルール

  • 文字のパリティが変化する限り、プログラムは奇数バイトまたは偶数バイトのどちらからでも開始できます。
  • プログラムは、奇数または偶数の文字で始まるプログラムを検証する必要があります。
  • Unicode文字の場合、基礎となるバイト値には交互のパリティが必要です。
  • 入力には印刷可能な文字のみが含まれていると想定できます。プログラムに印刷できないものが含まれている場合でも、プログラム自体を検証できます。
  • プログラムには末尾に改行が1つ含まれる場合がありますが、検証前に削除されていると想定できるため、検証で許可する必要はありません。
  • 標準の抜け穴は禁止されています。
  • 各言語でのバイト単位の最短コードが優先されます。

@MartinEnderご意見ありがとうございます!うまくいけば、これは今では明らかです。これに関連して、これをサンドボックスに長く置いておくべきですか?
ドンヘイスティングス

1
偶数/奇数は水平と垂直の両方で交互ですか?私は「チェッカーボード」から「はい」と想定していますが、あなたの言うところがわかりません。
Ton Hospel 2018年

@DomHastings一週間でいいようです。数日経ってもフィードバックが得られない場合は、チャットで誰か他にコメントがあるかどうか尋ねることができます。
マーティンエンダー2018年

1
@TonHospel私の元の例ではこれを行いましたが、これは私の説明と矛盾していました。そのため、この実装では、いいえ、それは次のようになりますE\nOE\nOEO。お役に立てば幸いです。
Dom Hastings

2
私の意見:入力が改行で始まったり終わらないと仮定して回答を考えてください。
リン、

回答:


3

Stax、26 バイト

L
Y$
i:-
 {2%
*OFyF
%vi =*

オンラインでテストケースを実行する

3人のジャンクキャラクターを紹介しました。iすべてのループ構造の外では何もしません。 常にノーオペレーションです。 Oスタックの一番下に1を入れますが、値はプログラムで使用されません。

LY      move input lines into a list and store in Y register
$       flatten
i       no-op
:-      get pairwise differences
{2%*OF  foreach delta, mod by 2, and multiply, then tuck a 1 under the top of stack
yF      foreach line in original input do...
  %v    subtract 1 from length of line
  i=    is equal to iteration index?
  *     multiply

これを実行


こんにちは、これでコードが混乱しないことを願っていますが、先頭の改行検証を削除できます。
ドンヘイスティングス

8

C(gcc)、189バイト

j
;l
;b;
d;f␉
(char
␉*␉t) 
{b=*␉t%
2;for␉(␉
j=d=0;j=j
+ 1,␉l=j+ 
1,␉*␉t; ) {
for␉(;l=l- 1
 ;t=t+ 1 )b= 
!b␉,␉d=d+ !(␉*
␉t␉*␉(␉*␉t- 10)
*␉(␉*␉t%2-b) ) ;
d␉|=*␉t- 10;t=t+ 
1 ; }b= !d; } ␉ ␉ 

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

タブ文字を表します(申し訳ありません)。末尾のスペース/タブがいくつかあることに注意してください(ごめんなさい)。オリジナルのタブをそのまま使用すると、vimで表示するのが最適です:set tabstop=1(言葉で私がどれほど残念かを表すことはできません)。

f文字列を引数として取り、0またはを返す関数(と呼ばれますが、一見するとすぐにはわかりません)です1

私は可能性があり、少なくとも1、おそらく2行以上が、それは私が悪い人のように感じる主に作っていました(でもPPCG標準で)、そのようなひどいコードを書いているので、終わりに向かってますます厄介かつ低労力を得ることを注記することで、これを減らしますそして、私はできるだけ早く停止したかった。

ここでの基本的な考え方は、必ずしも(書式を壊すことの構造を避けるためにある+++=return、など)。奇妙なことに、、、および(私が使用しなかった)などの重要なキーワードはfor、偶然のパリティルールに偶然一致しています。次に、スペース(偶数パリティ)とタブ(奇数パリティ)をパディングとして使用して、残りをルールに適合させました。charwhile


1
Cでの解決策を期待していませんでした!
ドンヘイスティングス

「ヘッダー」セクションと「フッター」セクションに他のものを入れて、TIOでプログラムのソリューション部分を分離すると、バイト数を確認しやすくなります。
Jakob

4

Haskell1080 1033バイト

;
f=
 g 
ij=f
a =hi
hi = g
hij= ij
g ' ' =0
g '"' =0;
 g '$' =0;
 g '&' =0-0
g '(' =0-0-0
g '*' =0-0-0;
 g ',' =0-0-0;
 g '.' =0-0-0-0
g '0' =0-0-0-0-0
g '2' =0-0-0-0-0;
 g '4' =0-0-0-0-0;
 g '6' =0; g '8' =0
g ':' =0; g '<' =0-0
g '>' =0; g '@' =0-0;
 g 'B' =0; g 'D' =0-0;
 g 'F' =0; g 'H' =0-0-0
g 'J' =0; g 'L' =0-0-0-0
g 'N' =0; g 'P' =0-0-0-0;
 g 'R' =0; g 'T' =0-0-0-0;
 g 'V' =0; g 'X' =0-0-0-0-0
g 'Z' =0; g '^' =0; g '`' =0
g 'b' =0; g 'd' =0; g 'f' =0;
 g 'h' =0; g 'j' =0; g 'l' =0;
 g 'n' =0; g 'p' =0; g 'r' =0-0
g 't' =0; g 'v' =0; g 'x' =0-0-0
g 'z' =0; g '\92' =0-0; g '|' =0;
 g '~' =0; g y = 1 ;z=0; i(-0)z=z;
 i m('\10':y ) ="y"; ; ; ; ; ; ; ; 
i m(mnmnmnmnm:y ) = i(m - 1 ) y ; ; 
i k m ="y"; ; k i [ ] =01<1010101010;
 k m('\10':y ) = k(m + 1 )(i m y ) ; ;
 k m y =01>10; m o = k 1$'\10':o ; ; ; 
o i('\10':y ) = o i y ; ; ; ; ; ; ; ; ; 
o i(k:y )|g k<i = o(1 - i ) y ; ; ; ; ; ;
 o i(k:y )|g k>i = o(1 - i ) y ; ; ; ; ; ;
 o i [ ] =01<10; o i y =01>10;v=01>10101010
s y|o 1 y = m y|o(-0) y = m y ; s y =v; ; ; 

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

説明

これはHaskellにとって非常に興味深いタスクでした。

パリティ

開始するには、文字が偶数か奇数のコードポイントを持っているかどうかを判断するいくつかの方法が必要です。これを行う通常の方法は、コードポイントを取得して2で変更することです。ただし、ご存知のように、文字のコードポイントを取得するにはインポートが必要です。これは、ソースの制限により、中古。より経験のあるHaskellerは再帰を使用することを考えます。 Charは型Enumクラスの一部なので、その前任者と後継者を取得できます。ただしpredsuccバイトパリティを代替しないため、どちらも使用できません。

そのため、文字で操作することはほとんどできないため、かなり行き詰まっています。これに対する解決策は、すべてをハードコーディングすることです。私たちは(ほとんど)偶数の文字をリテラルとして表す'ことができます。奇数なので奇妙です。文字自体の隣に置くことはできないため、ほとんどの奇数の文字をリテラルで表現することは不可能です。そのため、すべての偶数バイトをハードコードし、最後に奇数バイトのキャッチオールを追加します。

問題のバイト

単一引用符で囲むことによってリテラルを作成できないいくつかの偶数バイトがあることに気付くかもしれません。それらは、印刷不能、改行、および\です。unprintablesを使用しない限り、検証する必要がないため、unprintablesについて心配する必要はありません。実際、タブなどの奇妙な印刷不可をまだ使用できますが、必要がなくなるだけです。とにかくプログラムから削除されるため、改行は賢く無視できます。(コードポイントはかなり便利なので、改行を含めることもできますが、必要はありません)。これはを残し\\コードポイント92を持ちます。これは便宜的に奇数の後に偶数が続くため、偶数と奇数を\92交互に繰り返すため、リテラル'\92'完全に有効です。後で改行を表す必要がある場合は、幸いにも同じプロパティがあることに気づくでしょう'\10'

間隔の問題

次に、実際のコードの作成を開始するには、かなりの数の文字を1行に配置できる必要があります。これを行うために、私はキャップを書きました:

;
f=
 g 
ij=f
a =hi
hi = g
hij= ij

キャップは有効なHaskell以外には何もしません。私は当初、後でコードで役立つ定義を作成することを望んでいましたが、そうではありませんでした。空白やセミコロンなど、キャップを作成する簡単な方法もありますが、この方法ではバイトが節約されないので、変更する必要はありません。

ハードコーダー

行に十分なスペースができたので、値のハードコーディングを開始します。これはほとんど退屈ですが、いくつか興味深い点があります。1つは、行がさらに長くなり始めると、1行;に複数の宣言を配置するために使用できるため、大量のバイトを節約できます。

2つ目は、常に行gごとに行を開始できるとは限らないため、行を少しインデントする必要がある場合です。Haskellはインデントを本当に気にしているので、これについて文句を言うでしょう。ただし、インデントされた行の前の最後の行がセミコロンで終わっている場合は、許可されます。どうして?私は最弱者ではありませんが、うまくいきます。したがって、セミコロンを行の最後に置くことを忘れないでください。

機能ビルディングブロック

ハードコーダーが完了すると、プログラムの最後までスムーズに進みます。いくつかの単純な関数を作成する必要があります。最初に私はのバージョン構築dropと呼ばれるが、i。 文字列の末尾を超えてドロップしようとすると、それだけが返されるというi点が異なりdropます"y"iドロップとは異なり、改行をドロップしようとすると、が返されます"y"。これらは後でプログラムが三角形であることを確認しているFalseときに、最後の行が完了していないとき、または行は早く終わります。

kknssTruenkn+1False

私たちは、その後のエイリアスを作成しkmmは最初の引数だけkであり1、2番目の引数の前に改行が追加されます。

次はありoます。 o数値と文字列を受け取ります。文字列バイト(改行を無視)gが入力番号で始まる(を使用して)パリティーで交互に入れ替わるかどうかを決定します。

最後に、との両方sで実行さoれるものが1あり0、どちらかが成功した場合はに延期されmます。両方に失敗した場合は、単に戻りますFalse。これが必要な機能です。入力が三角形で交互になっていると判断します。


1
三角ストリングは、空の行ではなく、1文字の行で始まります。
Jakob

@ヤコブ私はそれはばかげていると思うが、それは十分に簡単な修正でした。
アドホックガーフハンター

3

05AB1E34 26バイト

¶
¡D
©€g
´ā´Q
´sJÇÈ
¥Ä{´нP

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

入力を複数行の文字列として受け取ります("" "の間の入力)。後で説明します。


1
ルールを誤解していない限り、プログラムは改行で始まる入力も検証できる必要があります。
Emigna 2018年

@Emigna私は、プログラム自体が先頭の改行で始まる場合にのみ、先頭の改行を検証できる必要があると思います。
Ton Hospel

これが正しいかどうかはわかりません(仕様を読むのにひどいです):オンラインで試してみてください!
マジックタコの壷

@MagicOctopusUrnあなたの答えは私には問題ないように見えますが、私は入力について疑問に思っています:それを配列として受け取ることは許可されていますか?リンクでは、最初の入力は改行文字ではなく空のスペースです。
Kaldo 2018年

1
こんにちは、これでコードが混乱しないことを願っていますが、先頭の改行検証を削除できます。
ドンヘイスティングス

1

Java 10、209バイト

の反復可能または配列を取るvoidラムダbyte。通常に戻ることでtrueを示し、ランタイム例外をスローすることでfalseを示します。プログラムは、最終行が適切に終了することを期待します。つまり、改行文字で終了します。プログラムの最終行も同様に終了します。

すべてがUTF-8で行われ、「文字」はUnicodeコードポイントを指すと解釈されます。

このビューでは、タブはスペースに置き換えられます。

d
->
{  
long
f= 1,
 h=0 ,
c = - 1
,e ;for 
( byte a:
 d) {var b
=(e = a^10)
<1&e>- 1 ;f=
b?( h ^ f)> 0
?0/0 : f+ 1: f
;h=b?0 :a>-65 ?
h+ 1: h; c =b? c
:c>=0 & ( (c^a )&
1 )<1 ?0/0 :a ; } 
/*1010101010101*/ }

オンラインで試す

16進ダンプ

xxd -p -rUnixで元に戻します。

640a2d3e0a7b20090a6c6f6e670a663d20312c0a09683d30092c0a63203d
202d20310a2c65203b666f72090a28096279746520613a0a096429207b76
617209620a3d2865203d20615e3130290a3c3126653e2d2031203b663d0a
623f280968095e0966293e09300a3f302f30093a09662b20313a09660a3b
683d623f30093a613e2d3635203f0a682b20313a09683b2063203d623f20
630a3a633e3d30092609280928635e612029260a3120293c31203f302f30
093a61203b207d200a2f2a313031303130313031303130312a2f207d0a

未ゴルフ

d -> {
    long f = 1, h = 0, c = ~h, e;
    for (byte a : d) {
        var b = (e = a^10) < 1 & e > -1;
        f = b ?
            (h^f) > 0 ? 0/0 : f + 1
            : f
        ;
        h = b ? 0 :
            a > -65 ? h + 1 : h
        ;
        c = b ? c :
            c >= 0 & ((c^a) & 1) < 1 ? 0/0 : a
        ;
    }
}

fは、現在の行で予想される文字数、hは現在の行でこれまでに表示された文字数、cは最後に表示されたバイト、は改行bかどうかaです。

条件は、文字の最初のバイトa > -65かどうかをテストしaます。これは、シングルバイト(ASCII)文字が8ビットの2の補数で非負であり、長い文字の最初のバイトがバイナリ形式11xxxxxx(2の補数で少なくとも-64)であり、これらの文字の非先行バイトがフォーム10xxxxxx、2の補数で最大-65。(出典

文字が三角形またはチェッカーボードのパターンに違反している場合(つまり、改行が早いか遅いか、または誤ったパリティのバイトが表示されている場合)、対応する三項の左ブランチ(fまたはに割り当てられているc)がアクティブになり、メソッドは算術例外をスローします。


0

Python 3(3.4?)、350バイト

Python 3のように空白について特に言語のトリッキーな課題です。送信が印刷される01、標準出力に送られ、一部の入力がクラッシュします。プログラムは、最終行が適切に終了することを期待します。つまり、改行文字で終了します。プログラムの最終行も同様に終了します。UTF-8は、バイトパリティのチェックに使用されます。

このビューでは、タブはスペースに置き換えられます。

0
i\
= 1
t=(#
 '0'*
 0) ;(
g,) =(#
 open (1
, "w"),) 
k = eval (
'p' + 'rin'
 + 't' ) #01
for  a in (#0
open ( 0) ):#0
#01010101010101
 a = a [:- 1 ] #
 if ( len (a )<i\
or len (a )>i ):[\
k('0' ),1 /0] #0101
 i, t= -~i, t+ a #01
(k( 2-len ({(c^i )&1\
 for  i,c in  eval (#0
 "enu"+"m"+"erate")(#01
 eval ( " byte"+"s")( t#
,' u8' ) ) } ) ) ) #01010

Python 3.4.2で動作します。TIOのPython 3では機能しません。TIOの通訳のバグのようです。

16進ダンプ

xxd -p -rUnixで元に戻します。

300a695c0a3d20310a743d28230a202730272a0a093029203b280a672c29
203d28230a206f70656e0928310a2c09227722292c29200a6b203d206576
616c09280a277027202b202772696e270a202b202774272029202330310a
666f7209206120696e092823300a6f70656e092809302920293a23300a23
30313031303130313031303130310a2061203d2061205b3a2d2031205d20
230a2069660928096c656e09286120293c695c0a6f72096c656e09286120
293e6920293a5b5c0a6b2827302720292c31202f305d2023303130310a20
692c09743d202d7e692c09742b2061202330310a286b2809322d6c656e09
287b28635e69202926315c0a09666f720920692c6320696e09206576616c
092823300a0922656e75222b226d222b2265726174652229282330310a20
6576616c092809220962797465222b22732229280974230a2c2720753827
20292029207d202920292029202330313031300a
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.