Cetak frasa And she said, 'But that's his.'
hanya menggunakan karakter berikut: abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
Tidak ada tanda baca atau karakter non-alfabet apa pun. Anda dapat menggunakan bahasa pemrograman apa pun yang Anda inginkan. Ruang kosong sepenuhnya diizinkan. Kemenangan program terpendek.
code-golf
kolmogorov-complexity
restricted-source
Blue-Maned Hawk
sumber
sumber
a-zA-Z
. Secara teori saya bisa menggunakanw
ritus danE
val untuk membuat instruksi yang diperlukan, tetapi tidak ada yang+-*,%'"
dapat dibangun tanpa menggunakan (setidaknya) salah satunya+-*,%'"0-9
.(programmer-of (language 'lisp))
tidak suka ini.Jawaban:
Ruang putih ,
417414349265 byte265 byte berkat Kevin Cruijssen
Cobalah online!
Dijelaskan:
sumber
Whitespace is completely allowed.
Saya melihat Anda telah menerima ini secara harfiah.NNN
untuk keluar, karena sudah berhenti dengan kesalahan ketika Anda melakukan add sebelum print_char, jadi itu bahkan tidak akan muncul setelah Jump_to_Label. Juga, mengapa menyimpan63
di awal dan mengambilnya dalam loop? Anda bisa mendorongnya sebelum menambahkan saja. Dan, mengapa Label-nrTTSSSSTN
? Label bahkan bisa kosong, jadi hanyaNSSN
untuk membuat label danNSNN
melompat ke label sudah cukup ketika Anda hanya menggunakan satu Label.63
? Saya tidak 100% yakin itu adalah konstanta terpendek yang mungkin di sini. Jika ya, ada yang salah dengan program penghasil konstan yang saya tulis untuk tantangan sebelumnya. :)102
adalah yang paling efisien: 281 byte (atau di sini dengan highlighting ). (CATATAN: Saya juga menggunakan satu salinan untuk menghemat 4 byte untuk ruang di antaraehs dnA
(disalin dari ruang di antaradias ehs
)Perl 5 ,
13310295 byteCobalah online!
Penjelasan:
Regex, cetak, dan potong semua berlaku untuk variabel
$_
secara default.Mengganti string kosong dengan
And she saidZ ZBut thatZs hisZZGjGGf
.Ganti masing
Z
- masing dengan hasil evalingchr oct oct oct ord chop
. Ini menghilangkan karakter terakhir$_
, mengambil kode kunci, menafsirkannya sebagai oktal tiga kali, dan mengubahnya kembali menjadi karakter. Misalnya,j
→ 106 → 70 → 56 → 46 →.
.Karena cara penggantian bekerja, modifikasi
$_
yang terjadi saat mengevaluasi penggantian hilang, begitu$_
juga sekarangAnd she said, 'But that's his.'GjGGf
.Menghapus semua
G
,j
danf
di$_
.sumber
print
dengansay
untuk -2 karakter. Konsensus meta saat ini mengatakan bendera baris perintah seperti-M5.010
tidak masuk hitungan byte.> <> ,
916915903 bytePada awalnya saya pikir solusi di> <> tidak mungkin, tetapi kemudian saya menyadari ... siapa yang butuh kontrol kondisional atau logika? : D
Cobalah secara Online
Saya berulang kali mendorong angka (angka 15) ke tumpukan, lalu mendorong panjang tumpukan dan mencetak karakter dengan nilai ASCII itu. Jika saya perlu mengecilkan panjang tumpukan, saya mengecilkan tumpukan tiga nilai sekaligus
p
, atau satu per satu menggunakang
jika saya berada dalam tiga target. Program diakhiri dengan memanggili
(input), yang mendorong-1
karena tidak ada input, kemudian mencetaknya untuk menyebabkan kesalahan.Ini adalah program Python 3 yang saya gunakan untuk membuat solusi begitu saya memikirkan cara melakukannya:
Cobalah secara Online
sumber
p
: membuat 59 pada stack sambil bergerak dari ruang kes
dalamsaid
, kemudian menempatkannya dalam kode di jalan turun darid
ke,
. (Perhatikan bahwa (15,15) memiliki 15 pada titik ini.)l
danp
menempatkan beberapa karakter yang berguna dalam kotak (10,10) - (15,15), lalu mengambilnya dengang
tempat yang lebih nyaman.8086 Unit pada IBM PC,
1463845664 byteKlarifikasi: Sumber bahasa rakitan yang sebenarnya adalah entri, bukan kode mesin yang dihasilkan.
Kesulitannya adalah sebagian besar instruksi x86 (seperti ADD, SUB, JMP, lompatan bersyarat, akses memori) memiliki dua argumen dan karenanya memerlukan koma, atau memerlukan alamat memori. Jadi, kita tidak bisa menggunakan penjumlahan, pengurangan, ifs, atau loop!
Selama upaya pertama saya, saya dapat "membangun" angka menggunakan kombinasi kenaikan, penurunan, perkalian, pembagian, trik-byte, dan instruksi BCD yang tidak jelas (seperti AAA, DAS). Setelah itu, saya menyadari bahwa ide ini dapat digunakan untuk membuat kode inspeksi dan modifikasi diri.
Percobaan 1. (1463 bytes)
Menggunakan instruksi yang tersedia untuk membuat kode ASCII dan alamat 0xb800 dari buffer layar. Perhitungan setiap karakter dalam urutan itu golf dengan tangan.
Percobaan 2. (tidak lengkap)
Menyadari bahwa ada opcode untuk setiap bilangan bulat di kisaran 0x40-0x5f. Kisaran ini termasuk AZ. Jadi misalnya INC CX berhubungan dengan 0x41 = 'A'. ( Tabel opcode ini sangat berguna.)
Saya mencoba membuat 3 "data" string, dan melapisi mereka di atas satu sama lain. As-is pertama (huruf besar), yang kedua "bergeser" ke zona 0x60-0x7f (huruf kecil) dan yang terakhir "bergeser" ke zona 0x20-0x3f (tanda baca).
Kode modifikasi diri akan menghasilkan satu atau tiga lingkaran untuk beralih pada data.
Percobaan 3. (845 bytes)
Seperti pendekatan sebelumnya tetapi untuk mengurangi data, string hanya akan dikodekan sekali, dengan "karakter kontrol" dicampur untuk beralih set karakter.
Percobaan 4. (664 bytes)
Bagaimana cara menghilangkan karakter kontrol yang memerlukan banyak instruksi yang ditambal untuk menangani percabangan? Mengingat bahwa hanya dua huruf besar yang digunakan, saya bertanya-tanya apakah saya bisa "membalik" tabel opcode untuk menyandikan huruf kecil menggunakan rentang 0x40-0x4f dan tanda baca menggunakan rentang 0x90-0x9f (dengan mengurangi dari 0xc0). "A" dan "B" dapat dimasukkan secara terpisah.
Namun hanya separuh dari opcodes dalam rentang 0x90-0x9f yang dapat digunakan dan mereka tidak sejalan dengan yang diperlukan. Lalu saya pikir mungkin saya bisa mengocok mereka menggunakan XOR, dan saya menemukan yang berhasil. Dan ini dia.
Golf:
Berkumpul dengan
dan jalankan di DOSBOX (jalankan CLS pertama). Terlihat seperti ini:
Berkomentar:
sumber
INC AX
sementara yang tidak dikomentari adalahINC AL
.label1 db
sendiri. Ini akan menghasilkan peringatan, tetapi tidak ada kesalahan.Perl 6 ,
1299127212201215 byteTerima kasih kepada Grimy untuk -27 byte.
-52 byte karena kita tidak membutuhkan telinga kelinci sejak awal.
Terima kasih kepada Jo King untuk -5 byte.
Cobalah online!
Menghasilkan string dengan baris baru tambahan. Jika Anda tidak menginginkannya, ganti yang terakhir
say
dengan aprint
. Anda juga dapat mengganti baris baru di sumber dengan spasi.Penjelasan
Kode ini mencetak karakter string dengan karakter. Setiap karakter dibentuk dengan memasukkan kode karakter yang sesuai ke dalam
chr
fungsi dan menurunkannyalc
jika diperlukan.Saat ini, semua nilai dihasilkan dengan membuat string dengan jumlah karakter yang benar di dalamnya; dalam beberapa kasus, jumlah karakter adalah kebalikan dari kode karakter target. Seharusnya secara teori dimungkinkan untuk menggunakan fungsi matematika seperti
log
danexp
langsung, tetapi saya tidak merasa sangat mudah untuk menggunakannya.Untuk digunakan sebagai angka, kami memiliki
e
,pi
dantau
; di sisi kananx
atauxx
, mereka secara implisit lantai. Mereka semua memiliki 17 karakter dalam representasi string mereka, jadi kami gunakane
untuk jumlah karakter minimal. Kami juga memilikii
(4 karakter),False
(5 karakter) danNaN
(3 karakter). Kita bisa mengalikan panjang string denganx
;xx
mengalikan satu ditambah panjang string di sisi kanan dan menambahkan satu.chop
menghapus satu karakter dari string jika kita jauh dari target.Pernyataan cetak dirangkai bersama-sama menggunakan
and
, yang memiliki prioritas yang sangat rendah. Itu hampir keajaiban itu ada; jika tidak, kita harus menggunakan titik koma ilegal.Saya menemukan ekspresi untuk karakter dengan tangan. Mungkin perlu mencari mereka secara terprogram untuk menemukan ekspresi yang lebih pendek.
sumber
Lebar ,
6664 byteCobalah online!
Mencetak ke debug. Untuk mencetak ke stdout, tambahkan
ww
ke akhir kode, yang muncul dan mengeluarkan bagian atas tumpukan.Penjelasan
Dalam Lebar, setiap huruf berkorelasi dengan angka, berdasarkan pada seberapa "lebar" itu, menurut tabel ini . Ini memberikan setiap huruf satu angka dari 0 hingga 9. Kemudian, angka-angka itu digunakan untuk benar-benar mengeksekusi kode.
Secara khusus, surat daripada pertandingan
7
akan memulai string literal. Ini akan membaca set dua huruf sekaligus, sampai membaca huruf aslinya lagi. Setiap set dua huruf akan dikonversi ke angka lebarnya, dibaca sebagai angka desimal antara 0 dan 99, dan karakter yang mereka sediakan akan menjadi indeks mereka dalam string berikut:Misalnya, indeks
!
adalah 1, sehingga01
akan menjadi angka lebar yang tepat. Dengan demikian,if
,iI
,jt
, dll semua akan berkorelasi dengan literal string!
.Dalam hal ini, saya menerjemahkan 31 karakter dari output yang diperlukan ke huruf yang sesuai, menggunakan
Q
sebagai tanda kutip. Bagian atas tumpukan dicetak untuk debug ketika program selesai.sumber
kode mesin x86 (32-bit), 256 byte
Ketika saya mencetak kode saya di konsol codepage 437 saya, saya melihat yang berikut:
Ini berisi beberapa karakter spasi putih, jadi di sini adalah kode yang sama ketika saya mengganti semua karakter tab dengan
→
dan semua karakter spasi nonbreaking (dengan kode 255) dengan*
:Hexdump:
Beberapa penjelasan tentang cara kerjanya:
Instruksi yang berguna adalah:
push imm8
,push imm16
danpush imm32
, diikuti olehpop
menghasilkan konstanta. Ini juga dapat menghasilkan nol (dalamah
) saat mendorong byte (imm8
).and [ecx+32], ah
- dengan asumsi ah = 0, ini menetapkan byte ke nol. Kebetulan panjang string output adalah 32, sehingga kode mengisi buffer dari ujung ke awal.or [ecx+32], edx
- dengan asumsi byte output diatur ke nol, salinan iniedx
(4 byte) ke output. Saya menggunakan varian dengandx
bukannyaedx
mendekati akhir buffer, karena seharusnya tidak menulis di luar buffer output. Pembatasan kode membuatnya tidak mungkin untuk menulis byte tunggal dengan cara ini!imul edx, [ecx+32], whatever
- ini adalah ide pengacakan utama. Dengan cukup entropi[ecx+32]
dan angka apa pun , itu dapat menghasilkan output apa pun. Saya menggunakannya untuk menghasilkan 2 atau 3 byte dari nilai yang dibutuhkan. Beberapa komplikasi adalah, ketika menuliskannya ke output, itu harus dilakukan secara logisOR
dengan apa pun yang sudah ada. Ini kadang-kadang membuatnya perlu untuk nol memori sekali lagi.jmp
instruksi digunakan untuk kembali. Saya memilihnya karena penyandiannya0xff
, yang sesuai dengan ruang bebas-melanggar dalam codepage 437. Sedikit peregangan pada aturan, tetapi kalau tidak saya pikir tugasnya tidak mungkin ...Susun kode sumber, bersama dengan program C yang menjalankannya (menggunakan sintaks Visual Studio):
sumber
dec ecx
+and [ecx+32], ah
barang bisa diperhitungkan.0xff
melanggar "Tidak ada tanda baca atau karakter non-alfabet"?PostScript,
889874837835 byteCobalah online!
Ini menggunakan 32 salinan bilangan bulat
89 25 20 6
. Semua kode dari string target dapat diperoleh dengan operasi pada bilangan bulat tersebut, dalam urutan tumpukan: misalnya, 'A' (ASCII 65) adalah 89 - (25 & (20 + 6)). Banyak 4-tupel bilangan bulat memiliki properti ini; ini dipilih karena sangat mudah dibuat.Flat default ke 1, jadi ini menciptakan string dengan panjang 1 (diinisialisasi ke
\0
).dup
bukan salinan yang dalam: ini membuat referensi kedua ke string yang sama. rrand mendorong seed acak, yang defaultnya adalah 0. Stack sekarang["\0", "\0", 0]
.count
mendorong jumlah item dalam tumpukan, jadi ini menghitung 3 ^ (3 * (5 * 6)) = 89.4 * 5 = 20, 5 * 5 = 25, 6 = 6. Stack sekarang
["\0", "\0", 0, 89, 25, 20, 6]
.Gandakan seluruh tumpukan, lima kali. Jadi kita berakhir dengan 32 salinan tumpukan 7-elemen awal kami. Kami hanya perlu 31 salinan, karena string target adalah 31 karakter, tetapi salinan tambahan tidak sakit.
Hitung charcode dari empat bilangan bulat teratas, tulis di indeks 0 dari string, lalu cetak stringnya.
Menekan prompt default.
sumber
Ruby ,
420 354338 byteCobalah online!
Dalam urutan naiknya kecemburuan:
Kata-kata yang dimulai dengan huruf kapital dapat dicetak dengan mendefinisikan kelas dengan nama itu dan memanggil
display
dalam badan definisi kelas.Kata-kata lain dapat ditampilkan dengan mendefinisikan metode dengan nama itu, yang mengembalikan Simbol, kemudian melemparkannya ke String untuk menghapus titik dua utama.
Karakter lain dapat ditampilkan dengan memanggil
putc
kode ASCII mereka. Kita dapat menghasilkan angka yang sesuai dengan menggunakan kembaliString def
trik untuk mendapatkan string, kemudian mengambil jumlah byte-nya menggunakan modulus yang ditentukan oleh ukurannya. Sayangnya, kami tidak memiliki cara untuk memanggil metode pada objek selain dari dalam definisi kelas objek itu, yang membuatnya sulit untuk menyampaikan argumen. Jadi peretasan terakhir adalah mendefinisikan ulangString#inspect
, yang dipanggil secara implisit ketika meneruskan sebuah String kep
metode, sehingga ia menghitung dan mengeluarkan karakter yang sesuai sebagai efek samping, sebelum menaikkan kesalahan sehinggap
tidak dapat benar-benar menyelesaikan eksekusi dan mencetak sebuah garis baru. Maka kita perlu menyelamatkan kesalahan dalam kode utama.Sunting: Jordan membuat hitungan byte jauh lebih sedikit, ahem, tinggi dengan beberapa kontrol aliran golf yang cerdas, dan saya telah memotong beberapa byte lagi dengan mengganti
raise
dengan satu huruf metode panggilan tidak ada, yang menimbulkan NameError.Sunting 2: Memperhatikan bahwa dengan
print String
diekstraksi ke dalam metode, lebih murah hanya menggunakannya dengan definisi metode daripada menggunakan trik definisi kelas, karena metode diizinkan untuk judul judul.sumber
sum size
mendapatkan jumlah modulo ukurannya, tetapi semuanya cek!> <> ,
233122 byteCobalah online!
Ini dimulai sebagai golf jawaban mbomb , tetapi saya menemukan perubahan mendasar yang menghemat banyak byte, jadi saya mempostingnya sebagai jawaban saya sendiri.
Menghasilkan karakter non-alfabetik ke output dilakukan dengan berulang kali mendorong nilai ke stack, lalu gunakan
l
untuk mendorong panjang stack. Namun, ini tidak perlu segera dikeluarkan: menggunakanp
, karakter ini dapat ditempatkan di sel mana pun yang koordinatnya antara 10 dan 15 inklusif, untuk diambil nanti dengang
. Demikian pula, karakter alfabet dapat ditempatkan dalam kode sumber awal dan membaca dengan cara ini: karena kode karakter non-alfabet tertinggi dalam input adalah 46 (.
), ini berarti tumpukan tidak perlu didorong lebih tinggi dari 62 yang diperlukan untuk menyimpan semua 31 karakter dari output.Selain itu, a
v
ditempatkan dalam kode pada kolom 7. Ketika penunjuk instruksi membungkus dan mengenai ituv
, urutango
dieksekusi berulang kali untuk membaca dari koordinat yang didorong dan menampilkan karakter yang sesuai. Akhirnya, tumpukan menjadi kosong, dang
mengakhiri program dengan kesalahan.7 byte kode pertama digunakan kembali ketika 7 koordinat pertama dan 7 koordinat terakhir ditekan. Menempatkan
v
di kolom 9 akan secara teoritis menyimpan dua byte lagi, tetapi akan memaksa karakterAinsv
ke dalam kotak 2x2 dalam kode, yang tidak mungkin. Versi sebelumnya menggunakan kolom 15, tetapi itu membutuhkan garis tambahan dalam kode sumber dan berakhir lebih lama enam byte.sumber
r
untuk memindahkan perataan di mana pun saya inginkan. Namun, bermain golf dengan program ini sedikit mengganggu otak saya.CJam , 262 byte
Cobalah online! Baris baru hanya ditampilkan di sini untuk kejelasan; setiap baris mewakili karakter.
Wah, ini menyenangkan. Membatasi diri dengan perintah alfabet menimbulkan beberapa tantangan menarik:
{
dan}
, hampir tidak ada peluang untuk aliran kontrol (kecualif
, yang saya tidak menemukan kesempatan untuk digunakan).\
,_
,;
, atau$
, kita tidak memiliki alat untuk manipulasi stack.Ini berarti bahwa tujuan utama akan mendapatkan poin kode yang relevan pada stack dan kemudian mengubahnya menjadi karakter dengan
c
.Masalahnya adalah kita juga tidak memiliki sebagian besar perintah aritmatika dasar, serta literal integer. Ini baik-baik saja, karena
m
namespace berisi banyak operasi matematika tingkat lanjut, dan ada banyak variabel yang telah ditentukan untuk angka yang berguna.Saya akhirnya banyak menggunakan akar kuadrat (
mQ
danmq
), fungsi eksponensialme
, dan konversi basis (b
), yang juga dapat digunakan untuk meniru perkalian ([X 0] Yb
menghitung X * Y). Selain itu, kadang-kadang lebih mudah untuk membangun codepoint huruf besar, dalam hal ini kita dapat menggunakanel
(mengkonversi ke huruf kecil) pada karakter yang dihasilkan.Saya masih tidak puas dengan beberapa yang lebih lama. Baiklah.
Penjelasan
Ini adalah penjelasan karakter per karakter dari output. Sebelum saya mulai, berikut adalah beberapa cara singkat untuk membuat angka:
T
,X
,Y
,Z
masing-masing.A
throughK
.Sci
(S
mendorong string yang berisi spasi,c
mendapatkan karakter pertama dari string ini, dani
mengonversi karakter itu ke titik kode-nya).S
juga digunakan untuk spasi.GmQ
(bilangan bulat akar 16).AZbYb
(konversikan 10 ke basis 3, menghasilkan[1 0 1]
, dan mengonversi susunan angka yang dihasilkan menjadi basis 2, menghasilkan 5).Ymei
(compute exp (2) dan convert to integer).A
n
d
s
h
e
a
i
,
'
B
u
t
.
sumber
HYbYCtYbc
,HYbXAtYbc
danHYbXBtYbc
.Deadfish ~ , 943 bytes
Cobalah online!
Tidak ada loop yang diizinkan
:(
sumber
jahat , 198 byte
Cobalah online!
Ini sangat menyenangkan.
sumber
Stax ,
133958479 byteJalankan dan debug itu
sumber
MATL ,
187158 bytesCobalah online!
Versi yang lebih mudah dibaca: Cobalah online! Upaya manual untuk membangun string. Mungkin ada banyak ruang untuk bermain golf dengan memotong talinya menjadi chuncks yang nyaman, menggunakan
P
danh
untuk membalik dan membangun string. Saya harap seseorang akan mengambil tantangan untuk mengalahkan saya. Tantangan utama adalah bahwa Anda tidak dapat menggunakan+
atau-
, jadi aritmatika dasar seringkali tidak memungkinkan.Highlight:
KQthpYq
:KQthp
prime 25 ( )Yq
adalah 97, sesuai dengan surat itua
. Hurufs
(115) dihasilkan dengan cara yang sama dari 113, bilangan prima ke-30. Ini kemudian digunakan kembali secara luas di clipboardJ
.his
dipersingkat dengan menyimpanh
dari sebelumnya di clipboardJ
. Karena itu sebelumnya disimpans
, kami membuathis
terbalik sehingga kami masih dapat mengambils
menggunakan yang baruy
, dan membaliknya setelah menggunakanP
.h
tovle
)sumber
v
akan mengacaukan dengan yangh
saya miliki sebelumnya. Kurasa aku seharusnya tidak hanya berasumsi. Juga, terima kasih atas penghapusan yang terjadi dengan sangat cepat. Saya ingin tahu apakah Anda dapat melakukan lebih baik dari ini ...U
artinya^2
, itu bisa menyelamatkan saya beberapa byte ...MATL , 118 byte
Cobalah online!
Versi yang lebih mudah dibaca (setiap baris sesuai dengan satu karakter, kecuali operasi penumpukan susun).
Penjelasan
Program ini menghasilkan poin kode dari karakter yang diperlukan, sebagai angka independen. Pada akhirnya semua angka-angka tersebut digabungkan menjadi vektor kolom, dibentuk kembali sebagai vektor baris, dan dikonversi menjadi karakter. Hasilnya ditampilkan secara implisit.
Beberapa trik yang digunakan:
0
digunakan untuk sebagian besar ruang, karena hanya biaya satu byte (O
).15
digunakan (dihasilkan sebagaiKUq
), karena kemudian dapat digunakan kembali dengan menambahkannya ke100
(chard
) untuk memberikan115
(s
). Pada kesempatan lain5
digunakan untuk spasi (dihasilkan sebagaiKQ
), sehingga nantinya dapat dikurangkan dari44
(,
) menjadi memberi39
('
).J
digunakan untuk menyimpan karakter yang akan diulang: pertamas
, lalu'
. Demikian pula,H
toko clipboard100
, yang berguna untukd
dan untuk menghasilkan karakter lain.Q
(tambah1
),q
(kurangi1
),E
(dikalikan dengan2
) danU
(kuadrat), bersama dengan literal yang telah ditentukan sebelumnya di clipboardI
(3
) danK
(4
).h
) dan menghitung jumlah (s
) atau perbedaan berturut-turut (d
).100
(d
) dihasilkan seperti4
dalam biner yang ditafsirkan sebagai angka desimal.110
(n
) diperoleh dari65
(A
) dengan mengonversi ke string ('65'
: titik kode[54 53]
), menambahkan1
ke titik kode ([55 54]
), menjumlahkannya bersama-sama dan menambahkan1
.w
), bubble upb
).sumber
O
bukanKWE
untuk spasi. Dan Anda mengkonfirmasi kecurigaan saya bahwa mungkin lebih baik mengorbankan clipboard lainH
.dc ,
240222209 byteCobalah online!
Pikiran pertama saya sama dengan @seshoumara, cukup dorong barang-barang ke stack untuk menghasilkan semua nilai ASCII karakter. Kemudian terpikir oleh saya bahwa sejak
+
,,-
dan*
merupakan operator karakter tunggal, saya dapat membuatnya kembali dan memiliki kemampuan untuk menggunakan aritmatika! Tentunya itu akan lebih kecil!Dan, saya tidak akan terkejut jika saya bisa bermain golf lagi, tetapi untuk sekarang ... pendekatan berbelit-belit ini telah berhasil mengikat yang naif (ish).OOOOOziOOOOOOOOOOOOOOOOOOOOOOOOOOOzddddddzkdddzasBdzasAdzscdzdasCzsd
adalah bagian dari pendekatan yang mirip dengan @ seshoumara, tetapi kami hanya naik ke 46, yaitu.
. Kami melakukan ini karena kami perlu naik ke 45,,-
dan kami juga membutuhkan periode dalam string kami, jadi hanya melangkah lebih jauh untuk periode adalah (saya pikir) termurah. Sepanjang jalan, kami menyimpan beberapa nilai: 5, 32, 39 semua berguna nanti. 5 untuk hal utilitarian, 32 dan 39 untuk nilai ASCII mereka. Awalnya saya melakukan 1-5, tapi itu mahal, dan saya hanya bisa menghindari menggunakan 4; gunakanZ
(pop nilai, tekan jumlah digit yang dimilikinya) pada angka tiga, dua, atau satu digit untuk nilai-nilai tersebut. Pada 42, 43, dan 45, kita mengubah ini untuk string (*
,+
, dan-
masing-masing) dan menyimpannya sebagai macro (B
,A
, danC
masing-masing). Ini berarti bahwa tanpa menggunakan karakter*+-
, kita sekarang dapat menggunakan operator tersebut.Dari sini kita pada dasarnya mulai menghasilkan nilai ASCII menggunakan kekuatan matematika alih-alih akumulasi belaka, menyimpan beberapa pengulangan di sepanjang jalan. 100, 105 dan 115 muncul cukup sehingga menyimpannya (dalam register atau sebaliknya) masuk akal. Awalnya, saya meninggalkan tumpukan diisi dengan 10-an dan menggunakannya untuk membuat 100-an; akhirnya menghemat byte untuk mengisi stack dengan 32-an dan menggunakannya sebagai spasi nanti. Versi yang sedikit lebih mudah dibaca dari bagian ASCII:
OOlAxlAxP OBlBxdIlAxoP AdlBxddsrIlAxssP P OP lsIZlCxddspP OZlCxP P OP lrdZlCxP lsP lrP lcP P KP dZlBxdZlAxP OAZlAxdP IZlCxdP rPdP lpP lrdZlCxP P KP OP P lpP lsP OP ldP KP
.Dipotong 18 byte dengan: menyimpan angka 5 sebagai input radix, bukan register; angka 32 lebih presisi daripada register; angka 115 sebagai output radix bukan register; kemudian harus berubah
KZ
untukIZ
menghasilkan 1s danOZ
untukKZ
menghasilkan 2s.Mencukur 13 byte lagi dengan membanjiri stack dengan 32s; pengaturan presisi ke 39; menggunakan manipulasi tumpukan untuk menghindari penyimpanan 116; memotong beberapa pekerjaan ganda yang tidak sengaja saya tinggalkan.
sumber
a
untuk membuat ulang operator-operator itu, lalu memanggil mereka denganx
. Ini menunjukkan perilaku data-is-code dari dc. Ketika saya punya waktu, saya akan menerapkan trik terbaru Anda menyimpan data ke dalam parameter, bukan register. Apakah Anda pikir kami bisa mendapatkan solusi dc yang lebih pendek dengan menyalahgunakan cara P bekerja untuk mencetak lebih banyak huruf sekaligus jika kami beruntung memasukkan angka besar yang diperlukan hanya dengan menggunakan hex?P
16750 atau 0x416E. Jika kita kebetulan beruntung dan salah satu substring terdiri secara eksklusif dari nilai AF, maka itu mungkin memberi kita jalan pintas. Itu akan sedikit keberuntungan! Kalau tidak, kita akan entah bagaimana memasukkan angka besar entah bagaimana, memunculkannya entah bagaimana, atau melakukan banyak penambahan dan penggandaan dengan 256. Yang tampaknya ... lebih tebal daripada sekelompokP
s.Japt , 87 byte
Cobalah
Penjelasan
Baris pertama menghasilkan
'
dan menugaskannya ke variabelU
.Baris kedua ditugaskan
2
ke variabelV
.Baris ketiga menghasilkan
.
dan menugaskannya ke variabelW
.Baris terakhir, kemudian, membangun string satu karakter sekaligus secara terbalik.
sumber
Qc dGaB
Merah , 272 byte
Jika kutipan ganda diperlukan:
Merah , 344 byte
Tidak bekerja di TIO tetapi bekerja di interpreter Merah.
Penjelasan:
Kata-katanya sepele - Saya prin mereka (cetak tanpa baris baru) sebagai literal dengan
quote
. Merah memiliki kata bawaan untuk ruang -sp
, sertacomma
dandot
."
dan'
lebih menarik: Saya prin mereka dengan mengurangi spasi dariB
danG
masing - masing, mulai dari literalB
danG
, mengubahnya pertama-tama untuk string denganmold
dan kemudian ke karakter (untuk menggunakan pengurangan pada mereka) denganto sp
( Merah memiliki konversi dengan prototipe - mengkonversi string ke jenissp
, yaitu karakter).sumber
'
, jadi solusi 272 byte adalah sama.Keempat (gforth), 351
Sayang sekali saya tidak bisa mendefinisikan ulang CHAR atau EMIT menjadi kata satu huruf, karena itu akan membutuhkan penggunaan salah satu (
:
dan ) misalnya ( atau );
: C CHAR ;
'
' CHAR ALIAS C
Bahkan, jika saya bisa mendefinisikan kata-kata, saya bisa lakukan
: P CHAR EMIT ;
dan kemudian lakukanP x
untuk mencetakx
. Baiklah.Saya bahkan tidak dapat membuat buffer, menulis urutan char ke sana dan kemudian menggunakannya sebagai input, karena menulis ke memori memerlukan penggunaan
!
atauC!
sumber
AlphaBeta ,
180 177 175163 byteCobalah online!
WIP
sumber
Pepe , 266 Bytes
Saya menyimpan r stack kosong, dan memiliki 's' di stack R
Ini bukan pada TIO, tetapi Anda dapat mencobanya di sini
sumber
dc , 240 byte
Gagasan utamanya adalah untuk terus menumbuhkan tumpukan dengan 1 (
K
), menyimpan (sX
) ukuran tumpukan (z
) menjadi register khusus ketika cocok dengan masing-masing kode ASCII unik. Pencetakan (P
) dilakukan sepanjang.Cobalah online!
Saya melakukan beberapa optimasi, seperti tidak menyimpan surat jika tidak digunakan setelah itu, seperti menduplikasi (
d
) surat, misalnya t, pada tumpukan untuk menyimpan byte, karena recall (lX
) adalah 2 byte.sumber
80186+ kode mesin, format MS-DOS .COM,
822787 byteHanya tab dan spasi yang digunakan selain huruf. Mengingat bahwa sebagian besar opcode dalam rentang yang diizinkan adalah peningkatan tertentu, penurunan, dorongan, muncul, dan AND dan OR tidak langsung register, selain IMUL, saya menggunakan fakta bahwa register tumpukan membungkus ketika menyentuh akhir. segmen untuk mengubah kode secara terbalik! Perakitan 80186+ diperlukan karena saya mendorong nilai langsung.
Sumber beranotasi (format TASM):
sumber
Befunge-98 (FBBI) ,
125124121 byteCobalah online! Output ke file bernama
\n
(satu baris baru). Terima kasih untuk Jo King untuk skripnya.Output mencakup 10 baris baru.
Untuk hanya satu trailing newline, +1 byte dengan mengubah baris berikut:
Cobalah online!
Penjelasan:
Penunjuk instruksi bergerak sebagai berikut:
Program ini menempatkan karakter non-alfabet pada posisinya, sebelum mengeluarkan baris itu ke file.
Befunge-98 termasuk instruksi
a
...f
, yang mendorong nilai heksadesimal yang sesuai ke stack. Untuk menghasilkan angka lain, ini meneruskan nilai-nilai itu key
("Dapatkan SysInfo") sebagai argumen untuk mendapatkan:Dengan menempatkan sebagian besar kode pada y = 23,
ayy
dapat digunakan untuk akses berulang ke ukuran tumpukan, yang kemudian digunakan untuk menghasilkan kode karakter.sumber
Pyth , 210 byte
Cobalah online!
Saya menemukan beberapa angka yang dapat diekspresikan hanya dengan huruf (seperti
T
= 10,Z
= 0,lG
= panjang (alfabet) = 26,Cd
= charcode (spasi) = 32), dan beberapa fungsi yang dapat dilakukan hanya menggunakan huruf (sepertit
= decrement,h
= increment,hF
= aplikasi peningkatan yang diulang = penambahan), dan kemudian jalankan pencarian brute force untuk menemukan kombinasi terpendek dari fungsi dan angka yang menghasilkan setiap huruf yang saya butuhkan.sumber
Kode rakitan x86 16-bit, 665 byte
(biner itu alfabet, bukan sumbernya)Saya entah bagaimana lupa tentang aturan yang mengizinkan spasi putih. Tentunya kodenya bisa di-golf-kan.
Bytecode:
Sumber:
Cara kerjanya seperti ini:
memindahkan penunjuk tumpukan ke akhir kode, melalui POP AXE (tidak dapat POP SP karena itu bukan abjad);
membangun instruksi untuk mengirim panggilan DOS (secara algoritmik karena itu bukan abjad);
membangun karakter non-alfabet;
menempatkan string pada tumpukan;
menempatkan instruksi pengiriman pada tumpukan di akhir kode, sehingga eksekusi mengalir langsung ke instruksi itu;
membuat instruksi untuk mencetak string;
menampilkan string dan mereka segera crash. : - / (Pintu keluar yang anggun akan membutuhkan lebih banyak kode)
sumber
Japt , 74 byte
Cobalah
sumber
05AB1E ,
145121109 byteCobalah online!
sumber
80186 kode mesin + DOS, 91 byte
Versi teks:
Versi teks, dengan tab (kode 9) diganti oleh
9
dan spasi (kode 32) diganti oleh*
:Hexdump:
Kode mesin muncul dalam file dengan ekstensi
.com
. Ketika saya menjalankannya, ia mencetak pesan yang diperlukan dan kemudian hang (mengeksekusi data acak).Penjelasan tingkat tinggi tentang apa fungsinya:
,'.$
)int 21
instruksi, yang mencetak pesanKode perakitan (dapat dikompilasi dengan
tasm
):Ia menggunakan
popa
instruksi untuk mem-popup semua register, karena regulerpop
tidak dapat mengisi semua register yang diperlukan (misalnyapop di
opcode terlarang).Alamat byte yang akan ditambal berada dalam kisaran 0x100 ... 0x160. Untungnya, mereka dapat direpresentasikan sebagai jumlah 3 byte dengan nilai yang diizinkan:
bp
si
ataudi
Penambalan byte dalam pesan berfungsi dengan melakukan logis
OR
pada 0x20 (karakter spasi) dan konstanta kecil (4, 7, 12 atau 14). Konstanta kecil diperoleh dengan menginisialisasicx
dandx
ke 9 (karakter tab) dan melakukanINC
atauDEC
sesuai kebutuhan.Menambal kode menggunakan
IMUL
instruksi. Saya menemukan konstanta 16-bit yang diperlukan untuk berkembang biak menggunakan pencarian brute-force.Akhirnya, alamat pesan (0x13b) diperoleh dengan perkalian. Untuk menghemat ruang, saya mengambil salah satu konstanta dari salah satu instruksi, yang berisi nilai langsung
0x96d
. Di sini9
bagian memilih fungsi cetak DOS, dan6d
bagian itu adalah parameter gratis. Ternyata itu6d
adalah satu-satunya kemungkinan yang dapat memberikan 0x13b setelah perkalian.Pembongkaran bagian kode:
Fakta menyenangkan: Biasanya, saya akan menggunakan
offset message
alih-alih kode-keras13bh
, tetapi dalam kasus ini, karena pada saat penguraian alamatnya tidak diketahui, tasm menghasilkan offset langsung 16-bit, membuang 1 byte kode:sumber