Bir gövde ve yaprak grafiğini doğrulayın


20

Bir kök ve yaprak grafiği , son basamak dışındaki herkes tarafından belirlenen gruplar halinde bir dizi sayısal değer görüntüler. Örneğin, şu veri kümesine sahip olduğumuzu varsayalım:

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

Bu sap ve yaprak grafiğini üretebiliriz:

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

İlk satırın gövdesi 0'dır, bu nedenle "yaprakları" - sonraki basamaklar |- 0 (dahil) ile 10 (hariç) arasındaki değerleri temsil eder. Her gövdedeki yapraklar sıralanır. Yaprakları olmayan saplar (3 gibi) hala arsada görünür. 101 değeri 100 dahil ve 110 arasındadır, bu yüzden gövdesi 10'dur (100 bölü 10'dur).

Zorluğunuz , bir metnin geçerli bir kök ve yaprak grafiği olup olmadığını kontrol etmektir. Geçerli bir çizim bu kuralları karşılar:

  • Veri aralığındaki her gövde (yani 10 genişlikli grup) için tam olarak bir satır vardır (aralığın ortasında yapraksız gövdeler dahil)
  • Aralığın dışında sapları yok
  • Tüm yapraklar sağa doğru artan şekilde sıralanır
  • Tüm saplar aşağı doğru artan şekilde sıralanır
  • Yalnızca sayısal karakterler var (ayırıcı dışında |)

Kesirli kısımları olan sayılarla uğraşmak zorunda değilsiniz. Saplarda fazladan önde gelen sıfırları onaylayabilir veya reddedebilirsiniz, ancak boş bir gövdeye izin verilmez. En az bir değer olacaktır. Yalnızca her sıradaki yapraklardan sonra fazladan boşluk kabul edebilirsiniz. Öncü ve / veya sondaki bir yeni satırı varsayabilirsiniz. Tüm karakterler yazdırılabilir ASCII olacaktır.

İşleviniz veya programınız geçerli bir grafik için gerçek bir değer veya geçersiz bir grafik için gerçek bir değer döndürmeli veya çıktı vermelidir (ekrana veya standart çıktıya). Standart girdiden, bir dosyadan, tek bir büyük dize, bir dizi dizisi olarak giriş yapabilirsiniz - en uygun olanı.

Geçerli araziler (boş satırlarla ayrılmış) olan bazı test örnekleri şunlardır:

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

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

0|0

Aşağıda , sağda yorum bulunan, geçersiz grafikler olan bazı test örnekleri verilmiştir:

|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

Bu kod golf, bu yüzden en kısa kod kazanır! Standart boşluklara izin verilmez.


3
Bu çok güzel bir ilk meydan okuma, harika bir iş! :) 1|2|3İçinde bir çizgi olan geçersiz bir test örneği eklerdim .
Lynn

1
Mükemmel ilk meydan okuma!
AdmBorkBork

Güzel ilk meydan okuma. Belki ekleyebileceğiniz bir test durumu 4|;5|26;6|7, aralığın dışında ilk gövdeye sahip olana benzer , ancak sonunda, yani 12|3;13|4559;14|.
Kevin Cruijssen

Yanıtlar:


4

Perl, 47 bayt

İçin +2 içerir -0p

STDIN'e giriş verin

stem.pl:

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

Bu harika ... Bu numara $"çok güzel!
Dada

2

Pip , 60 58 + 1 = 59 bayt

İlk sorun bıçak, muhtemelen daha fazla golf kullanabilirsiniz. Stdin'den -rgirdi satırlarını okumak için bayrağı kullanır . Gerçek çıktı 1, yanlış çıktı 0veya boş dize.

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

Açıklama ve test paketi beklemede, ancak bu arada: Çevrimiçi deneyin!


1

JavaScript, 189 bayt

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

Aynı uzunlukta alternatif çözüm:

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

Girişi çok satırlı bir dize olarak alan anonim bir işlevi tanımlar.

Eminim golf için daha fazlası vardır, bu yüzden herhangi bir olası gelişme görüyorsanız bildirin

Açıklama:

İşlev bir takım kötü şeyleri denetler ve bunlardan herhangi biri doğruysa yanlış döndürür (mantıksal OR ve NOT kullanarak)

(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

Alternatif çözümde, |bir satırda birden fazla s olup olmadığı, bunun yerine ilk normal ifadenin bir parçası olarak yapılır.


testBunun yerine kullanırsanız exec(neredeyse her zaman testyalnızca bir boole sonucuna ihtiyacınız varsa kullanmak istersiniz`) muhtemelen bitsel olarak veya mantıksal veya yerine kullanabilirsiniz.
Neil

Bu aslında yinelenen veya eksik sapları kontrol ediyor mu?
Neil

Bazı bayt yerine kurtarabilecek y.some((c,i,a)=>...tarafından y.some(c=>...beri ive akullanılmaz. Ve z!=z.sort((a,b)=>a-b)işe yaramıyor gibi ''+z!=z.sort()
görünebilir

1

Toplu, 409 bayt

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 üzerine girdi alır, ancak bir hata görür görmez çıkar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.