Xác thực một âm mưu thân và lá


20

Biểu đồ thân và lá hiển thị một loạt các giá trị số theo nhóm, được xác định bởi tất cả trừ chữ số cuối cùng. Ví dụ: giả sử chúng ta có bộ dữ liệu này:

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

Chúng tôi có thể sản xuất lô thân và lá này:

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

Thân của hàng đầu tiên là 0, do đó, "lá" của nó - các chữ số sau |- đại diện cho các giá trị từ 0 bao gồm và 10 độc quyền. Các lá trên mỗi thân được sắp xếp. Thân cây không có lá (như 3) vẫn xuất hiện trong cốt truyện. Giá trị của 101 là từ 100 bao gồm và 110 độc quyền, vì vậy thân của nó là 10 (100 chia cho 10).

Thách thức của bạn là kiểm tra xem một đoạn văn bản có phải là một thân cây và lá hợp lệ hay không. Một âm mưu hợp lệ thỏa mãn các quy tắc này:

  • Có chính xác một hàng cho mỗi thân cây (tức là nhóm rộng 10) trong phạm vi dữ liệu (bao gồm cả các thân ở giữa phạm vi không có lá)
  • Không có thân cây ngoài phạm vi
  • Tất cả các lá được sắp xếp tăng dần về bên phải
  • Tất cả các thân cây được sắp xếp tăng dần xuống
  • Chỉ có các ký tự số (ngoài dấu phân cách |)

Bạn không phải đối phó với những con số có các phần phân số. Bạn có thể phê duyệt hoặc từ chối các số 0 đứng đầu trong các thân cây, nhưng một thân trống không được phép. Sẽ có ít nhất một giá trị. Bạn chỉ có thể giả sử thêm khoảng trắng sau các lá trên mỗi hàng. Bạn có thể giả định một dòng mới hàng đầu và / hoặc dấu. Tất cả các ký tự sẽ được in ASCII.

Hàm hoặc chương trình của bạn sẽ trả về hoặc xuất ra (để sàng lọc hoặc đầu ra tiêu chuẩn) một giá trị trung thực cho một âm mưu hợp lệ hoặc một giá trị giả cho một âm mưu không hợp lệ. Bạn có thể lấy đầu vào từ đầu vào tiêu chuẩn, từ một tệp, dưới dạng một chuỗi lớn, dưới dạng một chuỗi các chuỗi - bất cứ điều gì thuận tiện nhất.

Dưới đây là một số trường hợp thử nghiệm là các ô hợp lệ (được phân tách bằng các dòng trống):

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

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

0|0

Dưới đây là một số trường hợp thử nghiệm là các ô không hợp lệ, với chú thích ở bên phải:

|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

Đây là mã golf, vì vậy mã ngắn nhất sẽ thắng! Sơ hở tiêu chuẩn là không được phép.


3
Đây là một thử thách đầu tiên rất tốt đẹp, công việc tuyệt vời! :) Tôi muốn thêm một trường hợp kiểm tra không hợp lệ có một dòng như 1|2|3trong đó.
Lynn

1
Thử thách đầu tiên tuyệt vời!
admBorkBork

Thử thách đầu tiên tốt đẹp. Một trường hợp thử nghiệm mà bạn có thể có thể thêm tương tự như trường hợp có 4|;5|26;6|7thân đầu tiên nằm ngoài phạm vi, nhưng thay vào đó, ở cuối, tức là 12|3;13|4559;14|.
Kevin Cruijssen

Câu trả lời:


4

Perl, 47 byte

Bao gồm +2 cho -0p

Cung cấp đầu vào trên STDIN

stem.pl:

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

Điều này thật tuyệt vời ... Thủ thuật đó $"rất hay!
Dada

2

Pip , 60 58 + 1 = 59 byte

Cú đâm đầu tiên vào vấn đề, có lẽ có thể sử dụng nhiều golf hơn. Sử dụng -rcờ để đọc các dòng đầu vào từ stdin. Đầu ra thật là 1, đầu ra giả là 0hoặc chuỗi rỗng.

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

Bộ giải thích và thử nghiệm đang chờ xử lý, nhưng trong thời gian chờ đợi: Hãy thử trực tuyến!


1

JavaScript, 189 byte

(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))

Giải pháp thay thế cùng chiều dài:

(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))

Xác định một hàm ẩn danh lấy đầu vào là một chuỗi nhiều dòng.

Tôi chắc chắn có nhiều hơn để chơi golf, vì vậy hãy cho tôi biết nếu bạn thấy bất kỳ cải tiến có thể.

Giải trình:

Hàm kiểm tra một số điều xấu và nếu bất kỳ điều nào là đúng, nó sẽ trả về false (sử dụng OR logic và KHÔNG)

(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

Trong giải pháp thay thế, việc kiểm tra nhiều |s trong một dòng được thực hiện như một phần của biểu thức chính quy đầu tiên thay thế.


Nếu bạn sử dụng testthay vì exec(bạn hầu như luôn muốn sử dụng testnếu bạn chỉ cần một kết quả boolean`) thì có lẽ bạn có thể sử dụng bitwise hoặc thay vì logic hoặc.
Neil

Điều này thực sự kiểm tra trùng lặp hoặc mất gốc?
Neil

Bạn có thể tiết kiệm một số byte thay thế y.some((c,i,a)=>...bởi y.some(c=>...từ iakhông được sử dụng. Và dường như z!=z.sort((a,b)=>a-b)không hoạt động, nó có thể được thay thế bằng''+z!=z.sort()
Hedi

1

Hàng loạt, 409 byte

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

Mất đầu vào trên STDIN, nhưng thoát ngay khi thấy lỗi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.