Підтвердьте ділянку стебла та листя


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,"
"]})+$/

Це дивовижно ... Цей трюк із $"дуже приємним!
Дада

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

Визначає анонімну функцію, яка приймає введення як рядковий рядок.

Я впевнений, що в гольфі є більше, тому повідомте мене, якщо ви побачите можливі вдосконалення.

Пояснення:

Функція перевіряє наявність численних поганих речей, і якщо будь-яка з цих правдива, вона повертає помилкові (використовуючи логічні АБО та НЕ)

(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замість exec(ви майже завжди хочете використовувати, testякщо вам потрібен лише логічний результат`), то, ймовірно, ви можете використовувати побітове або замість логічного або.
Ніл

Це насправді перевіряє наявність дублікатів або відсутніх стебел?
Ніл

Ви можете зберегти кілька байтів, замінивши їх y.some((c,i,a)=>...до того y.some(c=>...часу, iі aвони не використовуються. І схоже, що z!=z.sort((a,b)=>a-b)це не працює, його можна було б замінити на''+z!=z.sort()
Хеді

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, але закривається, як тільки виявляється помилка.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.