Задания
Версия для печати и копирования в MS Word
Тип Д19 C4 № 3125
i

На вход про­грам­ме по­да­ет­ся набор сим­во­лов, за­кан­чи­ва­ю­щий­ся точ­кой (в про­грам­ме на языке Бей­сик сим­во­лы можно вво­дить по од­но­му в стро­ке, пока не будет вве­де­на точка, или счи­ты­вать дан­ные из файла). На­пи­ши­те эф­фек­тив­ную, в том числе и по ис­поль­зу­е­мой па­мя­ти, про­грам­му (ука­жи­те ис­поль­зу­е­мую вер­сию языка про­грам­ми­ро­ва­ния, на­при­мер, Borland Pascal 7.0), ко­то­рая сна­ча­ла будет опре­де­лять, есть ли в этом на­бо­ре сим­во­лы, со­от­вет­ству­ю­щие де­ся­тич­ным циф­рам. Если такие сим­во­лы есть, то можно ли пе­ре­ста­вить их так, чтобы по­лу­чен­ное число было сим­мет­рич­ным (чи­та­лось оди­на­ко­во как слева на­пра­во, так и спра­ва на­ле­во). Ве­ду­щих нулей в числе быть не долж­но, ис­клю­че­ние – число 0, за­пись ко­то­ро­го со­дер­жит ровно один ноль.

Если тре­бу­е­мое число со­ста­вить не­воз­мож­но, то про­грам­ма долж­на вы­ве­сти на экран слово «NO». А если воз­мож­но, то в пер­вой стро­ке сле­ду­ет вы­ве­сти слово «YES», а во вто­рой – ис­ко­мое сим­мет­рич­ное число. Если таких чисел не­сколь­ко, то про­грам­ма долж­на вы­во­дить мак­си­маль­ное из них. На­при­мер, пусть на вход по­да­ют­ся сле­ду­ю­щие сим­во­лы:

Do not 911 to 09 do.

В дан­ном слу­чае про­грам­ма долж­на вы­ве­сти

YES

91019

Спрятать решение

Ре­ше­ние.

Про­грам­ма чи­та­ет все вход­ные сим­во­лы до точки один раз, под­счи­ты­вая в мас­си­ве, хра­ня­щем 10 целых чисел, ко­ли­че­ство каж­дой из цифр. Сами вход­ные сим­во­лы при этом не за­по­ми­на­ют­ся. Затем про­ве­ря­ет­ся  — сколь­ко в этом мас­си­ве не­чет­ных эле­мен­тов. Если боль­ше од­но­го, то за­да­ча ре­ше­ния не имеет. При на­ли­чии ре­ше­ния сна­ча­ла пе­ча­та­ет­ся по­ло­ви­на име­ю­щих­ся цифр 9 (если та­ко­вые име­ют­ся, в слу­чае не­чет­но­го числа цифр  — мень­шая по­ло­ви­на), затем 8 и т. д. до 0, потом пе­ча­та­ет­ся цифра, ко­то­рая встре­ча­ет­ся во вход­ных дан­ных не­чет­ное число раз, а затем  — остав­ша­я­ся по­ло­ви­на цифр 0 (если та­ко­вые име­ют­ся, в слу­чае не­чет­но­го числа цифр  — мень­шая по­ло­ви­на), 1, и т. д. до 9. Если ни­ка­ких цифр, кроме 0, во вход­ных дан­ных нет, то за­да­ча имеет ре­ше­ние, толь­ко если этот ноль един­ствен­ный. Если нулей чет­ное число, а не­ну­ле­вая цифра един­ствен­ная, то ре­ше­ния не су­ще­ству­ет.

Баллы на­чис­ля­ют­ся толь­ко за про­грам­му, ко­то­рая ре­ша­ет за­да­чу хотя бы для од­но­го част­но­го слу­чая (на­при­мер, для строк, со­сто­я­щих не более чем из 255 сим­во­лов), или ко­то­рая умеет толь­ко опре­де­лять, имеет ли за­да­ча ре­ше­ние.

При­мер пра­виль­ной и эф­фек­тив­ной про­грам­мы на языке Пас­каль:

При­ведём ре­ше­ние за­да­чи на языке Pascal.

var a:array['0'..'9'] of integer;

c, c_odd: char;

i, k: integer;

f: boolean;

begin

for c:='0' to '9' do a[c]:=0;

read(c);

while c<>'.' do

begin

if c in ['0' .. '9'] then a[c] := a[c] + 1;

read(c);

end;

k := 0; {ко­ли­че­ство цифр, встре­ча­ю­щих­ся не­чет­ное число раз}

for c := '0' to '9' do

if a[c] mod 2 = 1 then

begin

k := k + 1;

c_odd := c

end;

f := (a['0'] = 1);

for c := '1' to '9' do

if (a[c] > 1) or (a[c] = 1) and (a['0'] = 0) then f := true;

if (k > 1)or not f then writeln('NO') else

begin

writeln('YES');

for c := '9' downto '0' do

for i := 1 to a[c] div 2 do

write(c);

if k = 1 then

write(c_odd);

for c := '0' to '9' do

for i := 1 to a[c] div 2 do

write(c);

end

end.

 

 

При­ведём ре­ше­ние Сер­гея Донец на языке PascalABC.NET.

begin

var s := ReadSeqStringWhile(x->x<>'.').JoinToString;

var num := s.Where(c->c.IsDigit);

if num.Any

then begin

var n:=num.JoinToString;

var d:=n.Permutations(n.Length).Distinct.Where(c->c=ReverseString(c));

if d.Any

then writeln('YES',NewLine,d.Max)

else writeln('NO');

end

else writeln('NO');

end.

 

 

 

При­мер пра­виль­ной и эф­фек­тив­ной про­грам­мы на языке Бей­сик:

 

DIM k, i, j, iodd, a(9) AS INTEGER

FOR i = 0 TO 9

a(i) = 0

NEXT

INPUT c$

DO WHILE NOT (c$ = ".")

IF c$ >= "0" AND c$ <= "9" THEN

a(ASC(c$) - ASC("0")) = a(ASC(c$) - ASC("0")) + 1

ENDIF

INPUT c$

LOOP

k = 0

IF a(0) = 1 THEN f = 1 ELSE f = 0

FOR i = 0 TO 9

IF a(i) MOD 2 = 1 THEN

k = k + 1

iodd = i

END IF

IF i > 0 AND a(i) > 1 THEN f = 1

NEXT

IF k = 1 AND a(0) = 0 THEN f = 1

IF k > 1 OR f = 0 THEN

PRINT "NO"

END

ENDIF

PRINT "YES"

FOR i = 9 TO 0 STEP -1

FOR j = 1 TO a(i) \ 2

PRINT i;

NEXT

NEXT

IF k = 1 THEN PRINT iodd;

FOR i = 0 TO 9

FOR j = 1 TO a(i) \ 2

PRINT i;

NEXT

NEXT

END

Спрятать критерии
Критерии проверки:

Кри­те­рии оце­ни­ва­ния вы­пол­не­ния за­да­нияБаллы
Про­грам­ма ра­бо­та­ет для любых вход­ных дан­ных про­из­воль­но­го раз­ме­ра и на­хо­дит ответ. Про­грам­ма про­смат­ри­ва­ет вход­ные дан­ные один раз. До­пус­ка­ет­ся на­ли­чие в тек­сте про­грам­мы одной син­так­си­че­ской ошиб­ки: про­пу­щен или не­вер­но ука­зан знак пунк­ту­а­ции, не­вер­но на­пи­са­но или про­пу­ще­но за­ре­зер­ви­ро­ван­ное слово языка про­грам­ми­ро­ва­ния, не опи­са­на или не­вер­но опи­са­на пе­ре­мен­ная, при­ме­ня­ет­ся опе­ра­ция, не­до­пу­сти­мая для со­от­вет­ству­ю­ще­го типа дан­ных (если одна и та же ошиб­ка встре­ча­ет­ся не­сколь­ко раз, то это счи­та­ет­ся за одну ошиб­ку).4
Про­грам­ма ра­бо­та­ет верно. До­пус­ка­ет­ся на­ли­чие от одной до трех син­так­си­че­ских оши­бок. Воз­мож­но, в прин­ци­пи­аль­но верно ор­га­ни­зо­ван­ном вводе дан­ных есть одна ошиб­ка (на­при­мер, ис­поль­зо­ва­ние read вме­сто readln в Пас­ка­ле или не­вер­ное счи­ты­ва­ние стро­ки в C++). Три балла также вы­став­ля­ет­ся, если в эф­фек­тив­ной про­грам­ме, удо­вле­тво­ря­ю­щей кри­те­ри­ям вы­став­ле­ния 4 бал­лов, есть одна ошиб­ка, в ре­зуль­та­те ко­то­рой про­грам­ма ра­бо­та­ет не­вер­но на не­ко­то­рых на­бо­рах не­ти­пич­ных вход­ных дан­ных.3
Про­грам­ма ра­бо­та­ет в целом верно, эф­фек­тив­но или нет, но в ре­а­ли­за­ции ал­го­рит­ма со­дер­жит­ся до двух оши­бок (не­вер­ная ини­ци­а­ли­за­ция счётчи­ков, до­пу­ще­на ошиб­ка в прин­ци­пи­аль­но верно ор­га­ни­зо­ван­ной сор­ти­ров­ке или ал­го­рит­ме по­ис­ка ми­ни­маль­ных эле­мен­тов, ис­поль­зу­ет­ся знак “<” вме­сто “<=”, “or” вме­сто “and” и тому по­доб­ное).

Воз­мож­но, не­кор­рект­но ор­га­ни­зо­ва­но счи­ты­ва­ние вход­ных дан­ных. До­пус­ка­ет­ся на­ли­чие от одной до пяти син­так­си­че­ских оши­бок, опи­сан­ных выше

2
Про­грам­ма, воз­мож­но, не­вер­но ра­бо­та­ет при не­ко­то­рых вход­ных дан­ных, но по при­ведённому тек­сту ре­ше­ния ясно, что эк­за­ме­ну­е­мый по­ни­ма­ет, из каких эта­пов долж­но со­сто­ять ре­ше­ние за­да­чи. При ис­поль­зо­ва­нии сор­ти­ров­ки она может быть ре­а­ли­зо­ва­на прин­ци­пи­аль­но не­вер­но (на­при­мер, вме­сто двух цик­лов ис­поль­зу­ет­ся один), или до­пу­ще­на прин­ци­пи­аль­ная ошиб­ка в по­ис­ке нуж­ных эле­мен­тов. Всего до­пус­ка­ет­ся до 4 раз­лич­ных оши­бок в ре­а­ли­за­ции ал­го­рит­ма, в том числе опи­сан­ных в кри­те­ри­ях при­сво­е­ния двух бал­лов. До­пус­ка­ет­ся на­ли­чие от одной до семи син­так­си­че­ских оши­бок, опи­сан­ных выше.1
За­да­ние не вы­пол­не­но или вы­пол­не­но не­вер­но.0
Мак­си­маль­ный балл4