Program terpendek dengan keluaran + program gabungan adalah permutasi dari 95 karakter ASCII yang dapat dicetak

12

Menulis program yang sesingkat mungkin (diukur dengan byte-count), tidak mengambil input, tidak berisi komentar, dan mengeluarkan string karakter / urutan, sehingga program gabungan + output persis 95 karakter panjangnya dan berisi setiap karakter ASCII yang dapat dicetak dicetak tepat sekali , yaitu program + output adalah permutasi dari 95 karakter dengan kode ASCII 32-126:

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ 

Dalam hal seri, pemenangnya adalah entri yang output + program (95 karakter) + paling dekat dengan string di atas, yang diukur dengan jarak edit Levenshtein (yaitu jumlah penghapusan karakter tunggal, penyisipan, atau diperlukan penggantian untuk memasukkannya ke dalam urutan ASCII).

res
sumber
2
Jadi apakah ini berarti bahwa jika mis. Program berisi karakter yang diulang maka secara otomatis didiskualifikasi? Itu kasar.
kotak roti
1
Anda mungkin juga ingin memutuskan apakah yang lama echo $0didiskualifikasi.
Peter Taylor
3
Apakah karakter di luar rentang karakter ascii yang dapat dicetak (dan mungkin duplikatnya) diperbolehkan? Atau haruskah program + output mengandung setiap karakter yang dapat dicetak tepat sekali, dan tidak lebih ?
Primo
1
@ primo Saya menganggap mereka diizinkan. Saya pikir ini saatnya untuk menulis solusi "shift-and-eval" yang menggunakan duplikat (meskipun string literal akan sulit didapat)
John Dvorak

Jawaban:

12

GolfScript, 14 karakter

{`),32>46-^}.~

Keluaran :

 !"#$%&'(*+/015789:;<=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]_abcdefghijklmnopqrstuvwxyz|
Howard
sumber
Tantangannya (setidaknya sejauh yang saya mengerti) adalah untuk menulis sebuah program yang program dan hasilnya adalah permutasi dari 95 karakter ASCII yang dapat dicetak, bukan untuk menulis program sesingkat mungkin yang menghasilkan 95 karakter ASCII yang dapat dicetak.
Frank Schmitt
Maaf, kesalahan saya. Dalam judul itu tertulis "program + output", sedangkan kemudian dalam pertanyaan itu bertuliskan output + program gabungan .
Frank Schmitt
),- Wow. Saya suka itu.
John Dvorak
1
@JanDvorak codegolf.SE: satu-satunya tempat di mana orang-orang senang dengan paren dekat dan koma. : P
Doorknob
@Doorknob dalam skrip golf artinya "uncons kanan (rparen) dan membuat array dengan ukuran itu (koma)". Akibatnya Anda ditinggalkan dengan string yang diperpendek oleh satu karakter (keriting kanan) dan array yang berakhir tepat di bawah posisi ASCII karakter tersebut (at |). Pangkas karakter yang tidak diinginkan, periode dan xor (set perbedaan simetris di sini) dengan kode sumber (pengurangan diambil) sans berkata benar keriting, dan Anda sudah selesai. Dan ya, string xor array adalah string.
John Dvorak
6

Perl, 89 karakter

Ini adalah yang terbaik yang bisa saya lakukan sejauh ini:

q< !"#%&'()+/8:?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\^_`abcdefghjklmosuvwxz|>;
print~-$=.73*2,y[]{}

Bagi mereka yang tidak fasih dalam Perl minutae, dua argumen untuk printpernyataan tersebut dapat diterjemahkan sebagai ~(-($=)) . (73 * 2)dan tr///.

Program ini menghasilkan 6 karakter:

591460

Sayangnya setiap iterasi konstruk tunggal yang dapat saya pikirkan di Perl ( for, while, until, map, grep) saham setidaknya satu karakter dengan print. Jika baris baru diizinkan muncul di output, maka saya bisa menggunakan Perl 5.010 untuk mencari solusi 87-karakter:

q{ !"#%&'*,-./0:;>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^`bcdfgjkmnoprtuvxz|~}while($_+=say)<9
kotak roti
sumber
Mari kita lihat apakah saya dapat mencetak angka yang lebih besar :-)
John Dvorak
eh ... bisakah Anda menerjemahkan baris kedua untuk saya?
John Dvorak
1
@JanDvorak $=adalah jumlah garis horizontal pada perangkat keluaran saat ini. Secara default 60. ~-$=adalah inversi bitwise dari komplemen negatif kedua dari 60, yang kebetulan 59. 73*2adalah 146. .dan ,lakukan apa yang Anda harapkan dari mereka. y[]{}adalah cara lain untuk mengatakan tr///, yang merupakan operator transliterate. Dibutuhkan $_dan tidak melakukan apa-apa, karena Anda tidak memberikan karakter apa pun untuk diganti. Ini mengembalikan jumlah karakter yang diganti, yaitu 0. Jadi kita memiliki ~-$= . 73*2 , y[]{}= 59 . 146 , 0= '591460`.
Dan
6

PHP 67 byte

<?=U4eB1gkFdA6J9snZD2IE8y5PhwQV^xHGmqYMfNjKpbR3vcLalCWi0_TtrOSXouz;

Keluaran:

-|"/@>& *+}:[!],'~(){.\`7#%$

Sepertinya harus ada solusi 65 byte, menghasilkan 30 karakter bukan hanya 28, tapi saya tidak bisa mendapatkannya untuk berbaris. 6 karakter yang tidak digunakan OSXouztelah ditempelkan ke salah satu string literal sebagai gantinya.

Sunting: Setelah refleksi lebih lanjut, tidak mungkin menghasilkan lebih dari 28 karakter dengan cara ini. UPPER ^ lowerakan selalu menghasilkan karakter antara 32 dan 63, sehingga semua 10 digit diperlukan untuk @[\]_`{|}~. Empat dari 22 sisanya digunakan dalam skrip itu sendiri, hanya menyisakan 18 yang dapat diperoleh dengan huruf saja. Tiebreaker dapat ditingkatkan secara signifikan.

primo
sumber
Ah, tentu, kata pengantar. Bagaimana saya bisa lupa?
John Dvorak
3

Ruby, 91 karakter

%{ !"#$&\',-/450:<=>ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcefghijklmnqvwxyz|~};puts(?@‌​.ord*98+1)

Keluaran 6273.

%{...} Trik dicuri dari Jan Dvorak

Gagang pintu
sumber
Tanpa komentar. Seperti yang dinyatakan dengan jelas.
Johannes Kuhn
@ JohannesKuhn Ah, tidak memperhatikan itu. diedit.
Gagang Pintu
%{ !"#$&\',-/450:<=>ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcefghijklmnqvwxyz|~};puts([email protected]*98+1)adalah apa yang saya pikir Anda inginkan (untuk 91 karakter) dengan tanda koma dipindahkan untuk digunakan sebagai pemisah yang dapat dicetak (bukan baris baru), dan dengan huruf 'ord' dihapus dari dalam kurung keriting.
res
@res Yap, sulit untuk mengelola semua surat-surat ini: P
Doorknob
Sekarang \ dimasukkan tiga kali.
Howard
3

Perl, 61 karakter

print$:x8^CJIBQTOWAEULHVGFNMKRPZY,q<#"/;*g~?|={.>&+u15m97ws26

Keluaran:

c@db[yo]le_ah\jfD`kX}zS-! %)('v304

$:default ke " \n-". x8mengulanginya delapan kali; hasil 24 karakter kemudian bitwise-xored dengan pembatasan 23 karakter (yang terakhir -dibiarkan apa adanya). Bagian kedua adalah 12-karakter q-string bitwise-dan 10-karakter barestring (2 karakter terakhir dibuang).

Grimmy
sumber
1
Saya menemukan panjang program Anda adalah 61 karakter.
res
Terima kasih. Editor teks saya melaporkan 62 karakter karena EOF.
Grimmy
1

Ruby, 95 karakter, 6 suntingan

%{ !"#$&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz|~}

Ya. Itu dia. Hanya string literal mengambang bebas yang tidak pernah dicetak. Ruby mendukung string literal (dipinjam dari Perl, saya pikir) dalam bentuk persen-jenis-pembatas - pembatas adalah karakter non-alfanumerik, dan jika pembatas pembukaan adalah braket pembuka (salah satu [({<), pembatas penutup adalah yang sesuai braket penutup (braket bersarang diperbolehkan).

Saya menyadari ini lebih dari pengajuan baseline, tetapi kecuali seseorang berhasil mencetak sesuatu atau kecuali ada bahasa dengan string bentuk bebas dua-char literal dengan pembatas pembukaan dan penutupan yang berbeda , ini adalah yang terbaik yang ada.

John Dvorak
sumber
0

Tcl 96, edit jarak 12

if 0    {!"#$%&'()*+,-./123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdeghjklmnopqrstuvwxyz|~}
Johannes Kuhn
sumber
Salah satu ruang harus menjadi tab, saya khawatir
John Dvorak
Apakah tab atau spasi dapat dicetak?
Johannes Kuhn
tab tidak dapat dicetak (ASCII 9), tetapi ruang dapat dicetak (ASCII 32).
John Dvorak
1
[Baru saja melihat bahwa OP hanya mengklarifikasi ini setelah Anda menjawab :)]
flornquake
1
join {!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghklmpqrstuvwxyz|~} tampaknya berfungsi menggunakan 95 karakter? (Terima kasih atas entri Anda. Maaf tentang bunglon - sayangnya saya mengedit dengan tergesa-gesa, dan seharusnya melakukan hal-hal yang berbeda.)
res