랭턴의 개미 ASCII 예술.


22

Langton의 개미 경로를 그 립니다.

기술

평면의 정사각형은 검은 색 또는 흰색으로 다양하게 표시됩니다. 우리는 임의로 하나의 정사각형을 "개미"로 식별합니다. 개미는 걸리는 각 단계에서 4 가지 기본 방향으로 이동할 수 있습니다. 개미는 아래 규칙에 따라 움직입니다.

  • 흰색 사각형에서 오른쪽으로 90 ° 회전하고 사각형의 색을 뒤집어 한 단위 앞으로 이동
  • 검은 사각형에서 왼쪽으로 90 ° 회전하고 사각형의 색을 뒤집어 한 단위 앞으로 이동

명세서

  • 입력 : 0에서 725 사이의 정수 N (포함).
  • 출력 : 단계 N 현재 개미의 "경로"를 나타내는 17 x 17 그리드.

규칙

  • 개미가 오른쪽을 향하기 시작합니다 (3시 방향).
  • 개미는 그리드의 중앙에서 시작합니다.
  • 사용하여 _#@각각 흰색 사각형, 검은 사각형과 개미를 위해.
  • 격자는 처음에 완전히 흰색입니다.
  • 통역 된 언어로 완전한 프로그램이나 기능을 만들 수 있습니다.
  • stdin 또는 인수로 입력합니다.

업데이트 : 케이스의 N = 450 출력이 잘못되었습니다.

N = 0

_________________
_________________
_________________
_________________
_________________
_________________
_________________
_________________
________@________
_________________
_________________
_________________
_________________
_________________
_________________
_________________
_________________

N = 1

_________________
_________________
_________________
_________________
_________________
_________________
_________________
_________________
________#________
________@________
_________________
_________________
_________________
_________________
_________________
_________________
_________________

N = 450

_________________
_________________
___________##____
____##______##___
___#__##___##_#__
__###_#@#__#__#__
__#_#_#_#__#_#___
_____###___#_____
_____#___________
_____#__###______
___#_#_#__#_#_#__
__#__#_#____###__
__#_##__##___#___
___##______##____
____##___________
_________________
_________________

@Joey : yes "프로그램 또는 함수를 완료하십시오. 인수 또는 표준 입력으로 입력하십시오.", freestyle :)
Eelvex

@Joey : 명확하지 않은 경우 죄송합니다 : 통역 된 언어 또는 완전한 프로그램에서 기능을 수행 할 수 있습니다. stdin에서 입력을 받거나 인수로 제공 할 수 있습니다.
Eelvex

@Joey : 1 단계에서 개미가 먼저 우회전 (지금은 북쪽을 향함) 한 다음 진행합니다. 당신은 그것을 고려하고 있습니까?
Eelvex

@Joey : 예, 이전 의견에서 남쪽 을 의미 했고 당신은 맞습니다. 마지막 예제는 다른 N :-/에 대한 것입니다 (예제 섹션 업데이트).
Eelvex

답변:


10

GolfScript-67 자

~17.'_'*n+*\153:|;{|/()[124^.2/6+:6.1&17*)\2&(*|+:|;]@++}*|/();'@'@

hallvabo의 Python 솔루션은 이것과 가장 유사하므로 주요 차이점 만 설명하겠습니다.

보드는 배열 대신 문자열로 저장됩니다. 따라서 문자열이 항상 평평하므로 적은 문자로 보드의 값을 업데이트 할 수 있으므로 원하는 출력 형식으로 쉽게 가져올 수 있습니다.

개미 위치는 공식 ((d&1)*17+1)*((d&2)-1)(즉 .1&17*)\2&(*)으로 증가합니다. 여기서 d는 방향입니다. 6초기화를 건너 뛸 수 있도록 변수를 사용합니다 .


1
Awww, 이제 GolfScript noob과 같은 느낌이 듭니다.
aaaaaaaaaaaa

:6-소식통 나는 :-) 코드를 디버깅 싫어
존 드보락에게

9

루비 1.9, 104 자

f=->z{l=[*[r=1]*17,2]*17;c=152;z.times{c+=r=(r*r>1?r/18:-r*18)*l[c]*=-1};l[c]=0;l.map{|a|putc"@_
#"[a]}}

함수 인수를 통한 입력

  • (146-> 142) 인라인 m
  • (142-> 140) r*r>1대신 확인r.abs>1
  • (142-> 128) String#scan출력을 생성하는 데 사용 합니다. 변경된 ==>
  • (128-> 125) 사용되지 않는 변수 제거
  • (125-> 122) String#tr조건부로 교체
  • (122-> 122) 이제 업데이트 된 예제와 동일한 출력을 생성합니다.
  • (122-> 111) 개미 경로를 생성 할 때 문자 대신 정수를 사용하십시오.
  • (111-> 109) 괄호를 저장하기 위해 일부 표현식의 순서를 변경하십시오
  • (109-> 108) 코드는 이제 함수입니다
  • (108-> 104) 모든 문자를 개별적으로 인쇄

기능 허용됩니다.
Eelvex

@ Elvex : 함수가 문자열을 반환해야합니까, 아니면 출력해야합니까?
Ventero

산출.
Eelvex

6

파이썬, 123

n = 입력 ()
d = x = 152
g = (17 * [95] + [10]) * 17
n : d + = g [x] / 2; g [x] ^ = 124; x + = (1, -18, -1,18) [d % 4]; n- = 1
g [x] = 64
print "% c"* 306 % tuple (g)

http://golf.shinh.org/p.rb?Langtons+Ant 에서 Python 솔루션을 약간만 다시 작업하십시오. .


5

GolfScript 96 94 89

내가 가장 좋아하는 증오 언어는 다시 읽을 수있는 여러 가지 반-일치 분류 바이트 코드로 돌아 왔습니다.

89 버전에서는 마침내 @을 출력 루프에 통합했습니다.

~289[0:c]*145:b;{.b>\b<)!..c++(4%:c[1 17-1-17]=b+:b;@++}@*{{(b(:b!.++'_#@@'1/=\}17*n\}17*

94 버전 :

~306[0:c]*152:b;{.b<\b>(!..c++(4%:c[1 18-1-18]=b+:b;\++}@*{{('_#'1/=\}17*(;n\}17*].b<\b>(;'@'\

댓글 :

               #Initialization.
~                  #Parse input.
306[0:c]*          #Make array of 306 0s, set c to 0 in the middle of that operation.
152:b;             #Set b to 152, remove 152 from the stack.
                   #b is a value for the ant's position, c for its rotation.

               #Run the algorithm.
{                  #Start of block.
    .b<\b>(        #Split the array at index b into before, after and value at b.
    !..            #Not the value and make 2 copies of it.
    c++            #Add the 2 copies to c.
    (4%:c          #Subtract 1, modulus by 4 and save the result to c.
    [1 18-1-18]=   #Define an array and take element number c.
    b+:b;          #Add b to the value, save result to b, remove result from stack.
    \++            #Reform the array.
}@*                #Switch the input to the top of the stack and run the block input times.

               #Convert array of 1s and 0s to the correct characters.
{                  #Start of block.
    {              #Start of block.
        ('_#'1/=   #Take the first array element, convert it to either '_' or '#'.
        \          #Switch the array to the top of the stack.
    }17*           #Execute block 17 times.
    (;n\           #Discard the 18th element of the line, write a lineshift.
}17*               #Execute block 17 times.

               #Insert the @.
]                  #Put everything in an array.
.b<\b>(            #Split the array at index b into before, after and value at b.
;'@'\              #Ditch the value at b, write a @ and shift it into place.

편집, 큰 버전을 만들 수도 있습니다. 여기서 59 * 59 및 10500 반복이 진행됩니다.

~59:a.*[0:c]*1741:b;{.b>\b<)!..c++(4%:c[1 a-1-59]=b+:b;@++}@*{{(b(:b!.++'_#@@'1/=\}a*n\}a*

.

___________________________________________________________
___________________________________________________________
_________________________##__##____________________________
________________________#__@_###___________________________
_______________________###__#_#_#__________________________
_______________________#####_#__##_________________________
________________________#___##_##_#________________________
_________________________###___#__##_______________________
__________________________#___##_##_#______________________
___________________________###___#__##_____________________
____________________________#___##_##_#__##________________
_____________________________###___#__##__##_______________
______________________________#___##_##__##___#____________
________________________####___###___#___#__###____________
_______________________#____#___#___##_####___#____________
______________________###____#___#_#______#_##_#___________
______________________###____#_##_____#_##__#_##___________
_______________________#____#___##_#_#_____##______________
_______________________#_#______#_#####__#___#_____________
______________________#___#####__________##_######_________
______________________###__##__#_##_#_#_#___##_#_##________
____________________##__#_#######_#___#__###____##_#_______
___________________#__#__######_##___#__#_##___#___#_______
__________________#____#_#_##_#__######_#######___#________
__________________#_####_##_#_####____##__##_#_##_#________
___________________#____####___#__#_######_##____###_______
______________________#___#_##_#_###_#__##__##___###_______
_________________________#######____#__##_##_#_____#_______
_________________####__##_##__####_##_##_##__#_____#_______
________________#____#_#___###_##_###____#_####____#_______
_______________###_______###_#_#_#####____#_#______#_______
_______________#_#___###_####_##_#___##_###_##_____#_______
_____________________##_##__####____####_#_#_#_____#_______
________________#____#__##___###__###_____###______#_______
________________##___##_###_####__#______###___##__#_______
________________##_#_####_____#___#__#_##_###_##___#_______
_______________####_##___##_####__#_#__#__#__###___#_______
_______________#_##_###__#_#_##_#_#_____#_#_____#_#________
___________________#_#__#____##_##__#_#__###_##____________
___________________##_#____#__#####_#____#____#__#_#_______
__________________#_##_#__#____##_##_#__###______###_______
________________#_#___#__#__#__#__###___##__##____#________
_______________###_#_#####_######_###_#######_#_##_________
_______________#_#_#____#####___##__#####_#####____________
_________________#__##___#______#__#_##__###_###___________
______________####___#####_#########___#_#_________________
_________##____#__#_____###_#_#___#_###__###_______________
________#__#__####_##___###_##___###_##_____##_____________
_______###____#_##_#_#####___#____#__#__##_###_____________
_______#_#####_#_#___##__##_____#____#___#__#______________
___________######_####__##_#___#__##__#_#_##_______________
_________##______#_###_##__####___#___###__________________
__________#__#_#####__#___#_##___#__#__#___________________
__________##_###_#######_____#_____#_##____________________
_________#_#__##_##______#___##____#_______________________
________#__#_####________###__##__#________________________
________#_##_###____________##__##_________________________
_________##________________________________________________
__________##_______________________________________________

5

Windows PowerShell을, 119 (118)

for($p,$n,$g=144,+"$args"+,1*289;$n--){$d+=$g[$p]*=-1
$p+='B0@R'[$d%4]-65}$g[$p]=0
-join'@_#'[$g]-replace'.{17}',"$&
"

4

PHP, 350 309 307 312 174 161 166 159 151 149 147 144 143

<?$p=144;while($i=$argv[1]--){$g[$p]=$a=2-$g[$p];$d+=--$a;$p+=(1-($d&2))*(1+16*($d&1));}while($i++<288)echo$i%17?$i!=$p?$g[$i]?"#": _:"@":"\n";

언 골프

$p = 144; // Set initial pointer

while($i = $argv[1]--){ // Ends at -1
    $g[$p] = $a = 2 - $g[$p]; // Either returns true (2) or false(0)

    $d += --$a; // Adds 1 (2-1) or removes 1 (0-1) from the direction

    $p += (1 - ($d & 2)) * (1 + 16 * ($d & 1));
}

while($i++ < 288)
    echo $i % 17? $i != $p? $g[$i]? "#" : @_ : "@" : "\n"; // Prints the correct character

350-> 309 : for () 루프를 사용한 다양한 압축 기술도 올바른 출력을 표시하도록 업데이트되었습니다.
309-> 307 : 기본 for () 루프를 while () 루프로 변환했습니다.
307-> 312 : argv를 사용하도록 변경하지 않았습니다. 312-
> 174 : 다른 답변을 기반으로 레코딩되었습니다.
174-> 161 : 더 이상 전체 배열을 기본값으로 설정하지 않습니다. 161-
> 166 : Argv가 다시 이깁니다.
166-> 159 : argv [1]을 재정의 할 필요가 없습니다.
159-> 151 : 더 이상 기본값을 지정하지 않고 PHP가 자동으로 수행합니다.
151-> 149 : 괄호 세트를 제거했습니다. 작업 순서가 필요하지 않습니다.
149-> 147 : 마지막 for () 루프가 짧아 져 중괄호가 필요하지 않습니다.
147-> 144 :마지막 for () 루프는 이제 while () 루프입니다.
144-> 143 : 임시 변수를 사용하여 문자를 저장했습니다.


내 그리드 및 방향 트릭을 사용하고 코드에서 138 문자가 제거되었음을 알았습니다.
PatrickvL

4

C, 166 162

여기 델파이 접근 방식을 C로 변환하여 C가 얼마나 컴팩트 할 수 있는지 보여줍니다. fR0DDY에서 조건부 줄 바꿈을 빌 렸습니다 (감사합니다!) :

g[289]={0},a=144,d,i,N;main(){scanf("%d",&N);while(N--)g[a]=2-g[a],d+=g[a]-1,a+=(1-(d&2))*(1+d%2*16);for(g[a]=1;i<289;)printf("%s%c",i++%17?"":"\n","_@#"[g[i]]);}

들여 쓴 주석 처리 된 버전은 다음과 같습니다.

g[289]={0}, // g: The grid is initially completely white. (size=17*17=289)
a=144, // a: Ant position starts at the center of the grid (=8*17+8=144)
d, // Assume 0=d: Ant start 'd'irection faces right (=0, see below)
i,
N;
main(){
  scanf("%d",&N);
  while(N--)
    // Flip the color of the square:
    g[a]=2-g[a],
    // Turn 90° right if at an '_' space, 90° left otherwise :
    d+=g[a]-1,
    // Move one unit forward;
    //   For this, determine the step size, using the two least significant bits of d.
    //   This gives the following relation :
    //     00 = 0 =  90° = right =   1
    //     01 = 1 = 180° = down  =  17
    //     10 = 2 = 270° = left  = - 1
    //     11 = 3 =   0° = up    = -17
    //   (d and 2) gives 0 or 2, translate that to 1 or -1
    //   (d and 1) gives 0 or 1, translate that to 1 or 17
    //   Multiply the two to get an offset 1, 17, -1 or -17 :
    a+=(1-(d&2))*(1+d%2*16);
  // Place the ant and print the grid :
  for(g[a]=1;i<289;)
    printf("%s%c",i++%17?"":"\n","_@#"[g[i]]); // 0 > '_', 1='@', 2 > '#'
}

+1. 나는 트릭을 좋아 "_@#"[g[i]]하고a+=(1-(d&2))*(1+(16*(d&1)))
fR0DDY

(1+d%2*16)몇 문자를 저장합니다.
Nabb

@Nabb : 사실, 그 제안에 감사드립니다.
PatrickvL

4

델파이, 217

var g,a:PByte;i,d,Word;begin g:=AllocMem(306);a:=g+153;Read(i);for n:=1to i do begin a^:=2-a^;d:=d-1+a^;a:=a+(1-2and d)*(1+17*(1and d))end;a^:=1;for n:=1to 306do if n mod 18=0then WriteLn else Write('_@#'[1+g[n]])end.

들여 쓰기 및 주석 처리 된 코드는 다음과 같습니다.

var
  g,a:PByte;
  i,d,n:Int32;
begin
  g:=AllocMem(306); // g: The grid is initially completely white. (size=18*17=306)
  // Assume 0=d: Ant start 'd'irection faces right (=0, see below)
  a:=g+153; // a: Ant position starts at the center of the grid (=8*18+9=153)
  Read(i);
  for n:=1to i do
  begin
    // Flip the color of the square;
    a^:=2-a^;
    // Turn 90° right if at an '_' space, 90° left otherwise;
    d:=d-1+a^;
    // Move one unit forward;
    //   For this, determine the step size, using the two least significant bits of d.
    //   This gives the following relation :
    //     00 = 0 =  90° = right =   1
    //     01 = 1 = 180° = down  =  18
    //     10 = 2 = 270° = left  = - 1
    //     11 = 3 =   0° = up    = -18
    //   (d and 2) gives 0 or 2, translate that to 1 or -1
    //   (d and 1) gives 0 or 1, translate that to 1 or 18
    //   Multiply the two to get an offset 1, 18, -1 or -18 :
    a:=a+(1-2and d)*(1+17*(1and d))
  end;
  // Place the ant and print the grid :
  a^:=1; // 0 > '_', 1='@', 2 > '#'
  for i:=1to 306do
    if i mod 18=0then // we insert & abuse column 0 for newlines only (saves a begin+end pair)
      WriteLn
    else
      Write('_@#'[1+g[i]])
end.

입력:

450

출력 :

_________________
_________________
___________##____
____##______##___
___#__##___##_#__
__###_#@#__#__#__
__#_#_#_#__#_#___
_____###___#_____
_____#___________
_____#__###______
___#_#_#__#_#_#__
__#__#_#____###__
__#_##__##___#___
___##______##____
____##___________
_________________
_________________

@ 패트릭 : 예제가 잘못되었습니다. 업데이트를 확인하십시오. (단계 451을 출력 한 것 같습니다 :)).
Eelvex

@ Elvex : 감사합니다. 나는 4 문자의 비용으로 사건 'N = 0'을 고쳤습니다. 이제 다시 다시 이겨야합니다! ;-)
PatrickvL

@Eelvex : PS : 3 시간 전에 오류를 발견 한 것에 대해 +1이 아닙니다. ;)
PatrickvL

@ 패트릭 : 나는 <200을 기다리고 있었지만 괜찮아요 ... :)
Eelvex

@Eelvex : LOL, 도착 ... (아래로 238 개)
PatrickvL

3

C 195 자

x=144,T,p=1,i,N[289]={0},a[]={-17,1,17,-1};c(t){p=(p+t+4)%4;x+=a[p];}main(){scanf("%d",&T);while(T--)N[x]=(N[x]+1)%2,c(N[x]?1:-1);for(;i<289;i++)printf("%s%c",i%17?"":"\n",i-x?N[i]?'#':'_':'@');}

http://www.ideone.com/Dw3xW

나는 이것을 725에 얻습니다.

_________________
_________________
___________##____
____##______##___
___#___##__##_#__
__###____#_#__#__
__#_#_#__#_#_#___
______###____#__@
_______###__#__#_
_____#_#____#___#
___#_#_#_##____#_
__#__#_#_#_#_###_
__#_##_#_____####
___##_#____#_####
____###___####_#_
_______#__#__##__
________####_____

p+=t+4;x+=a[p%4];대신에를 사용 p=(p+t+4)%4;x+=a[p];하면 세 문자 가 저장됩니다.
Joey

3

sed, 481 자

#n
1{s/.*/_________________/;h;H;H;H;G;G;G;G;s/^\(.\{152\}\)_/\1@/;s/$/;r/;ta;};x;:a;/;r/br;/;d/bd;/;l/bl;/;u/bu;:w;y/rdlu/dlur/;bz;:b;y/rdlu/urdl/;bz;:r;s/@\(.\{17\}\)_/#\1@/;tw;s/@\(.\{17\}\)#/#\1!/;tw;s/_\(.\{17\}\)!/@\1_/;tb;s/#\(.\{17\}\)!/!\1_/;tb;:d;s/_@/@#/;tw;s/#@/!#/;tw;s/!_/_@/;tb;s/!#/_!/;tb;:l;s/_\(.\{17\}\)@/@\1#/;tw;s/#\(.\{17\}\)@/!\1#/;tw;s/!\(.\{17\}\)_/_\1@/;tb;s/!\(.\{17\}\)#/_\1!/;tb;:u;s/@_/#@/;tw;s/@#/#!/;tw;s/_!/@_/;tb;s/#!/!_/;tb;:z;h;${s/!/@/;s/;.//p}

첫 줄을 제거하고 다음을 실행하여 478 자로 줄일 수 있습니다. -n

입력을 위해 N 라인이 필요합니다 (예 : 로 실행될 때

seq 450 | sed -f ant.sed

출력 :

_________________
_________________
___________##____
____##______##___
___#__##___##_#__
__###_#@#__#__#__
__#_#_#_#__#_#___
_____###___#_____
_____#___________
_____#__###______
___#_#_#__#_#_#__
__#__#_#____###__
__#_##__##___#___
___##______##____
____##___________
_________________
_________________

3

펄, 110 자

$p=144;$p+=(1,-17,-1,17)[($d+=($f[$p]^=2)+1)%4]for 1..<>;$f[$p]=1;print$_%17?'':$/,qw(_ @ #)[$f[$_]]for 0..288

STDIN의 첫 번째 행에서 숫자를 읽습니다. 나머지 입력은 무시됩니다.

약간 더 읽기 쉽다 :

$p=144;
$p += (1,-17,-1,17)[($d+=($f[$p]^=2)+1) % 4] for 1..<>;
$f[$p]=1;
print $_%17 ? '' : $/, qw(_ @ #)[$f[$_]] for 0..288

편집

  • (112 → 111)$d 모듈로 -4 값 으로 업데이트 할 필요가 없습니다 .

  • (111 → 110) 이제 $d증가분을 인라인 할 수 있습니다

부록 (109 자)

만약 당신이 특별한 N=0실패의 경우를 원한다면 ( @한 개미에 대한 문자를 출력하지 않습니다) 우리는 그것을 한 글자 더 짧게 만들 수 있습니다 . 다른 모든 입력은 올바르게 작동합니다.

$p+=(1,-17,-1,17)[($d+=($f{$p+0}^=2)+1)%4]for 1..<>;$f{$p}=1;print$_%17-9?'':$/,qw(_ @ #)[$f{$_}]for-144..144

차이점은 이제 우리가 %f대신에 사용 @f하므로 음수를 사용할 수 있고 -144..144대신 에서 반복 한다는 것입니다 0..288. 초기화 시간이 절약됩니다 $p.


1

매스 매 티카, 94 문자

a@_=d=1;a@Nest[#+(d*=(a@#*=-1)I)&,9-9I,Input[]]=0;Grid@Array["@"[_,"#"][[a[#2-# I]]]&,17{1,1}]

1

> <>, 122 바이트

작은 스레드 괴사의 위험에 처해, 나는 <<>에 대한 답변을 작성하는 것이 흥미로운 도전이라고 생각했습니다 ...

1&f8r\
1-:?!\r:@@:@$:@@:@g:2*1+&+4%:&}1$-@p{:3$-5gaa*-$@+@5gaa*-+r
2}p70\~
a7+=?\:@@:@g4+5go$1+:
o053.>~1+:64*=?;a
dedc_#@

이 프로그램은 실행하기 전에 스택에 계산할 단계 수가 스택에있을 것으로 예상합니다.

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