Chúng tôi đã kết thúc nơi chúng tôi bắt đầu!


29

Thử thách:

Đầu vào:

Bạn có hai đầu vào:
- Một chuỗi chỉ chứa ASCII có thể in (không bao gồm dấu cách, tab hoặc dòng mới)
- Một ký tự ASCII có thể in

Đầu ra:

Dòng đầu tiên sẽ chứa đầu vào chuỗi. Mỗi i-modulo-3 lần xuất hiện đầu tiên của nhân vật này sẽ di chuyển theo hướng Đông Nam; mỗi ilần xuất hiện -modulo-3 giây sẽ di chuyển theo hướng Nam; và mỗi ilần xuất hiện thứ ba -modulo-3 sẽ di chuyển theo hướng Tây Nam. Bạn sẽ tiếp tục cho đến khi các ký tự sắp trở lại vị trí bắt đầu ban đầu của họ (điều đó có nghĩa là nó sẽ quấn quanh từ bên này sang bên kia nếu cần thiết), và sau đó bạn sẽ in lại dòng cuối cùng với đầu vào chuỗi một lần nữa để kết thúc nó (Lưu ý rằng tất cả các trường hợp thử nghiệm sẽ kết thúc ở đầu vào ban đầu của chúng sau hầu hết length(input)các hàng, bao gồm cả hàng chứa đầu vào theo dõi. Mặc dù vậy, có thể sớm hơn, như đã thấy trong trường hợp thử nghiệm đầu tiên bên dưới, với độ dài 14, nhưng kết thúc sau 9.)

Tất cả điều này có thể khá mơ hồ, vì vậy đây là một ví dụ:

Trường hợp thử nghiệm 1:

Chuỗi đầu vào: "This_is_a_test"
Ký tự đầu vào:'s'

Đầu ra:

This_is_a_test
    s s    s  
     ss   s   
      s  s    
      sss     
      sss     
      s  s    
     ss   s   
    s s    s  
This_is_a_test

Đây là trường hợp thử nghiệm tương tự với các đường dẫn màu của ba s:

nhập mô tả hình ảnh ở đây

nơi đầu tiên 's'đi theo con đường xanh theo hướng Đông Nam; thứ hai 's'theo con đường màu vàng theo hướng Nam; và thứ ba 's'đi theo con đường màu xanh nhạt theo hướng Tây Nam. (Nếu có một phần tư, 's'nó sẽ đi theo hướng Đông Nam một lần nữa, có thể thấy trong một số trường hợp thử nghiệm khác bên dưới.)

Quy tắc thử thách:

  • Các đầu vào sẽ chỉ chứa ASCII có thể in được (không bao gồm dấu cách, tab và dòng mới)
  • Các định dạng I / O rất linh hoạt. Có thể là một chuỗi phân cách dòng mới, ma trận ký tự, vv Cuộc gọi của bạn.
  • Có thể là ký tự đã cho không có trong chuỗi, trong trường hợp đó, bạn được phép xuất chuỗi đầu vào một hoặc hai lần (nghĩa là "test", 'a'có thể có một trong hai đầu ra này là có thể: "test\ntest"/ "test").
  • Không gian hàng đầu là bắt buộc; dấu cách là tùy chọn. Một hoặc nhiều dòng mới hàng đầu / cuối được cho phép.

Quy tắc chung:

  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.
    Đừng để ngôn ngữ mã-golf ngăn cản bạn đăng câu trả lời với các ngôn ngữ không mã hóa. Cố gắng đưa ra một câu trả lời càng ngắn càng tốt cho ngôn ngữ lập trình 'bất kỳ'.
  • Các quy tắc chuẩn áp dụng cho câu trả lời của bạn, vì vậy bạn được phép sử dụng STDIN / STDOUT, các hàm / phương thức với các tham số thích hợp và kiểu trả về, các chương trình đầy đủ. Cuộc gọi của bạn.
  • Lỗ hổng mặc định bị cấm.
  • Nếu có thể, vui lòng thêm một liên kết với một bài kiểm tra cho mã của bạn.
  • Ngoài ra, xin vui lòng thêm một lời giải thích nếu cần thiết.

Các trường hợp thử nghiệm / ví dụ khác:

Trường hợp thử nghiệm 2:

Chuỗi đầu vào: "abcabcabcabcabc"
Ký tự đầu vào:'b'

Đầu ra:

abcabcabcabcabc
  b b b    b b 
   bbb      bb 
    b        b 
   bbb       bb
b b b b      b 
 b  b  b     b 
b b b   b    b
   bb    b   bb
    b     b  b 
    bb     bbb
    b b    bbb 
    b  b  b  b 
    b   bb   bb
b   b   bb   b 
abcabcabcabcabc

Đây là trường hợp thử nghiệm tương tự với các đường dẫn màu của năm a:

nhập mô tả hình ảnh ở đây

Trường hợp thử nghiệm 3:

Chuỗi đầu vào: "only_two_paths?"
Ký tự đầu vào:'o'

Đầu ra:

only_two_paths?
 o     o       
  o    o       
   o   o       
    o  o       
     o o       
      oo       
       o       
       oo      
       o o     
       o  o    
       o   o   
       o    o  
       o     o 
       o      o
only_two_paths?

Đây là trường hợp thử nghiệm tương tự với các đường dẫn màu của hai o:

nhập mô tả hình ảnh ở đây

Trường hợp thử nghiệm 4:

Nhập chuỗi: "lollollollollol"
Nhập ký tự:'l'

Đầu ra:

lollollollollol
lll   ll  ll   
 ll   ll  ll   
l ll ll ll ll  
  lll l ll l ll
  llllll  ll ll
l l  ll    ll  
 ll  lll   ll  
l l l lll ll l 
  ll  l ll l  l
l l l l llll l 
 ll  lll  lll  
l l   l    ll  
  ll lll  lllll
  l l l ll l ll
lollollollollol

Đây là trường hợp thử nghiệm tương tự với các đường dẫn màu của mười l:

nhập mô tả hình ảnh ở đây

Trường hợp thử nghiệm 5:

Nhập chuỗi: "AbCdEeDcBaAbCdEeDcBa_CCCCC"
Nhập ký tự:'C'

Đầu ra:

AbCdEeDcBaAbCdEeDcBa_CCCCC
C  C        C       C  C  
 C  C       C      C  CCC 
  C  C      C     C  C C C
C  C  C     C    C  C  C  
 C  C  C    C   C  C   C  
  C  C  C   C  C  C    C  
   C  C  C  C C  C     C  
    C  C  C CC  C      C  
     C  C  CC  C       C  
      C  C CC C        C  
       C  C CC         C  
        CC CC C        C  
        CC CC  C       C  
       C  C CC  C      C  
      C  C CC C  C     C  
     C  C   C  C  C    C  
    C  C    CC  C  C   C  
   C  C     C C  C  C  C  
  C  C      C  C  C  C C  
 C  C       C   C  C  CC  
C  C        C    C  C  C  
  C         C     C  C CCC
 C          C      C  CCCC
C           C       C  C  
 C          C        CCCCC
AbCdEeDcBaAbCdEeDcBa_CCCCC

Đây là trường hợp thử nghiệm tương tự với các đường dẫn màu của bảy C:

nhập mô tả hình ảnh ở đây

Trường hợp thử nghiệm 6:

Nhập chuỗi: "XyX"
Nhập ký tự:'X'

Đầu ra:

XyX
 XX
  X
XyX

Đây là trường hợp thử nghiệm tương tự với các đường dẫn màu của hai X:

nhập mô tả hình ảnh ở đây

Trường hợp thử nghiệm 7:

Nhập chuỗi: "aaaa"
Nhập ký tự:'a'

Đầu ra:

aaaa
aa  
aaa 
 aaa
aaaa

Đây là trường hợp thử nghiệm tương tự với các đường dẫn màu của bốn a:

nhập mô tả hình ảnh ở đây


Vậy khi chuỗi chứa bội số của 3 ký tự, đầu ra có thể có ít hàng hơn độ dài của chuỗi?
Neil

@Neil Tôi không chắc đó có phải là bội số của 3 không, đã không điều tra nhiều như vậy. Tất cả những gì tôi biết là hầu hết length(input)mọi thứ khớp lại, nhưng nó có thể sớm hơn khi trường hợp thử nghiệm đầu tiên chứng minh. Nhưng có vẻ như bạn thực sự đúng về bội số của 3 phần (mặc dù tôi không chắc chắn 100%).
Kevin Cruijssen

@Neil bất kỳ chuỗi nào có ký tự chỉ xuất hiện 3 lần liên tiếp sẽ in 3 dòng tuy nhiên nó dài
Asone Tuhid

Các dòng mới có được phép giữa 2 dòng in không?
Asone Tuhid

@AsoneTuhid Xin lỗi nhưng không. Tôi không quan tâm đến bất kỳ số lượng dòng hoặc dẫn dòng mới nào trước hoặc sau toàn bộ đầu ra dự kiến, nhưng tôi sẽ không cho phép ở giữa các dòng. Các đường chéo sẽ không còn chính xác nữa ..
Kevin Cruijssen

Câu trả lời:


1

Stax , 24 byte

»v↕*δó‼Γ█|q┬YM╨|·£↕fßßZo

Chạy và gỡ lỗi trực tuyến

Đây là đại diện ascii của cùng một chương trình.

YxP|Ic{{i3%v-x%%mb-!Czny&PWxP

Nó nhận được các chỉ số của tất cả các nhân vật, và sau đó biến đổi chúng cho đến khi chúng được thiết lập bằng với các chỉ số ban đầu. Đối với mỗi thay đổi, xuất một chuỗi có ký tự tại các chỉ số đó.

Y                               Store character in y.  Now the inputs are x and y.
 xP                             Print x.
   |Ic                          Get all indices of y in x. Make a copy.
      {                   W     Loop until cancelled.
       {        m               Map index array using block.
        i3%v-                   Subtract i%3-1 from each element. i is the loop index.
             x%%                Modulo len(x)
                 b-!            Is the mutated array set-equal to the original?
                    C           If so, cancel W loop
                     zny&P      Print a string with y at all specified indices
                           xP   Finally, print x again

8

Perl 5 , -plF 101 100 99 98 97 96 byte

Thay thế \0bằng một byte 0 bằng chữ để có 96. Lưu ý rằng liên kết Dùng thử trực tuyến có 97 byte vì dường như không thể nhập ký tự 0 bằng chữ ở đó.

#!/usr/bin/perl -plF
say;say$$l=~y/\0/ /runtil--$l,(s:\Q${\<>}:$$l|=v0 x((++$#$l%3*$l-$l+"@-")%@F).$&;v0:oreg^$$l)eq$_

Mã golf perl highlighter nghĩ #bắt đầu một nhận xét. Thật ngây thơ

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

$llà một bộ đếm cho dòng nào sau dòng đầu tiên chúng ta bật (mặc dù nó đếm ngược, vì vậy, ví dụ -3 cho 3 dòng bên dưới chuỗi trên cùng). Sau khi in chuỗi ban đầu sau khi nó lặp đi lặp lại như sau.

Tìm kiếm chuỗi đầu tiên cho các lần xuất hiện của ký tự đích và tính toán tại đó nó sẽ xuất hiện: (++$#$l%3*$l-$l+"@-")%@Fđó là vị trí hiện tại cộng với số dòng (âm) lần -1, 0, 1(theo chu kỳ). Xây dựng một chuỗi với nhiều lần \0theo sau là ký tự đích và chuỗi orđó thành một bộ tích lũy $$l(đó là một bộ tích lũy khác nhau cho mỗi $lvà lý do $lđếm ngược thay vì lên vì $1, $2v.v. chỉ đọc). Simularly $#$lđề cập đến một mảng khác nhau mỗi lần thông qua vòng lặp. Kết quả là $ldòng thứ nhưng \0thay vì khoảng trắng.

Các charcters đích trong chuỗi đầu tiên được thay thế bằng cách \0bạn kết thúc với chuỗi ban đầu có "lỗ" (với \0) tại các vị trí ban đầu của ký tự đích. Nếu bạn xorvới bộ tích lũy, các lỗ sẽ được lấp đầy khi và chỉ khi bộ tích lũy có các ký tự đích ở vị trí ban đầu, do đó, kết quả sẽ là chuỗi gốc. Điều đó được sử dụng để chấm dứt vòng lặp. Nếu vòng lặp chưa kết thúc, hãy in bộ tích lũy \0thay thế bằng khoảng trắng.

Khi vòng lặp kết thúc -ptùy chọn một lần nữa in chuỗi đầu tiên và chương trình được thực hiện.

Nhân vật mục tiêu được chọn theo một cách khá khó khăn. Các ${\<>}cải một dòng đọc từ STDIN đến một tài liệu tham khảo sau đó được ngay lập tức dereferenced và thay thế trong regex. Các \Qtiền tố thoát tất cả các nhân vật mà là đặc biệt trong một regex (như .*). Đây \Elà ngầm. Công cụ osửa đổi làm cho phần tìm kiếm không bao giờ được đánh giá lại mà chỉ được lặp lại trong tất cả các trận đấu tiếp theo (điều này là tốt vì không còn gì trên STDIN nữa).


Tôi không nghĩ rằng bạn có thể đặt một byte null trực tiếp, nhưng bạn có thể chạy nó trong bash hoặc một cái gì đó.
FryAmTheEggman

@FryAmTheEggman Cảm ơn, đó là một cách né tránh tốt đẹp. Nhưng tôi không nghĩ mình sẽ làm phiền. Mọi người sẽ phải tin tưởng tôi rằng nó hoạt động nếu họ không muốn tự mình dùng thử :-)
TonMedel

Hoàn toàn công bằng, nhưng tôi sẽ để lại nhận xét để mọi người có thể thấy nó. Nhân tiện, golf tốt lắm :)
FryAmTheEggman

4

Python 2 , 199 193 191 byte

s,c=input()
print s;l=len(s);r=range;I=j=[i for i in r(l)if s[i]==c]
while 1:
 j=[(j[i]-i%3+1)%l for i in r(len(I))]
 if sorted(j)==I:print s;break
 print''.join((' '+c)[i in j]for i in r(l))

Hãy thử trực tuyến!


Nếu vòng lặp có thể thoát qua ngoại lệ:

Python 2 , 187 byte

s,c=input()
print s;l=len(s);r=range;I=j=[i for i in r(l)if s[i]==c]
while 1:
 j=[(j[i]-i%3+1)%l for i in r(len(I))]
 if sorted(j)==I:print s;q
 print''.join((' '+c)[i in j]for i in r(l))

Hãy thử trực tuyến!


  • -4 byte nhờ Jonathan Frech
  • -2 byte nhờ Lynn

Có thể 189 byte (thoát khỏi vòng lặp thông qua một ngoại lệ).
Jonathan Frech

Bạn có thể thả một cặp parens vào trong (j[i]-i%3+1)%lhai byte.
Lynn

2

C (gcc) , 261 byte

i,j,l,k;g(L,t,r,c)char**L;{L[r++][c]=k;c-=t?t-1?:0:-1;l<r||g(L,t,r,c<0?l-1:c%l);}f(S,K){char*s=S,*L[i=1+(l=strlen(s))];for(k=K;i--;)for(L[i]=calloc(j=l,1);j--;)L[i][j]=32;for(puts(s);s[++i];)s[i]-k||g(L,++j%3,0,i);for(i=1;strcmp(*L,L[i]);)puts(L[i++]);puts(s);}

Hãy thử trực tuyến!


2

JavaScript (Node.js) , 197 194 byte

s=>c=>{(C=console.log)(s);w=0;g=[];while(~(w=s.indexOf(c,w)))g.push(w++);h=(H=_=>g.map(x=>A[x]=c,A=Array(l=s.length).fill` `)&&A.join``)();while(h!=(y=H(g=g.map((x,i)=>(l-~x-i%3)%l))))C(y);C(s)}

Hãy thử trực tuyến!

Đưa đầu vào theo cú pháp currying, tức là f(s)(c) .

Không phải là một cái hoàn hảo, nhưng tôi cần JS. Rất nhiều chức năng trong chức năng.



Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.