茎葉プロットの検証


20

茎と葉のプロットは、全てが、最後の数字によって決定されたグループ内の数値の束を表示します。たとえば、次のデータセットがあるとします。

0, 2, 12, 13, 13, 15, 16, 20, 29, 43, 49, 101

この茎と葉のプロットを作成できます。

0|02
1|23356
2|09
3|
4|39
5|
6|
7|
8|
9|
10|1

最初の行のステムは0であるため、その「葉」-後の数字|-は、0から10までの値を表します。各茎の葉が並べ替えられます。葉のない茎(3など)がプロットに表示されます。101の値は100を含む100から110を除くので、そのステムは10(100を10で割った値)です。

あなたの課題は、テキストが有効なステムとリーフプロットであるかどうかを確認することです。有効なプロットは次のルールを満たします。

  • データの範囲内のすべてのステム(つまり、10の幅のグループ)ごとに正確に1つの行があります(範囲の中央にあるリーフを含まないステムを含む)
  • 範囲外のステムはありません
  • すべての葉は右に昇順でソートされます
  • すべてのステムは昇順でソートされます
  • 数字のみ(区切り文字以外|

小数部分のある数値を扱う必要はありません。ステムの余分な先行ゼロを承認または拒否できますが、空白のステムは許可されません。少なくとも1つの値があります。各行の葉の後の余分なスペースのみを想定できます。先頭または末尾の改行を想定できます。すべての文字は印刷可能なASCIIです。

関数またはプログラムは、有効なプロットの場合は真の値を、無効なプロットの場合は偽の値を(画面または標準出力に)返すか出力する必要があります。標準の入力、ファイルからの入力を、1つの大きな文字列として、文字列の配列として取得できます-最も便利なものは何でも。

有効なプロットであるいくつかのテストケースを次に示します(空白行で区切られています)。

2|00003457
3|35
4|799
5|3

99|3
100|0556
101|
102|
103|8

0|0

無効なプロットであるテストケースと、右側のコメントを次に示します。

|0               Blank stem

5|347            Missing a stem (6) in the range
7|9

4|               Has a stem (4) outside the range
5|26
6|7

11|432           Leaves aren't sorted correctly
12|9989

5|357            Stems aren't sorted correctly
4|002
6|1

4|5              Duplicate stem
4|6
4|6
5|1

51114            No stem and leaf separator
609

1|2|03           Multiple separators
2|779|

4|8abcdefg9      Invalid characters
5|1,2,3

75 | 4 6         Invalid characters (spaces)
76 | 2 8 8 9

これはコードゴルフなので、最短のコードが勝ちます!標準の抜け穴は許可されていません。


3
これは非常に素晴らしい最初の挑戦であり、素晴らしい仕事です!:)のような行を持つ無効なテストケースを追加します1|2|3
リン

1
素晴らしい最初の挑戦!
AdmBorkBork

素敵な最初の挑戦。追加できるテストケースの1つは4|;5|26;6|7、範囲外の最初のステムを持つものに似ていますが、代わりに末尾にあり12|3;13|4559;14|ます。
ケビンCruijssen

回答:


4

Perl、47バイト

+2を含む -0p

STDINに入力する

stem.pl

#!/usr/bin/perl -0p
$"="*";$_=/^((??{$_+$n++})\|@{[0..9,"
"]})+$/

これはすごい...そのトリック$"はとてもいいです!
ダダ

2

ピップ60 58 + 1 = 59バイト

問題に最初に突き刺すと、おそらくより多くのゴ​​ルフを使うことができるでしょう。-rフラグを使用して、stdinから入力行を読み取ります。真の出力は1、偽の出力0または空の文字列です。

g=a+,#g&a@vNE'|NEg@v@v&$&{Y(a^'|1)a@`^\d+\|\d*$`&SNy=^y}Mg

説明とテストスイートは保留中ですが、それまではオンラインで試してください!


1

JavaScript、189バイト

(x,y=x.split`
`.map(a=>a.split`|`),z=y.map(a=>a[0]))=>!(/[^0-9|\n]|^\|/m.exec(x)||/^\d+\|\n|\|$/.exec(x)||y.some((c,i,a)=>c.length!=2||c[1]!=[...c[1]].sort().join``)||z!=z.sort((a,b)=>a-b))

同じ長さの代替ソリューション:

(x,y=x.split`
`.map(a=>a.split`|`),z=y.map(a=>a[0]))=>!(/[^0-9|\n]|^\||^.*\|.*\|.*$/m.exec(x)||/^\d+\|\n|\|$/.exec(x)||y.some((c,i,a)=>c[1]!=[...c[1]].sort().join``)||z!=z.sort((a,b)=>a-b))

入力を複数行の文字列として受け取る匿名関数を定義します。

ゴルフにはまだまだあると思うので、改善が見られるかどうか教えてください。

説明:

この関数はいくつかの悪いことをチェックし、それらのいずれかが真である場合、偽を返します(論理ORとNOTを使用)

(x,y=x.split("\n").map(a=>a.split`|`),          //y is input in pairs of stem and leaves
z=y.map(a=>a[0]))                               //z is stems
=>                                              //defines function
!(                                              //logical not
/[^0-9|\n]|^\|/m.exec(x)                        //checks for invalid chars and blank stems
||/^\d+\|\n|\|$/.exec(x)                        //checks for stems out of range
||y.some((c,i,a)=>c.length!=2                   //checks for multiple |s in a line
||c[1]!=[...c[1]].sort().join``))               //checks if leaves are in wrong order
||z!=z.sort((a,b)=>a-b))                        //checks for stems in wrong order

代替ソリューションで|は、行内の複数のsのチェックは、代わりに最初の正規表現の一部として行われます。


test代わりに使用する場合exectestブール値の結果のみが必要な場合にほぼ常に使用したい)、論理ORの代わりにビット単位ORを使用することができます。
ニール

これは実際に重複または欠落したステムをチェックしますか?
ニール

あなたは、いくつかのバイトが交換救うことができるy.some((c,i,a)=>...y.some(c=>...以来ia使用されていません。そして、z!=z.sort((a,b)=>a-b)それは次のように置き換えることができるように動作しないようです''+z!=z.sort()
-Hedi

1

バッチ、409バイト

echo off
set/pp=||exit/b1
set t=
set i=%p:|=&set t=%
if "%t%"=="" exit/b1
for /f "delims=0123456789" %%s in ("%i%")do exit/b1
:l
set t=-
set s=%p:|=&set t=%
if "%s%"=="" exit/b1
if not "%s%"=="%i%" exit/b1
set/ai+=1
for /f "delims=0123456789" %%s in ("%t%")do exit/b1
:m
if "%t:~1,1%"=="" goto n
if %t:~0,1% gtr %t:~1,1% exit/b1
set t=%t:~1%
goto m
:n
set/pp=&&goto l
if "%t%"=="" exit/b1

STDINで入力を受け取りますが、エラーが発生するとすぐに終了します。

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