Утвердить ствол и лист заговор

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|.
Кевин Круйссен

Ответы:

4

Perl, 47 байт

Включает +2 для -0p

Внести вклад в STDIN

stem.pl:

#!/usr/bin/perl -0p
$"="*";$_=/^((??{$_+$n++})\|@{[0..9,"
"]})+$/
Тон Хоспел
источник
Это круто ... Этот трюк $"очень хорош!
Дада
2

Пип , 60 58 + 1 = 59 байт

Первый удар по проблеме, возможно, мог бы использовать больше игры в гольф. Использует -rфлаг для чтения строк ввода из стандартного ввода. Истинный вывод 1, ложный вывод 0или пустая строка.

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

Объяснение и тестовый пакет ожидают рассмотрения, а пока: попробуйте онлайн!

DLosc
источник
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 в строке выполняется вместо первого регулярного выражения.

DanTheMan
источник
Если вы используете 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, но завершается, как только обнаруживает ошибку.

Нил
источник