Mẫu chương trình để in * bất kỳ * chuỗi


40

Viết chương trình với các thuộc tính sau:

  • Khi chạy nguyên trạng, chương trình không tạo ra đầu ra (tức là 0 byte đầu ra).

  • Có một vị trí trong chương trình (theo lựa chọn của bạn: có thể là ở đầu, cuối hoặc ở đâu đó ở giữa) với thuộc tính sau: sửa đổi chương trình thông qua việc đặt bất kỳ chuỗi nào ở đó sẽ khiến chương trình kết quả in chuỗi đó khi Thực thi.

    Điều này phải hoạt động bất kể chuỗi có chứa dấu ngoặc kép, dấu gạch chéo ngược, dấu nhận xét, dấu phân cách, byte NUL, v.v.; bất kể bạn đặt gì ở đó, chuỗi vẫn được hiểu là một chuỗi và được in hoàn toàn nguyên văn. Tuy nhiên, bạn có thể không xử lý các chuỗi rất dài nếu chúng khiến trình biên dịch hết bộ nhớ hoặc tương tự (chính xác là, bạn ít nhất có thể xử lý các chuỗi dài tới 1000 byte hoặc gấp ba lần độ dài của chương trình của bạn, cái nào dài hơn).

Một ví dụ về một giải pháp không hợp lệ sẽ là

print("");
#      ^ text goes here

trong Python, Perl, Ruby, v.v.; mặc dù nó hoạt động với nhiều chuỗi, nhưng nó sẽ không hoạt động đối với một chuỗi chứa một trích dẫn kép hoặc một chuỗi chứa chuỗi con \n(sẽ được hiểu là một dòng mới).

Lưu ý rằng vấn đề này có lẽ là không thể trong hầu hết các ngôn ngữ; thách thức ít nhất là một phần về việc tìm kiếm một ngôn ngữ nơi nó hoạt động. Ngôn ngữ bạn chọn phải là ngôn ngữ lập trình theo định nghĩa của trang này , ví dụ: không gửi giải pháp trong Văn bản .

Vì đây là , mẫu chương trình ngắn nhất sẽ thắng. Tuy nhiên, đừng nản lòng khi gửi giải pháp ngay cả khi họ không thể đánh bại người chiến thắng hiện tại! Bạn vẫn có thể cạnh tranh cho vị trí thứ hai, thứ ba, v.v., hoặc đơn giản là tìm ra càng nhiều câu trả lời ở nơi nó hoạt động càng tốt. Tuy nhiên, bạn nên đảm bảo rằng chương trình của bạn đáp ứng toàn bộ thông số kỹ thuật trước khi gửi nó; giải pháp gần đúng sẽ bỏ lỡ điểm của vấn đề.


Bài viết Sandbox có liên quan ở đây .

Bạn có thể làm rõ phạm vi các ký tự chúng ta cần hỗ trợ cho chuỗi được chèn không? ASCII? ASCII + không thể in được? Tất cả các unicode?
DJMcMayhem

3
Tất cả 256 octet. Cho dù bạn diễn giải chúng dưới dạng byte hay Unicode là tùy thuộc vào bạn; Nó sẽ không tạo ra nhiều khác biệt khi nó được in.

1
Mục đích của câu hỏi (và cách mà câu hỏi hiện tại) là bạn không thể có bất kỳ đầu ra bổ sung nào. Bạn đã có một giải pháp trong tâm trí mà không thể thích nghi để tránh nó? (Sử dụng thêm byte để tránh đầu ra đi lạc tốt hơn là tạo đầu ra đi lạc và không tuân thủ thông số kỹ thuật.)

1
Nếu điều này không yêu cầu thay đổi mã, thì nó sẽ không quan trọng AWK, chỉ cần 1làm điều đó.
Robert Benson

Câu trả lời:


37

Excel, 1 byte

'

Phiên bản ung dung

'        <-- print the following text,
             and exit the current formula

Tôi không nghĩ rằng điều này có thể chấp nhận dòng mới.
Conor O'Brien

3
@ ConorO'Brien làm điều đó với shift + enter
Adam

2
@MrPaulch Đây là khá nhiều kỹ thuật retro. Tôi khá chắc chắn rằng lệnh này ẩn một số chức năng chưa biết khác, như làm sập hệ thống.
Adam

1
Điều này cũng hoạt động trên OpenOffice Calc. Nó được sử dụng tự động khi bạn đặt một ô thành định dạng @.
Ismael Miguel

1
Cá nhân tôi nghĩ rằng câu trả lời này là tốt. @Dennis đã xóa bài Mathicala của tôi sử dụng cùng một khái niệm. Mặt trước của excel sẽ lưu trữ kiểm tra // "" "/// dưới dạng một chuỗi không nguyên văn, do đó theo logic của anh ta, điều này sẽ bị xóa. Đây là cách nó được lưu trữ <Row> <Cell> <Data ss: Type =" Chuỗi "x: Ticky =" 1 "> kiểm tra // & quot; & quot; & quot; /// </ Dữ liệu> </ Cell> </ Row>
Kelly Lowder

20

Jolf, 6 byte

a Lq6(

Giải trình

a Lq6(
a       print
  L 6   all but the first 6 characters of
   q    the source code
     (  and exit

15

Perl 5 , 30 21 19 byte

in <DỮ LIỆU> __ END__

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

Trailing newline. Điều này sử dụng tính năng Perl cho phép dữ liệu tùy ý được thêm vào tệp nguồn, sau đó có thể được đọc qua DATAtệp thủ công. Khi chúng tôi đưa ra một tệp tin làm đối số print, nó sẽ đưa ra một bối cảnh danh sách, khiến cho tệp đó trả về một danh sách tất cả các dòng trong tệp, các dòng mới bao gồm (tương tự, một dòng mới trên dòng cuối cùng sẽ bị bỏ qua). Sau đó, printngầm kết hợp tất cả chúng lại, hoàn tác việc chia thành các dòng và cung cấp cho chúng ta chuỗi gốc chính xác bất kể dòng mới ở đâu.

Cảm ơn @Dada, người đã nhận ra rằng không cần phải xử lý các dòng mới một cách thủ công và @ninjalj và @b_jonas, mỗi người đã phát hiện ra một nhân vật có thể bị đánh golf.


2
Tôi không nghĩ bạn cần undef$/. Như là một đối số của print, <DATA>được gọi trong ngữ cảnh danh sách, vì vậy nó nên đọc mọi dòng có.
Dada

Bạn đúng. Nó đọc đầu vào một dòng tại một thời điểm, giữ các dấu phân cách dòng, sau đó ngầm nối tất cả chúng khi in, do đó không cần phải luồn lách ở vị trí đầu tiên. Đó cũng là một tiết kiệm 8 byte; Tôi sẽ đi sửa bài.

4
Bạn có thể sử dụng __END__thay vì __DATA__.
ninjalj

Những gì @ninjalj nói, cộng với việc bạn có thể bỏ qua dòng mới sau dấu lớn hơn (nhưng bạn cần dòng mới ở cuối chương trình).
b_jonas

14

Zsh, 6 byte

<<'
'

Có một dòng mới. Chuỗi được chèn vào cuối chương trình.

Bash, 20 17 byte

Cảm ơn Adam đã loại bỏ 3 byte.

exec sed 1d "$0"

* tập lệnh shell nix, 21 14 byte

Cảm ơn Adam đã loại bỏ 7 byte.

#!/bin/sed 1d

1
@Copper Có một dòng mới. Chuỗi được chèn sau đó.
jimmy23013

Ah tôi thấy. Cảm ơn vì đã sửa tôi!
Đồng

Các giải pháp 6/9 byte trông giống như họ đang khai thác một lỗi trong trình thông dịch đối với tôi (tất nhiên không phải là không được phép). (AFAICT với một số thử nghiệm, họ đang tự tìm kiếm một dòng mới trên một dòng, nhưng các dòng được xác định bằng cách tách trên các dòng mới, do đó, một dòng mới trên một dòng không bao giờ có thể xảy ra.) zshGiải pháp có vẻ đúng; tuy nhiên, bashgiải pháp 9 byte là sai (nó thêm một dòng mới theo dõi nếu tệp không có).

@ ais523 Dường như cũng là một lỗi với tôi. Và tôi không mong đợi chúng sẽ được các phiên dịch viên cho phép. Đã xóa giải pháp Bash.
jimmy23013

1
đối với bash bạn có thể sử dụng sed 1dthay vìtail -n+2
Adam

13

brainfuck ( Brainfuck không thể đọc được ), 9 byte

,+[-.,+]!

Nối đầu vào vào cuối. Lần này không có một dòng mới.

Tìm kiếm các ngôn ngữ chấp nhận đầu vào được nối vào cuối chương trình, brainfuck dường như là một khả năng khác biệt; nhiều thông dịch viên Brainfuck được viết bằng esolang lấy cả chương trình và đầu vào của chương trình từ đầu vào tiêu chuẩn, và do đó cần một số cách để phân biệt giữa chúng. Có một quy ước được sử dụng trong trường hợp này là một !nhân vật phân biệt giữa chương trình và đầu vào, một mẹo thường được sử dụng để viết các chương trình Brainfuck ngắn như ,[.,]!Hello, world!; điều này về cơ bản tạo ra một phương ngữ khác nhau của brainfuck trong đó !có một ý nghĩa khác với bình thường.

Về lý thuyết, do đó, chúng ta chỉ cần tìm một trong những thông dịch viên này và cung cấp cho nó một catchương trình để hoàn thành thông số kỹ thuật. Có một sự tinh tế lớn, mặc dù; brainfuck thường sử dụng 256 giá trị cho mỗi ô, có 256 octet và một giá trị cần được sử dụng cho EOF. Vì vậy, nếu chúng tôi muốn có thể lặp lại tất cả 256 octet theo nghĩa đen, chúng tôi không thể phát hiện EOF nào cả và sẽ cần kết thúc chương trình theo một cách khác. Nói cách khác, chúng ta cần tìm một triển khai cung cấp cho 256 giá trị octet và EOF 256 giá trị khác nhau hoặc sự cố trên EOF.

Nhập Không thể đọc được . Có một trình thông dịch Brainfuck trong Unreadable trước thách thức này và chấp nhận đầu vào sau một !; ngoài ra, không giống như hầu hết các trình thông dịch brainfuck, nó sử dụng các tế bào bignum và -1 cho EOF, cho phép phân biệt EOF với 256 octet có thể khác. Do đó, bằng cách sử dụng Uninfable Brainfuck làm trình thông dịch cụ thể cho chương trình, chúng tôi có thể giải quyết thách thức chỉ trong 9 byte, thông qua việc viết catchương trình brainfuck tạm dừng trên EOF = -1.

Có thể làm tốt hơn? Chà, chúng ta có thể thử chương trình 7 byte sau, chương trình này cố gắng xuất EOF ở cuối chuỗi trước khi nó thoát ra khỏi vòng lặp:

+[,.+]!

Hành vi của chương trình này phụ thuộc vào hành vi của người phiên dịch không thể đọc về điều kiện lỗi (như vậy, nó không chỉ phụ thuộc vào việc thực hiện các Brainfuck, nhưng về việc thực hiện sử dụng để chạy thi hành Brainfuck). Thật không may, trình thông dịch không thể đọc được tôi sử dụng lỗi đầu ra trên đầu ra tiêu chuẩn , có nghĩa là việc lưu này không hoạt động. Nếu bất cứ ai biết về một trình thông dịch không thể đọc được khi thoát khỏi một nỗ lực để xuất EOF, hoặc âm thầm bỏ qua nỗ lực này, hãy cho tôi biết; đó sẽ là một giải pháp bảy byte ngay tại đó.


1
,[.,]!hoạt động ở đây và là 6 byte (chỉ cần đánh dấu vào ô được đánh dấu !). Ngoài ra nó chấm dứt.
FinW

@FinW: Tôi không thể tìm ra cách nhập byte NUL vào trang web đó, nhưng mã đó chắc chắn sẽ chấm dứt sớm nếu nó thấy.

nó hoạt động tốt mà không cần byte NUL khi tôi làm việc đó.
FinW

1
Bạn thực sự có một ,(đọc đầu vào tiêu chuẩn cho phần tử băng hiện tại) theo sau là ](vòng lặp thoát nếu phần tử băng hiện tại là 0). Do đó, đọc một byte đầu vào có giá trị 0 (tức là NUL) sẽ phá vỡ vòng lặp.

Nhưng nếu trình thông dịch đọc không có đầu vào, (ví dụ: kết thúc chuỗi sau !), nó sẽ tự động đặt thành phần băng hiện tại thành 0, do đó kết thúc vòng lặp.
FinW

9

APL Dyalog , 11 byte

Sau đây là phần thân của hàm f :

2↓⎕CR'f'⋄→

Có một dòng mới, sau đó bất cứ điều gì có thể được chèn vào.

2↓ thả hai dòng đầu tiên (tiêu đề và dòng này) của

⎕CR'f'sự xuất hiện của C haracter R của f

sau đó

bỏ



9

JavaScript + HTML5 DOM, 163 byte

<html><body><script>fetch(location).then((r)=>r.text().then((t)=>console.log(t.slice(145,t.lastIndexOf("</b")))));document.body.remove()</script></body></html>

Bạn có thể chèn bất cứ thứ gì bạn thích trực tiếp trước thẻ đóng. Điều này hoạt động bằng cách tìm nạp nguồn trang và tước mã mở và các thẻ đóng.

Các kicker thực sự đã tìm ra làm thế nào để thoát khỏi một vòng lặp vô hạn. Việc đưa while(true){}vào trang sẽ chặn tất cả các cuộc gọi lại mãi mãi, đóng băng việc thực thi và JavaScript không có cách nào để tạm dừng luồng chính. Tuy nhiên, mã không còn tồn tại sẽ không bao giờ chạy, vì vậy phần thân tài liệu cam kết seppuku trong lệnh cuối cùng, xóa chính nó trong khi nó chờ bản sao của nó tải.

Vâng, nó dài và tròn, nhưng thực tế là nó có thể có trong JS là một điều tuyệt vời.


1
Gần đây, Chrome đã cảm thấy khó chịu với các tập lệnh chặn trình phân tích cú pháp và phàn nàn về chúng. Tôi thích ý tưởng chặn trình phân tích cú pháp có chủ ý để ngăn chặn bất kỳ tập lệnh nào trong đó phá hỏng nỗ lực in của bạn.

7

PHP, 46 byte

(bao gồm cả dấu ngắt dòng)

<?=join([""]+file(__FILE__));halt_compiler();
STRING HERE

Có: ngay cả filechức năng là an toàn nhị phân.

[""]+ thay thế chỉ mục 0 (dòng đầu tiên của tệp) bằng một chuỗi trống



5

PHP 94 byte

<?$f=fopen(__FILE__,'rb');fseek($f,93);while(false!==($c=fgetc($f)))echo$c;__halt_compiler();

Đặt chuỗi của bạn sau dấu chấm phẩy cuối cùng.

Yay cho các tính năng tối nghĩa tôi đoán? __halt_compiler () thực hiện chính xác những gì bạn mong đợi từ tên. Mã trước chỉ mở tệp và ghi bất kỳ byte nào sau dấu chấm phẩy cuối cùng đó vào thiết bị xuất chuẩn. NUL, BEL vv đi ra tốt đẹp. Các chữ Unicode (♪) bị vấy bẩn trên Windows nhưng tôi nghĩ đó chỉ là cmd Windows bị lỗi ở unicode.


1) Tôi đếm 93 byte, không phải 94. 2) false!==$c=...không cần dấu ngoặc đơn. 3) rbkhông cần báo giá. 4) Bạn có thể lưu một byte bằng for($f=fopen(...),fseek($f,88);false!==(...);)echo$c;5) hai byte khác ngắn hơn:<?for($f=fopen(__FILE__,rb);false!==$s=fgets($f,86);)echo$i++?$s:"";__halt_compiler();
Tít

6) và hai byte khác nếu bạn bỏ qua tham số thứ hai fgetsvà thêm dấu ngắt dòng vào mẫu.
Tít


3

PHP, 48 60 byte

<?=substr(file_get_contents(__FILE__),60);__halt_compiler();STRING HERE

Chỉ cần biết rằng việc đóng PHP không ngăn chặn chuỗi chứa <?.


Bạn đã có một khung đóng không đúng chỗ. Mặc dù vậy, tập tin kết xuất gọn gàng hơn nhiều so với nỗ lực của tôi, tôi nghĩ chất nền () sẽ bị sặc trên byte rỗng - đoán không.
ToXik-YogHurt

Hãy thử điều này : <?die(substr(file_get_contents(__FILE__),48))?>STRING HERE. Nên làm việc. Tôi đã thử với <?die('a')?>và nó đã làm việc.
Ismael Miguel

@IsmaelMiguel sẽ không hoạt động. diekhông in tham số của nó, nhưng gửi nó dưới dạng mã thoát. Điều đó sẽ phải êbe die(print ...).
Tít

@ ToXik-YogHurt hầu hết các hàm chuỗi là an toàn nhị phân. thậm chí file. Trên thực tế, hiện tại tôi có thể nghĩ về bất kỳ điều gì mà không.
Tít

@Titus Thửdie('text');
Ismael Miguel

2

Tính toán Lambda nhị phân , 1 byte

 [text goes here]

Đó là một khoảng trắng (0x20) trước văn bản.

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

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

0x20 = 00100000 2 được phân tích cú pháp dưới dạng

00    λx.
01        x
0000  (ignored, can be anything)

(Vì vậy, trên thực tế, bất kỳ nhân vật nào !"#$%&\'()*+,-./cũng sẽ hoạt động tốt như nhau.)

Vì đây là một biểu thức hoàn chỉnh, phần còn lại của chương trình được hiểu là dữ liệu đầu vào và theo các quy ước I / O tính toán nhị phân lambda, hàm nhận dạng λ x. x sao chép đầu vào trực tiếp vào đầu ra.


Không quan tâm, tại sao các bit 0 ở giữa hàm nhận dạng và chèn lại bị lặp lại?

@ ais523 Trình thông dịch đọc một byte mỗi lần và một lần x . x đã được phân tích cú pháp, phần đệm đã được sử dụng.
Anders Kaseorg



1

VBA Excel, 6 byte

Điều này chủ yếu là để trả lời câu hỏi làm thế nào để in văn bản như được giữ trong Câu trả lời của Adam cho Cửa sổ Immediates trong môi trường VBA

Thiết lập cơ bản:

Trong ô A1 trong bảng kích hoạt, sử dụng công thức dưới đây để giữ chuỗi được in. Vì lợi ích của việc đếm byte, điều này sẽ thêm 1 Byte

'[Your Text Here]

ví dụ:

'Hello 
World

Chức năng cửa sổ ngay lập tức, 5 + 1 = 6 byte

?[A1]

+1 Byte cho a 'trong ô A1


0

Vim (ở chế độ cũ), 28 byte

#!/bin/ex -c ':1d' -c ':wq'
[string]

28 byte bao gồm dòng mới nhất.


0

Vim, 738 byte

:imap <esc> <c-v><esc>
:imap <c-a> <c-v><c-a>
:imap <c-b> <c-v><c-b>
:imap <c-c> <c-v><c-c>
:imap <c-d> <c-v><c-d>
:imap <c-e> <c-v><c-e>
:imap <c-f> <c-v><c-f>
:imap <c-g> <c-v><c-g>
:imap <c-h> <c-v><c-h>
:imap <c-i> <c-v><c-i>
:imap <c-j> <c-v><c-j>
:imap <c-k> <c-v><c-k>
:imap <c-l> <c-v><c-l>
:imap <c-m> <c-v><c-m>
:imap <c-n> <c-v><c-n>
:imap <c-o> <c-v><c-o>
:imap <c-p> <c-v><c-p>
:imap <c-q> <c-v><c-q>
:imap <c-r> <c-v><c-r>
:imap <c-s> <c-v><c-s>
:imap <c-t> <c-v><c-t>
:imap <c-u> <c-v><c-u>
:imap <c-v> <c-v><c-v>
:imap <c-w> <c-v><c-w>
:imap <c-x> <c-v><c-x>
:imap <c-y> <c-v><c-y>
:imap <c-z> <c-v><c-z>
:imap <c-@> <c-v><c-@>
:imap <c-\> <c-v><c-\>
:imap <c-]> <c-v><c-]>
:imap <c-^> <c-v><c-^>
:imap <c-?> <c-v><c-?>
i

Rebinds tất cả các ký tự điều khiển trong chế độ chèn vào <c-v>, theo sau là ký tự điều khiển đó, sẽ nhập chúng theo nghĩa đen. ^ _ (đơn vị ngăn cách) dường như không cần rebinding, vì nó được xuất ra theo nghĩa đen theo mặc định.

Các văn bản biến đến cuối, tất nhiên.

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.