도형 단순화 작성


19

소개

ASCII 바위가 많이 있습니다. 대시, 파이프, V, 캐럿, 꺾쇠 괄호, 슬래시 및 공백으로 구성됩니다. 예:

/--\
|  |
|  |
\--/

다음과 같이 침식하고 싶습니다.

 /\
/  \
\  /
 \/

모든 모서리가 둥글게되었습니다. 더 복잡한 예 :

/----\
|     \------\
|            |
|            |
\------------/

 /--\
/    \------\
|            \
\            /
 \----------/

또 다른 침식 후에는

  /\
 /  \------\
<           \
 \          /
  \--------/

그리고 또 다른:

  /\------\
 <         \
  \        /
   \------/

도전

당신의 도전은 입력을 한번 침식 할 수있는 프로그램을 작성하는 것입니다. 하나의 바위 만 있다고 가정 할 수 있으며 하나의 닫힌 루프라고 가정 할 수 있습니다. 입력에는 문자 만 포함되며 /\ -| <> ^V \n사각형을 만들 수있는 후행 공백이 있습니다. 프로그램은 STDIN에서 입력을 받고 STDOUT으로 출력하거나 함수일 수 있습니다. 각 행 끝에 줄 바꿈 문자가 있습니다. 침식은 아래에 설명 된 규칙을 따라야합니다 (참고 : 암석이 완성되지 않은 예에서는 설명을 쉽게하기위한 것임). 출력은 입력과 동일한 형식으로 입력과 동일한 형식이어야합니다. 그러나 후행 공백은 생략 될 수 있습니다.

슬래시는 파이프 라인과 대시로 확산되어 가로 질러 이동합니다.

/---
|
|

 /--
/
|

  /-
 /
/

두 개의 슬래시가 병합되면 적절한 문자 <>^V가 사용됩니다.

/-----\
|     |
|     |
|     |
\-----/

 /---\
/     \
|     |
\     /
 \---/

  /-\
 /   \
<     >
 \   /
  \-/

   ^
  / \
 <   >
  \ /
   V

바위의 일부가 합쳐질 수 있습니다. 참고 : 한 부분은 병합 할 수 있지만 다른 부분은 병합 할 수없는 경우 (예 : /\두 번째 줄) 병합 할 수있는 부분이 있습니다 (예 참조).

          /\
 /\-^-/\-/  \--
 |
 <
 |
 /
 \
 |
 /
/
\
 \
 |
 |


  /-------/\--
 /
 |
 |
 |
 |
 |
 |
 /
 \
 |
 |
 |

결국 모든 암석은 아무것도되지 않을 것입니다.

<>  ^  /\
    V  \/

테스트 사례

시험 1 :

/----\
|     \------\
|            |
|            |
\------------/

 /--\
/    \------\
|            \
\            /
 \----------/

  /\
 /  \------\
<           \
 \          /
  \--------/


  /\------\
 <         \
  \        /
   \------/


   /-----\
  <       \
   \      /
    \----/

    /---\
   <     \
    \    /
     \--/

     /-\
    <   \
     \  /
      \/

      ^
     < \
      \/

시험 2 :

/----\
|    |
|    |
|    |
|    |
\----/

 /--\
/    \
|    |
|    |
\    /
 \--/

  /\
 /  \
/    \
\    /
 \  /
  \/

  /\
 /  \
 \  /
  \/

  /\
  \/

시험 3 :

          ^    /\
 /\--/\--/ \--/  \-\
 \                 |
 |                 |
 /                 |
 \                 |
 |                 |
 |                 |
 /                 |
<                  |
 \                 |
 |                 |
 |                 |
 /                 |
/                  |
\                  |
 \-----------------/


  /-------^----/\-\
 /                 \
 |                 |
 |                 |
 |                 |
 |                 |
 |                 |
 |                 |
 <                 |
 |                 |
 |                 |
 |                 |
 |                 |
 /                 |
 \                 /
  \---------------/


   /-------------\
  /               \
 /                 \
 |                 |
 |                 |
 |                 |
 |                 |
 |                 |
 |                 |
 |                 |
 |                 |
 |                 |
 |                 |
 \                 /
  \               /
   \-------------/

    /-----------\
   /             \
  /               \
 /                 \
 |                 |
 |                 |
 |                 |
 |                 |
 |                 |
 |                 |
 |                 |
 |                 |
 \                 /
  \               /
   \             /
    \-----------/

     /---------\
    /           \
   /             \
  /               \
 /                 \
 |                 |
 |                 |
 |                 |
 |                 |
 |                 |
 |                 |
 \                 /
  \               /
   \             /
    \           /
     \---------/

      /-------\
     /         \
    /           \
   /             \
  /               \
 /                 \
 |                 |
 |                 |
 |                 |
 |                 |
 \                 /
  \               /
   \             /
    \           /
     \         /
      \-------/

       /-----\
      /       \
     /         \
    /           \
   /             \
  /               \
 /                 \
 |                 |
 |                 |
 \                 /
  \               /
   \             /
    \           /
     \         /
      \       /
       \-----/

        /---\
       /     \
      /       \
     /         \
    /           \
   /             \
  /               \
 /                 \
 \                 /
  \               /
   \             /
    \           /
     \         /
      \       /
       \     /
        \---/

         /-\
        /   \
       /     \
      /       \
     /         \
    /           \
   /             \
  /               \
  \               /
   \             /
    \           /
     \         /
      \       /
       \     /
        \   /
         \-/

          ^
         / \
        /   \
       /     \
      /       \
     /         \
    /           \
   /             \
   \             /
    \           /
     \         /
      \       /
       \     /
        \   /
         \ /
          V

          ^
         / \
        /   \
       /     \
      /       \
     /         \
    /           \
    \           /
     \         /
      \       /
       \     /
        \   /
         \ /
          V

          ^
         / \
        /   \
       /     \
      /       \
     /         \
     \         /
      \       /
       \     /
        \   /
         \ /
          V

          ^
         / \
        /   \
       /     \
      /       \
      \       /
       \     /
        \   /
         \ /
          V

          ^
         / \
        /   \
       /     \
       \     /
        \   /
         \ /
          V

          ^
         / \
        /   \
        \   /
         \ /
          V

          ^
         / \
         \ /
          V

          ^
          V

채점

이것은 이므로 바이트 수가 가장 적은 프로그램이 승리합니다!

표준 허점 은 허용되지 않습니다.


1
"\x20\x20\x20\x20\x20\x20/\\\n/-\\\x20\x20/\x20\x20\\-\\\n|\x20\x20\\/\x20\x20\x20\x20\x20|\n\\---------/\n"
tsh

나는 규칙이 의미가 있다고 생각하지 않습니다. 바위가 45도 회전하면 바위가 다르게 침식됩니다. 그러나 어쨌든.
user202729

레티 나는 제 생각에 정말 잘 작동 할 것입니다.
Jerry Jeremiah

답변:


1

나는 잠시 후에 이것을 포기했다. 지침 종류는 모호해 보인다. 그러나 나는 약간 축소 된 바위를 얻었습니다 (출력 참조). 또한 여기에서 시도한 것처럼 1 차원 문자열이 아닌 2 차원 공간 에서이 작업을 수행해야한다고 확신합니다. 내 주요 "문제"는 공간을 바위의 '내부'또는 '외부'로 표시하여 주어진 입력을 변환한다는 것입니다. 불행히도이 시점에서 내부와 위 / 아래 가장자리를 구분할 수 없습니다.

enum State {
 OutsideLeft,CrossLI,Inside,CrossRI,OutsideRight,
}    

const INPUT: &str = r#"
/----\
|     \------\
|            |
|            |
\------------/
"#;


fn precycle( mut data:Vec<char> ) -> Vec<char> {
    let mut state = State::OutsideLeft;
    let mut curcol = 0;
    let mut curline:Vec<char> = Vec::new();
    let mut lastline:Vec<char> = Vec::new();
    for mut i in 0..data.len() {
        if data[i]=='\n' { 
            lastline = curline.to_vec();
            lastline.push(' ');
            curline.clear();
            curline.push(' ');
            curcol = 0;
        } else {
            curline.push(data[i]);
            curcol += 1;
        }
        let n = curcol%lastline.len();
        let n2 = lastline.len()-n;
        //println!("[{}]",lastline.iter().collect::<String>());
        //println!("[{}]",curline.iter().collect::<String>());
        //println!("({}{})({}{})>",data[i],state,lastline[n],curline[n]);
        //print!("{}{}>",data[i],state);
        match state {
        State::OutsideLeft  =>  {
            if      data[i]=='/' { state = State::CrossLI; }
            else if data[i]=='\\' { state = State::CrossLI; }
            else if data[i]=='|' { state = State::CrossLI; }
            else if data[i]=='<' { state = State::CrossLI; }
            if      data[i]==' ' { }
        } State::CrossLI => {
            if      data[i]=='/' { state = State::CrossRI; }
            else if data[i]=='\\' { state = State::CrossRI; }
            else if data[i]=='|' { state = State::CrossRI; }
            else if data[i]=='>' { state = State::CrossRI; }
            if data[i]==' ' { data[i]='-'; }
            if data[i]=='-' { state = State::Inside; }
        } State::Inside => {
            if      data[i]=='/' { state = State::CrossRI; }
            else if data[i]=='\\' { state = State::CrossRI; }
            else if data[i]=='|' { state = State::CrossRI; }
            else if data[i]=='>' { state = State::CrossRI; }
            if      data[i]==' ' { data[i] = '-'; }
        } State::CrossRI => {
            if  data[i]==' ' { state = State::OutsideRight; }
            if  data[i]=='\n' { state = State::OutsideLeft; }
        } State::OutsideRight => {
            if  data[i]==' ' { }
            if  data[i]=='\n' { state = State::OutsideLeft; }
        } } 
        match state {
        State::CrossLI => {
            if curline[n]=='|' && lastline[n]=='.' { data[i]='9'; curline[n]='9'; }
        }
        State::CrossRI => {
            if curline[n]=='|' && lastline[n]=='.' { data[i]='8'; curline[n]='8'; }
            if curline[n]=='.' && lastline[n]=='8' { data[i-n-n2+1]='>'; }
            if curline[n]=='.' && lastline[n]=='|' { data[i-n-n2+1]='6'; }
        }
        State::OutsideLeft => {
            if curline[n]=='.' && lastline[n]=='|' { data[i-n-n2+1]='7'; curline[n] = '7'; }
            if curline[n]=='.' && lastline[n]=='9' { data[i-n-n2+1]='<'; }
        }
        _ => { }
        }
        //print!("{} ",state);

    }
    for mut i in 0..data.len() {
        if data[i]=='9' {data[i]='/'}
        if data[i]=='8' {data[i]='\\'}
        if data[i]=='7' {data[i]='\\'}
        if data[i]=='6' {data[i]='/'}
    }
    data
}

fn cycle( data:String ) -> String {
    data
    .replace(r#"^"#,r#"."#)
    .replace(r#"V"#,r#"."#)
    .replace(r#"/-\"#,r#".^."#)
    .replace(r#"\-/"#,r#".V."#)
    .replace(r#"-/\-"#,r#"----"#)
    .replace(r#"-\/-"#,r#"----"#)
    .replace(r#"/\-"#,r#"/--"#)
    .replace(r#"-/\"#,r#"--\"#)
    .replace(r#"\/-"#,r#"\--"#)
    .replace(r#"-\/"#,r#"--/"#)
    .replace(r#"./\."#,r#"...."#)
    .replace(r#".\/."#,r#"...."#)
    .replace(r#"/\"#,r#".."#)
    .replace(r#"\/"#,r#".."#)
    .replace(r#"-\"#,r#"\."#)
    .replace(r#"-/"#,r#"/."#)
    .replace(r#"/-"#,r#"./"#)
    .replace(r#"\-"#,r#".\"#)
    .replace(r#"->"#,r#">."#)
    .replace(r#"<-"#,r#".<"#)
    .replace(r#".-"#,r#"--"#)
    .replace(r#"-."#,r#"--"#)
}

fn main() {
    let mut inputv: Vec<char> = INPUT.chars().collect();
    let mut input0: Vec<char> = inputv;
    for j in 1..18 {
        let mut inputa = precycle( input0 );
        let pdata = inputa.iter().collect::<String>().replace("."," ");
        println!("{}",pdata);
        let mut input2 = cycle( inputa.iter().collect::<String>() );
        input0 = input2.chars().collect();
    }
}

산출

/----\
|-----\------\
|------------|
|------------|
\------------/


 /--\ 
/----\------\ 
|------------\
\------------/
 \----------/ 


  /\  
 /--\------\  
<-----------\ 
 \----------/ 
  \--------/  



  /\------\   
 <---------\  
  \--------/  
   \------/   



   /-----\    
  <-------\   
   \------/   
    \----/    



    /---\     
   <-----\    
    \----/    
     \--/     



     /-\      
    <---\     
     \--/     
      \/      



      ^       
     <-\      
      \/      





     <\       






     <\       






     <\       






     <\       






     <\       






     <\       






     <\       






     <\       






     <\       
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.