줄기-잎 그림 검증


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 개 그룹)에 대해 정확히 하나의 행을 갖습니다 (잎이없는 범위의 중간에 줄기 포함).
  • 범위를 벗어난 줄기가 없습니다
  • 모든 잎은 오른쪽으로 오름차순으로 정렬됩니다
  • 모든 줄기는 오름차순으로 정렬됩니다
  • (분리 외에 숫자 만 있음 |)

소수 부분이있는 숫자를 다룰 필요는 없습니다. 스템에서 추가 선행 0을 승인하거나 거부 할 수 있지만 빈 스템은 허용되지 않습니다. 하나 이상의 값이 있습니다. 각 행에서 나뭇잎 다음에 여분의 공백 만 사용할 수 있습니다. 선행 및 / 또는 후행 줄 바꿈을 가정 할 수 있습니다. 모든 문자는 인쇄 가능한 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.
Lynn

1
첫 도전!
AdmBorkBork

좋은 첫 번째 도전. 추가 할 수있는 하나의 테스트 사례 4|;5|26;6|7는 범위를 벗어난 첫 번째 줄기가있는 대신 비슷하지만 끝에 12|3;13|4559;14|있습니다.
Kevin Cruijssen

답변:


4

펄, 47 바이트

에 +2 포함 -0p

STDIN에 입력하십시오

stem.pl:

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

이것은 끔찍하다 ...와 트릭 $"은 매우 좋다!
Dada

2

, 60 58 + 1 = 59 바이트

문제를 먼저 찌르면 아마도 더 많은 골프를 사용할 수 있습니다. -r플래그를 사용하여 stdin에서 입력 행을 읽습니다. Truthy 출력은 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))

여러 줄 문자열로 입력을받는 익명 함수를 정의합니다.

골프에 더 많은 것이 있다고 확신하므로 가능한 개선 사항이 있으면 알려주십시오.

설명:

이 함수는 여러 가지 나쁜 점을 확인하고 그 중 하나라도 해당되면 false를 반환합니다 (논리적 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

대체 솔루션 |에서 한 줄 에 여러 개가 있는지 확인 하는 것이 첫 번째 정규 표현식의 일부로 수행됩니다.


당신이 사용하는 경우 test대신 exec(당신은 거의 항상 사용하려는 test그때는 아마 비트를 사용하거나 대신 논리적 또는 당신은 부울 result` 필요한 경우).

실제로 줄기가 중복되거나 누락되었는지 확인합니까?

당신은 몇 바이트 교체 구할 수 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.