Quine chuyển


10

Trong biến thể quine này, chương trình của bạn phải xuất mã nguồn được hoán chuyển qua đường chéo từ trên cùng bên trái xuống dưới cùng bên phải. Ví dụ:

chương trình của bạn
trên
bốn dòng

đầu ra

 yof
 ono
 u u
 r r
    
 p l
 r i
 o n
 g e
 r s
 a
 m

Khoảng trắng trong đầu ra không phải là tùy ý. Không gian xuất hiện trong hai tình huống: trong đó có một khoảng trắng trong bản gốc (ví dụ: giữa rltrong cột thứ tư) và ở đó cần phải đệm các ký tự (ví dụ: tất cả các khoảng trắng trong cột đầu tiên.) Cả hai đều được yêu cầu và không gian có thể xuất hiện ở bất cứ đâu khác trong đầu ra.

Một dòng mới duy nhất trong đầu ra có thể tùy ý bỏ qua. Trailing newlines trong mã nguồn không ảnh hưởng đến đầu ra và các dòng mới hàng đầu trong mã nguồn phải được xử lý như trong ví dụ trên. Giả sử rằng mỗi ký tự không phải là một dòng mới đều rộng một cột và cao một hàng, mặc dù đối với các ký tự như tab, điều này có thể dẫn đến một đầu ra xấu xí.

Giải pháp của bạn phải có ít nhất hai dòng với ít nhất hai ký tự không phải dòng mới, và không được chuyển vị riêng (đầu ra không thể trùng với nguồn.)

Các mánh gian lận đọc từ tệp chứa mã nguồn của chúng, lấy dữ liệu từ một URL, sử dụng các hàm dựng sẵn, v.v. không được phép.

Đây là mã golf: mã ngắn nhất tính bằng byte thắng.


Điều này có cần phải là một quine thực sự?
lirtosiast

2
@ThomasKwa Trái ngược với?
Martin Ender

@ MartinBüttner Có lẽ có một ngôn ngữ mà chữ nghĩa được lặp lại. Chỉ trong trường hợp.
lirtosiast

@ThomasKwa Điều đó tốt miễn là tuân theo tất cả các quy tắc được chỉ định.
Luke

Việc sử dụng các thư viện bên ngoài (như Lodash trong Javascript) có bị cấm không?
Mama Fun Roll

Câu trả lời:


5

CJam, 14 byte

{`"_~".+N*}
_~

Kiểm tra nó ở đây.

Trong khi ngắn hơn, có lẽ ít thú vị hơn một chút so với giải pháp Phân hạch.

Giải trình

{       e# Quine framework. Runs the block while another copy of it is on the stack.
  `     e# Stringify the block.
  "_~"  e# Push the remaining code as a string.
  .+    e# Element-wise append... essentially puts the two strings in a grid and 
        e# transposes it.
  N*    e# Join with linefeeds.
}_~

10

Phân hạch , 17 byte

Vẫn là ngôn ngữ yêu thích của tôi dành cho ...

'"
!0
0+
;!
DN
"!

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

Giải trình

Điều này khá giống với quine phân hạch cơ bản . Trong thực tế, nếu không phải là quy tắc "phải có ít nhất hai dòng với ít nhất hai ký tự không phải dòng mới mỗi", tôi chỉ đơn giản có thể hoán đổi điều đó và thay thế Rbằng D. Quy tắc đó làm cho mọi thứ thú vị hơn một chút, bởi vì chúng ta cần in một dòng khác.

Kiểm soát dòng chảy bắt đầu tại Dvới một nguyên tử duy nhất đi về phía nam. Vì nó chạm vào "nên nó sẽ quấn quanh và in

'!0;D

với STDOUT, tương tự như trong quine bình thường. '!sau đó đặt khối lượng của nguyên tử thành mã ký tự của !. Đây 0là một dịch chuyển tức thời vận chuyển nguyên tử đến cột thứ hai, nơi nó vẫn di chuyển về phía nam.

Với việc +chúng ta tăng khối lượng của nguyên tử lên giá trị của ". !N!báo giá in, linefeed, quote. Bây giờ trông như thế này:

'!0;D"
"

Sau khi quấn quanh, nguyên tử va vào một cái khác "và bây giờ in nguyên văn dòng thứ hai:

'!0;D"
"0+!N!

Bây giờ chúng ta đã xong. Nguyên tử sử dụng dịch chuyển tức thời một lần nữa và rơi vào ;nơi phá hủy nó và do đó chấm dứt chương trình.

Tôi cho rằng bit gọn gàng nhất ở đây là đặt một cái "ở dưới cùng và cái kia ở trên cùng để tôi có thể in chúng trong một lần mà không phải đặt giá trị của !một lần nữa (vì nó sẽ bị ghi đè bằng cách vào lại chế độ chuỗi).


3

Javascript ES6, 90 byte

$=_=>[...(_=`$=${$};$()`.split`
`)[0]].map((x,y)=>_.map(v=>[...
v][y]).join``).join`
`;$()

Không tệ không tệ.

Giải trình

Đây là khung quine tiêu chuẩn:

$=_=>`$=${$};$()`;$()

Để sửa đổi, tôi chỉ cần tách chuỗi quine dọc theo dòng mới và ký tự để tạo ma trận ký tự, hoán vị bằng cách sử dụng 2 hàm ánh xạ và nối để tạo đầu ra.



2

Befunge-93 , 57 byte

^
_^
,@
+,
5*
52
,+
*9
28
+|
9
8#
|!
 ,
##
!:
,^
#
:
^
""

Điều này hoạt động bằng cách đặt từng ký tự vào cột đầu tiên trên ngăn xếp (ngoại trừ chính trích dẫn), sau đó in từng mục ra khỏi ngăn xếp. Sau đó, nó in trích dẫn, in một dòng mới, và sau đó chuyển sang cột thứ hai. Nó làm điều tương tự sans in một dòng mới.

Bạn có thể kiểm tra nó trong liên kết trong tiêu đề, nhưng bạn sẽ cần phải sao chép-dán mã vào cửa sổ. Nếu bạn nhấn nút 'chậm', nó sẽ hiển thị cho bạn đường dẫn con trỏ đi và ngăn xếp tại thời điểm đó.


Có thể ngắn hơn để di chuyển trích dẫn trong cột thứ hai lên đầu như tôi đã làm trong câu trả lời Phân hạch của mình không?
Martin Ender

Tôi có thể di chuyển trích dẫn lên trên cùng và sắp xếp lại cột thứ hai và nó vẫn hoạt động, nhưng cuối cùng nó vẫn là 57 byte vì cột đầu tiên vẫn phải có cùng chiều cao
Kevin W.

Hừm, tôi đoán nó có thể cho phép bạn tạo "một lần duy nhất, để bạn có thể chuyển một số mã từ cột đầu tiên sang cột thứ hai.
Martin Ender

1

Python 2, 91 75 69 byte

s='#%r;print"s#\\n="+"\\n".join(s%%s)';print"s#\n="+"\n".join(s%s)
##

Dùng thử trực tuyến

Giải trình:

Điều này sử dụng một sửa đổi của quine tiêu chuẩn:

s='s=%r;print s%%s';print s%s

Sau khi sửa đổi:

s='s=%r;print"\\n".join(s%%s)';print"\n".join(s%s)

Điều này là đủ nếu một dòng duy nhất được cho phép. Sau đó, tôi đã thêm hai ký tự vào dòng thứ 2 để đáp ứng yêu cầu đó. Các #ký tự trên dòng thứ hai có thể được thay thế bằng bất cứ thứ gì, miễn là bạn cũng thay đổi chúng trong dòng đầu tiên, và nó làm cho chương trình có hiệu lực về mặt cú pháp.

Để in chính xác bây giờ, tôi phải in #ở cuối hai dòng đầu tiên. Vì vậy, tôi loại bỏ hai ký tự đầu tiên khỏi chuỗi svà in chúng #trước khi in s%s. Tôi đặt một trong những #lúc bắt đầu sđể lưu một số byte bằng cách xóa một dòng chữ mới.

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.