ตรวจสอบพล็อตต้นกำเนิดและใบไม้


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 ค่ารวมและแบบพิเศษ 110 ค่าดังนั้นค่าของต้นกำเนิดคือ 10 (100 หารด้วย 10)

ความท้าทายของคุณคือการตรวจสอบว่าชิ้นส่วนของข้อความนั้นเป็นส่วนของสเตมและลีฟที่ถูกต้องหรือไม่ พล็อตที่ถูกต้องเป็นไปตามกฎเหล่านี้:

  • มีแถวหนึ่งแถวสำหรับทุกต้นกำเนิด (เช่นกลุ่มกว้าง 10 กลุ่ม) ในช่วงของข้อมูล (รวมถึงลำต้นที่อยู่ตรงกลางของช่วงที่ไม่มีใบไม้)
  • ไม่มีก้านอยู่นอกช่วง
  • ใบทั้งหมดจะถูกจัดเรียงจากน้อยไปมากทางด้านขวา
  • ลำต้นทั้งหมดเรียงจากน้อยไปมาก
  • มีอักขระตัวเลขเท่านั้น (นอกเหนือจากตัวแยก|)

คุณไม่ต้องจัดการกับตัวเลขที่มีเศษส่วน คุณสามารถอนุมัติหรือปฏิเสธเลขศูนย์นำหน้าพิเศษในลำต้น แต่ไม่อนุญาตให้ใช้ก้านเปล่า จะต้องมีอย่างน้อยหนึ่งค่า คุณสามารถสันนิษฐานได้ว่ามีช่องว่างเพิ่มเติมหลังจากออกจากแต่ละแถว คุณอาจถือว่าขึ้นบรรทัดใหม่และ / หรือต่อท้าย ตัวละครทุกตัวจะสามารถพิมพ์ได้ ASCII

ฟังก์ชั่นหรือโปรแกรมของคุณควรส่งคืนหรือส่งออก (ไปยังหน้าจอหรือเอาต์พุตมาตรฐาน) เป็นค่าจริงสำหรับพล็อตที่ถูกต้องหรือค่าเท็จสำหรับพล็อตที่ไม่ถูกต้อง คุณอาจรับอินพุตจากอินพุตมาตรฐานจากไฟล์เป็นสตริงขนาดใหญ่หนึ่งรายการเป็นอาร์เรย์ของสตริง - สิ่งที่สะดวกที่สุด

ต่อไปนี้เป็นกรณีทดสอบบางส่วนที่เป็นพล็อตที่ถูกต้อง (คั่นด้วยบรรทัดว่าง):

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

ความท้าทายแรกที่ดี กรณีทดสอบหนึ่งที่คุณอาจจะสามารถเพิ่มคล้ายกับ4|;5|26;6|7ที่มีต้นกำเนิดอยู่นอกช่วงแรก 12|3;13|4559;14|แต่แทนที่จะที่สิ้นสุดคือ
Kevin Cruijssen

คำตอบ:


4

Perl, 47 ไบต์

รวมถึง +2 สำหรับ -0p

ให้อินพุตบน STDIN

stem.pl:

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

นี่มันช่างน่ากลัว ... เคล็ดลับนั่น$"ดีมาก!
Dada

2

Pip , 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

จาวาสคริปต์, 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))

นิยามฟังก์ชันที่ไม่ระบุชื่อที่รับอินพุตเป็นสตริงหลายบรรทัด

ฉันแน่ใจว่ามีสนามกอล์ฟอีกมากโปรดแจ้งให้เราทราบหากคุณเห็นการปรับปรุงที่เป็นไปได้

คำอธิบาย:

ฟังก์ชั่นการตรวจสอบจำนวนของสิ่งที่ไม่ดีและหากมีสิ่งใดที่เป็นจริงก็จะส่งกลับเท็จ (ใช้ตรรกะ ORs และไม่)

(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 ในหนึ่งบรรทัดนั้นเป็นส่วนหนึ่งของ regex แรกแทน


หากคุณใช้testแทนexec(คุณเกือบจะต้องการใช้testหากคุณต้องการผลบูลีนเท่านั้น) จากนั้นคุณสามารถใช้บิตหรือตรรกะหรือ
Neil

สิ่งนี้ตรวจสอบลำต้นจริงหรือที่หายไปหรือไม่
Neil

คุณสามารถบันทึกไบต์แทนy.some((c,i,a)=>...โดยy.some(c=>...นับตั้งแต่iและaไม่ได้ใช้ และดูเหมือนว่า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.