Template program untuk mencetak * string apa saja *


40

Tulis program dengan properti berikut:

  • Ketika dijalankan apa adanya, program tidak menghasilkan keluaran (yaitu 0 byte keluaran).

  • Ada lokasi di dalam program (pilihan Anda: bisa di awal, akhir, atau di suatu tempat di tengah) dengan properti berikut: memodifikasi program dengan menempatkan string apa pun di sana akan menyebabkan program yang dihasilkan untuk mencetak string itu ketika dieksekusi.

    Ini harus berfungsi terlepas dari apakah string berisi tanda kutip, garis miring terbalik, tanda komentar, pembatas, byte NUL, dll .; tidak peduli apa yang Anda tempat di sana, string masih diartikan sebagai string dan dicetak seluruhnya kata demi kata. Anda dapat, bagaimanapun, gagal untuk menangani string yang sangat panjang jika mereka akan menyebabkan kompiler kehabisan memori, atau sejenisnya (tepatnya, Anda setidaknya harus dapat menangani string hingga 1000 byte panjang atau tiga kali lipat dari panjang program Anda, mana yang lebih panjang).

Contoh solusi yang tidak valid adalah

print("");
#      ^ text goes here

dalam Python, Perl, Ruby, dll.; meskipun berfungsi untuk banyak string, itu tidak akan bekerja untuk string yang berisi kuotasi ganda, atau string yang berisi substring \n(yang akan ditafsirkan sebagai baris baru).

Perhatikan bahwa masalah ini mungkin tidak mungkin terjadi di sebagian besar bahasa; tantangannya adalah setidaknya sebagian tentang menemukan bahasa di mana ia bekerja. Bahasa pilihan Anda harus merupakan bahasa pemrograman berdasarkan definisi situs ini , mis. Tidak mengirimkan solusi dalam Teks .

Karena ini adalah , templat program terpendek menang. Namun, jangan berkecil hati mengirimkan solusi bahkan jika mereka tidak bisa mengalahkan pemenang saat ini! Anda masih dapat bersaing untuk tempat kedua, ketiga, dll., Atau hanya untuk menemukan sebanyak mungkin jawaban di mana ia bekerja. Anda harus, bagaimanapun, memastikan bahwa program Anda memenuhi seluruh spesifikasi sebelum mengirimkannya; solusi perkiraan akan melewatkan inti masalahnya.


Pos Sandbox yang relevan ada di sini .

Bisakah Anda mengklarifikasi rentang karakter yang perlu kami dukung untuk string yang dimasukkan? ASCII? ASCII + tidak dapat dicetak? Semua unicode?
DJMcMayhem

3
Semua 256 oktet. Apakah Anda menafsirkannya sebagai byte atau Unicode terserah Anda; itu tidak akan membuat banyak perbedaan ketika dicetak.

1
Maksud dari pertanyaan (dan cara itu saat ini worded) adalah bahwa Anda tidak dapat memiliki output tambahan. Apakah Anda memiliki solusi yang tidak dapat diadaptasi untuk menghindarinya? (Menggunakan byte tambahan untuk menghindari keluaran yang tersesat lebih disukai daripada membuat keluaran yang tersesat dan tidak mematuhi spesifikasi.)

1
Jika ini tidak memerlukan perubahan kode, itu akan sepele AWK, 1lakukan saja.
Robert Benson

Jawaban:


37

Excel, 1 byte

'

Versi tidak disatukan

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

Saya tidak berpikir ini dapat menerima baris baru.
Conor O'Brien

3
@ ConorO'Brien tidak dengan shift + enter
Adam

2
@ MrPaulch Ini cukup banyak teknik retro. Saya cukup yakin perintah ini menyembunyikan beberapa fungsi yang tidak diketahui lainnya, seperti menabrak sistem.
Adam

1
Ini juga berfungsi pada OpenOffice Calc. Ini digunakan secara otomatis ketika Anda mengatur sel ke format @.
Ismael Miguel

1
Secara pribadi saya pikir jawaban ini baik-baik saja. @ Dennis menghapus posting Mathematica saya yang menggunakan konsep yang sama. Ujung depan excel akan menyimpan test // "" "/// sebagai string non-kata demi kata, jadi dengan logikanya, ini harus dihapus. Berikut ini bagaimana ini disimpan <Row> <Cell> <Data ss: Type =" String "x: Ticked =" 1 "> test // & quot; & quot; & quot; /// </Data> </Cell> </Row>
Kelly Lowder

20

Jolf, 6 byte

a Lq6(

Penjelasan

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

cetak <DATA> __END__

Cobalah online!

Mengejar baris baru. Ini menggunakan fitur Perl yang memungkinkan data sewenang-wenang ditambahkan ke file sumber, yang kemudian dapat dibaca melalui DATAfilehandle. Ketika kami memberikan filehandle sebagai argumen print, itu memberikan konteks daftar, yang menyebabkan filehandle mengembalikan daftar semua baris dalam file, termasuk baris baru (juga, baris baru pada baris terakhir akan dihilangkan). Kemudian printsecara implisit menggabungkan mereka semua, membatalkan pemisahan menjadi garis-garis dan memberi kita string asli yang tepat terlepas dari di mana baris baru.

Terima kasih kepada @Dada, yang menyadari bahwa tidak perlu menangani baris baru secara manual, dan @ninjalj dan @b_jonas, yang masing-masing melihat karakter yang dapat di-golf.


2
Saya pikir Anda tidak perlu undef$/. Sebagai argumen print, <DATA>disebut dalam konteks daftar, sehingga harus membaca setiap baris yang ada.
Dada

Kamu benar. Bunyinya input baris pada satu waktu, menjaga pemisah garis, kemudian secara implisit menggabungkan mereka semua saat mencetak, jadi tidak perlu menghirup di tempat pertama. Itu penghematan 8-byte, juga; Saya akan memperbaiki pos.

4
Anda bisa menggunakan __END__bukan __DATA__.
ninjalj

Apa yang dikatakan @ninjalj, plus Anda dapat menghilangkan baris baru setelah tanda lebih besar dari (tetapi Anda memang membutuhkan baris baru di akhir program).
b_jonas

14

Zsh, 6 byte

<<'
'

Ada baris baru yang tertinggal. String dimasukkan di akhir program.

Pesta, 20 17 byte

Terima kasih kepada Adam karena telah menghapus 3 byte.

exec sed 1d "$0"

* skrip shell nix, 21 14 byte

Terima kasih kepada Adam karena telah menghapus 7 byte.

#!/bin/sed 1d

1
@ Copper Ada baris baru. Tali dimasukkan setelah itu.
jimmy23013

Ah, begitu. Terima kasih telah mengoreksi saya!
Tembaga

Solusi 6/9-byte terlihat seperti mereka mengeksploitasi bug pada penerjemah kepada saya (tentu saja bukan yang dilarang). (AFAICT dengan beberapa eksperimen, mereka sedang mencari baris baru pada sebuah garis dengan sendirinya, tetapi garis tersebut didefinisikan dengan memisahkan garis baru, sehingga garis baru pada garis itu sendiri tidak akan pernah terjadi.) zshSolusinya tampak benar; Namun, solusi 9-byte bashsalah (ia menambahkan baris tambahan jika file tidak memilikinya).

@ ais523 Sepertinya juga bug bagi saya. Dan saya tidak berharap mereka diizinkan oleh penerjemah. Menghapus solusi Bash.
jimmy23013

1
untuk bash Anda bisa menggunakan sed 1dsebagai gantitail -n+2
Adam

13

brainfuck ( Brainfuck Tidak Dapat Dibaca ), 9 byte

,+[-.,+]!

Tambahkan input sampai akhir. Tidak ada baris baru, kali ini.

Mencari bahasa yang akan menerima input yang ditambahkan pada akhir program, brainfuck tampak seperti kemungkinan yang berbeda; banyak penerjemah brainfuck yang ditulis dalam esolang mengambil baik program dan input program dari input standar, dan karenanya perlu beberapa cara untuk membedakan antara mereka. Ada konvensi yang digunakan dalam kasus ini bahwa !karakter membedakan antara program dan input, trik yang sering digunakan untuk menulis program brainfuck pendek seperti ,[.,]!Hello, world!; ini pada dasarnya menciptakan dialek berbeda dari brainfuck yang !memiliki arti berbeda dari normal.

Secara teori, oleh karena itu, kita bisa menemukan salah satu dari penafsir ini dan memberikannya catprogram untuk memenuhi spesifikasi. Ada kehalusan utama, meskipun; Brainfuck biasanya menggunakan nilai 256 untuk setiap sel, ada 256 oktet, dan satu harus digunakan untuk EOF. Jadi jika kita ingin dapat menggema semua 256 oktet secara harfiah, kita tidak dapat mendeteksi EOF sama sekali dan harus mengakhiri program dengan cara lain. Dengan kata lain, kita perlu menemukan implementasi yang memberikan 256 oktet dan nilai EOF 257 yang berbeda, atau crash pada EOF.

Masukkan Tidak Dapat Dibaca . Ada juru bahasa brainfuck di Unreadable yang mendahului tantangan ini, dan yang menerima input setelah suatu !; selain itu, tidak seperti kebanyakan penerjemah brainfuck, ia menggunakan sel bignum dan -1 untuk EOF, yang memungkinkan EOF untuk dibedakan dari 256 kemungkinan oktet lainnya. Jadi, dengan menggunakan Unfreadable Brainfuck sebagai penerjemah khusus untuk program ini, kita dapat menyelesaikan tantangan hanya dalam 9 byte, melalui penulisan catprogram brainfuck yang berhenti pada EOF = -1.

Apakah mungkin melakukan yang lebih baik? Nah, kita bisa mencoba program 7-byte berikut ini, yang mencoba untuk mengeluarkan EOF di akhir string sebelum keluar dari loop:

+[,.+]!

Perilaku program ini tergantung pada perilaku interpreter Unreadable pada kondisi kesalahan (dengan demikian, itu tidak hanya tergantung pada implementasi brainfuck, tetapi pada implementasi yang digunakan untuk menjalankan implementasi brainfuck). Sayangnya, juru bahasa Unreadable saya menggunakan kesalahan keluaran pada keluaran standar , artinya penghematan ini tidak berfungsi. Jika ada yang tahu tentang juru bahasa yang tidak bisa dibaca yang keluar pada upaya untuk mengeluarkan EOF, atau diam-diam melewatkan upaya, beri tahu saya; itu akan menjadi solusi tujuh byte di sana.


1
,[.,]!bekerja di sini dan 6 byte (cukup centang kotak yang ditandai !). Juga berakhir.
FinW

@FinW: Saya tidak tahu cara memasukkan byte NUL ke situs web itu, tetapi kode itu pasti akan berakhir lebih awal jika melihat satu.

itu bekerja dengan baik tanpa byte NUL ketika saya melakukannya.
FinW

1
Anda benar-benar memiliki ,(baca input standar ke elemen rekaman saat ini) diikuti oleh ](loop keluar jika elemen rekaman saat ini adalah 0). Dengan demikian, membaca byte input dengan nilai 0 (yaitu NUL) akan memutus loop.

Tetapi jika interpreter tidak membaca input, (misalnya akhir string setelah !), secara otomatis mengatur elemen rekaman saat ini ke 0, sehingga mengakhiri loop.
FinW

9

Dyalog APL , 11 byte

Berikut ini adalah fungsi tubuh f :

2↓⎕CR'f'⋄→

Ada baris baru, setelah itu apa pun dapat dimasukkan.

2↓ drop dua baris pertama (header dan baris ini) dari

⎕CR'f'yang C haracter R epresentation dari f

kemudian

berhenti



9

JavaScript + HTML5 DOM, 163 Bytes

<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>

Anda dapat memasukkan apa pun yang Anda suka langsung sebelum tag tubuh penutup. Ini berfungsi dengan mengambil sumber halaman dan membuka kode pembuka dan tag penutup.

Penendang yang sebenarnya sedang mencari tahu bagaimana cara melepaskan diri dari loop tanpa batas. Menempatkan while(true){}di halaman memblokir semua panggilan balik selamanya, membekukan eksekusi, dan JavaScript tidak memiliki cara untuk menghentikan utas utama. Namun, kode yang tidak lagi ada tidak pernah berjalan, jadi badan dokumen melakukan seppuku pada perintah terakhir, menghapus dirinya sendiri saat menunggu klonnya dimuat.

Ya, ini panjang dan bundaran, tetapi fakta bahwa itu mungkin di JS agak menakjubkan.


1
Chrome kesal dengan skrip pemblokir parser baru-baru ini, dan mengeluhkan banyak tentang mereka. Saya suka gagasan memblokir parser dengan sengaja untuk mencegah skrip apa pun di dalamnya merusak upaya pencetakan Anda.

7

PHP, 46 byte

(termasuk linebreak trailing)

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

Ya: bahkan filefungsinya biner safe.

[""]+ mengganti indeks-0 (baris pertama file) dengan string kosong


6

gs2 , 4 byte

╥¶=☼

Menggunakan pengodean CP437. String berjalan di akhir. mendapatkan kode sumber, mendorong 4, =menjatuhkan banyak karakter utama, dan keluar.

Cobalah online!


5

PHP 94 byte

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

Tempatkan string Anda setelah titik koma akhir.

Yay untuk fitur yang tidak jelas saya kira? __halt_compiler () melakukan persis seperti yang Anda harapkan dari namanya. Kode sebelumnya hanya membuka file dan menulis byte setelah titik koma terakhir ke stdout. NUL, BEL dll keluar dengan baik. Unicode literal (♪) kacau pada Windows tapi saya pikir itu hanya Windows cmd gagal di unicode.


1) Saya menghitung 93 byte, bukan 94. 2) false!==$c=...tidak perlu tanda kurung. 3) rbtidak perlu penawaran. 4) Anda dapat menyimpan satu byte dengan for($f=fopen(...),fseek($f,88);false!==(...);)echo$c;5) dua byte lebih pendek:<?for($f=fopen(__FILE__,rb);false!==$s=fgets($f,86);)echo$i++?$s:"";__halt_compiler();
Titus

6) dan dua byte lainnya jika Anda menghilangkan parameter kedua untuk fgetsdan menambahkan linebreak trailing ke template.
Titus


3

PHP, 48 60 byte

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

Baru menyadari bahwa penutupan PHP tidak mencegah string berisi <?.


Anda memiliki braket penutup yang salah tempat. Banyak dump file yang lebih rapi daripada usaha saya, saya pikir substr () akan tersedak null byte - kira tidak.
ToXik-yogHurt

Coba ini: <?die(substr(file_get_contents(__FILE__),48))?>STRING HERE. Harus bekerja Saya sudah mencoba <?die('a')?>dan berhasil.
Ismael Miguel

@IsmaelMiguel tidak akan berfungsi. dietidak mencetak parameternya, tetapi mengirimkannya sebagai kode keluar. Itu harus ´be die(print ...).
Titus

@ ToXik-yogHurt sebagian besar fungsi string aman biner. bahkan file. Sebenarnya saat ini saya tidak bisa memikirkan hal yang tidak.
Titus

@Titus Trydie('text');
Ismael Miguel

2

Binary Lambda Calculus , 1 byte

 [text goes here]

Itu satu spasi (0x20) sebelum teks.

Cobalah online!

Bagaimana itu bekerja

0x20 = 00100000 2 diuraikan sebagai

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

(Jadi sebenarnya, salah satu karakter !"#$%&\'()*+,-./akan berfungsi sama baiknya.)

Karena ini adalah ekspresi yang lengkap, sisa program ditafsirkan sebagai data input, dan di bawah konvensi I / O kalkulus lambda biner, fungsi identitas λ x. x menyalin input langsung ke output.


Karena ketertarikan, mengapa tidak mengekor nol bit antara fungsi identitas dan penyisipan digema?

@ ais523 Interpreter membaca satu byte pada satu waktu, dan sekali λ x . x telah diuraikan, padding telah dikonsumsi.
Anders Kaseorg

2

Bash, 17 byte

tail -n+3 $0
exit
<string here>

Dikembangkan secara independen dari jawaban jimmy23013 .


Bukankah maksud Anda $0? Selain itu, saya pikir itu berhasil (saya sudah mengkonfirmasi bahwa itu tidak menguraikan apa pun setelah exit).

@ ais523 Diperbaiki! Terima kasih.
noɥʇʎԀʎzɐɹƆ


1

Excel VBA, 6 Bytes

Ini terutama untuk menjawab pertanyaan tentang bagaimana mencetak teks seperti yang ada dalam Jawaban Adam ke Jendela Segera di lingkungan VBA

Pengaturan dasar:

Di sel A1 di aktifkan, gunakan rumus di bawah ini untuk menahan string yang akan dicetak. Demi penghitungan byte, ini akan menambahkan 1 Byte

'[Your Text Here]

misalnya:

'Hello 
World

Fungsi Jendela Segera, 5 + 1 = 6 Bytes

?[A1]

+1 Byte untuk 'sel dalam A1


0

Vim (dalam mode ex), 28 byte

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

28 byte termasuk baris baru terakhir.


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

Mengembalikan semua karakter kontrol dalam mode penyisipan ke <c-v>, diikuti oleh karakter kontrol itu, yang akan memasukkannya secara harfiah. ^ _ (unit seperator) tampaknya tidak perlu rebinding, karena akan dikeluarkan secara default.

Teks variabel datang di akhir, tentu saja.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.