FANDOM


Постановка (Vladimir the Red Sunny 24.7.2008, 10:36) Написать программу декодирования телефонного номера для АОН. По запросу АОНа АТС посылает телефонный номер, используя следующие правила: - Если цифра повторяется менее 2 раз, то это помеха и она должна быть отброшена - Каждая значащая цифра повторяется минимум 2 раза - Если в номере идут несколько цифр подряд, то для обозначения «такая же цифра как предыдущая» используется идущий 2 или более подряд раз знак #

Например, входящая строка 4434###552222311333661 соответствует номеру 4452136 Кстати, регулярные выражения использовать в этих заданиях - нельзя


Рефал, gromozeka, 24.7.2008, [1]

$ENTRY Go { = <Print<convert_number '4434###552222311333661'>>; }
f1 {s.1 s.1 e.1 = s.1 <f1 e.1>; s.1 e.1 = <f1 e.1>; =;}
f2 {e.1 s.1 s.1 e.2 = <f2 e.1 s.1 e.2>; e.1 = e.1;}
f3 {e.1 s.1 '#' e.2 = <f3 e.1 s.1 s.1 e.2>; e.1 = e.1;}
f4 {'#' e.1 = <f4 e.1>; e.1=e.1}
convert_number {e.1 = <f4<f3<f2<f1 e.1>>>>;}


K, zevun, 24.7.2008, [2]

decode:{[s]
    a:-1_ "#"{:[~y=*|x;(-1_ x),y;~y=*-2#x;x,y;x]}/s
    {:["#"=y;x,*|x;x,y]}/ :["#"=*a;1_ a;a]}

decode "4434###552222311333661"

[3]

decode:{[s]
    a:s@&=':s
    a:a@&~(=':a),0
    a::["#"=*a;1_ a;a]
    a@@[!#a;&"#"=a;-;1]}

decode "5###4434###552222311333661"


Python, Vladimir the Red Sunny, 24.7.2008, [4]

def aon_decode(s):
    a1 = [ el for i, el in enumerate(s) if i>0 and s[i-1]==el ]
    a2 = [ el for i, el in enumerate(a1) if i==0 or a1[i-1]!=el ]
    if a2[0] == "#": a2 = a2[1:]
    a3 = [ el if el!="#" else a2[i-1] for i, el in enumerate(a2) ]    
    return "".join(a3)


C, D_K, 24.7.2008, [5]

void convert( char *in, char *res )
{
    char ch = 0;
    char prev = 0;
    while ( in && *in ) {
        if ( *in++ == ch ) {
            if ( ch != '#' )
                prev = ch;
            if ( prev )
                *res++ = prev;
            while ( *in++ == ch )
        ;
        }
        ch = *( in - 1 );
    }
    *res = 0;
}


Erlang, Кошмар, 25.7.2008, [6]

-module(aon).
-export([convert/1]).

f1([X,X|T])->[X|f1(T)];
f1([_|T])->f1(T);
f1([])->[].
f2([X,X|T])->f2([X|T]);
f2([X|T])->[X|f2(T)];
f2([])->[].
f3([X,$#|T])->f3([X,X|T]);
f3([X|T])->[X|f3(T)];
f3([])->[].
f4([$#|T])->f4(T);
f4(L)->L.

convert(L)-> f3(f4(f2(f1(L)))).


Lisp, _sg, 4.8.2008, [7]

(defun decode (s)
  (glue (squeeze (cleave s))))

(defun cleave (s)
  (map 'list #'string s))

(defun squeeze (w &optional ac q b z &aux (a (car w)) (d (cdr w )))
  (cond ((null w) (nreverse ac))
        ((or (string/= a b) (equal b q) (equal a z)) (squeeze d ac b a z))
        ((and (equal a b) (equal b "#")) (squeeze d (push z ac) b a z))
        ((squeeze d (push a ac) b a a))))
                
(defun glue (v)
  (reduce #'(lambda (x &optional y) (concatenate 'string x y)) v :initial-value ""))

Ad blocker interference detected!


Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.