Sebuah counterstring adalah semacam data uji self-describing yang digunakan dalam pengujian perangkat lunak. Tidak yakin itu sebenarnya diciptakan oleh James Bach , tapi saya tahu itu dari sana.
Idenya adalah sebagai berikut: data uji berisi banyak asterisk ( *
). Angka di depan tanda bintang memberi tahu Anda berapa lama data uji pada titik itu. Jika Anda perlu mengetahui posisi dalam data uji yang bukan tanda bintang, cari tanda bintang terakhir, lihat nomor sebelumnya dan tambahkan jumlah digit yang mengikuti.
Urutannya dimulai seperti ini:
2*4*6*8*11*14*17*20*23*
^
Seperti yang Anda lihat, tanda bintang yang ditandai ada di posisi 14.
Jika suatu file terpotong sebagai berikut
[...]2045*20
maka Anda dapat memperoleh bahwa ada batas 2047 karakter di suatu tempat (2045 di mana tanda bintang plus 2 untuk 2
dan 0
).
Adalah tugas Anda untuk membuat program terpendek (ini adalah kode-golf ) yang menampilkan (std :: out atau file atau apa pun) string uji panjang sewenang-wenang dari format itu. Panjang karakter diberikan sebagai argumen. Program harus mendukung hingga 2 GB data uji (nilai input 2147483647 karakter).
Posisi "Berbahaya" dalam file 2 GB:
8*11*
98*102*
998*1003*
9998*10004*
99998*100005*
999995*1000003*
9999995*10000004*
99999995*100000005*
999999995*1000000006*
Ini harus menjawab pertanyaan @Leaky Nun jika ada keputusan untuk membuat antara 995 * 999 * dan 995 * 1000 * atau serupa: tidak.
Akhir dari file 2 GB dengan nilai input 2147483647 adalah:
2147483640*2147483
995*999*
dan995*1000*
atau sesuatu seperti itu?Jawaban:
Haskell,
6058 byteSebagai fungsi kita dapatkan:
Program penuh,
7270 byteIni menghasilkan counterstring tak terbatas untuk STDOUT:
Memasukkan panjang membutuhkan 20 byte tambahan:
Ini berfungsi hingga kira-kira ukuran RAM Anda, karena Haskell default tipe integral numerik untuk
Integer
.sumber
Pyth,
25171514 byteCobalah online.
Panjang diambil melalui STDIN.
sumber
Python 2,
7472666461 BytesMengambil bilangan bulat n dan menghasilkan panjang hitung mundur n.
versi program, 69 Bytes:
Mengambil integer n dari stdin dan mencetak counterstring dengan panjang n.
Versi alternatif yang lebih pendek, tetapi hanya berfungsi, hampir:
sumber
PowerShell v5, 97 byte
Mengambil input sebagai argumen baris perintah
$n
, menyetel helper$l
yang kami gunakan untuk melacak panjang integer kami. Lalu, kita putar dari0
atas ke$n
. Setiap iterasi, kami bertambah$i
dengan.length
string yang terbentuk dari$i
dan tanda bintang. Kemudian, jika.length
dari$i
berubah (misalnya, kami pindah dari 2 digit ke 3 digit), kita kenaikan kedua pembantu$l
variabel ength dan$i
(untuk akun untuk digit tambahan). Kami kemudian menggunakanadd-content
perintah untuk menambahkan"$i*"
file.\o
dalam direktori saat ini, dengan-n
oNewLine.NB
-noNewLine
parameter akhirnya ditambahkan di versi itu.[int]
menjadi[double]
(tidak, saya tidak tahu mengapa itu tidak masuk[long]
), jadi ini akan menangani input hingga dan lebih dari2147483648
, tanpa masalah. Secara teoritis, ini akan menangani input di suatu tempat hingga sekitar1.79769313486232E+308
(nilai maks[double]
) sebelum mengeluh, tapi saya berharap disk untuk diisi sebelum itu terjadi. ;-)10
ini akan menghasilkan2*4*6*8*11*
, karena11
nilai pertama$i
lebih besar dari input.PowerShell v2 +, juga 97 byte (tidak bersaing)
Alih-alih mengirim ke file, ini merangkum iterasi loop dan kemudian
-join
mereka bersama-sama menjadi sebuah string. Ini memungkinkannya bekerja untuk versi yang lebih awal dari v5. Namun, sejak. NET mendefinisikan[string]
dengan konstruktor sepertiString(char c,Int32 length)
, versi ini tidak memenuhi persyaratan input maks, karena string output akan meluap dan muntah.Juga, Anda mungkin tidak ingin memiliki string ~ 2GB melayang di dalam pipa Anda. Katakan saja.
sumber
[double]
s adalah 64-bit. Sebagai contoh, menjalankanfor($i=2147483645;$i-lt2147483655;$i++){"$i - " + $i.GetType()}
akan menunjukkan perkembangan yang stabil dari$i
tetapiType
perubahan di2147483648
kedouble
. Saya yakin pada titik tertentu itu akan berhenti bekerja, kemungkinan sekitar ~ 15 digit presisi atau ketika.ToString
mulai menggunakane
. Itu[double]::MaxValue
lebih seperti lelucon membuang-buang daripada batas atas yang serius.Python 3,
12611499 byteFungsi yang mengambil input melalui argumen jumlah karakter yang digunakan untuk memotong string, dan mencetak ke STDOUT.
Bagaimana itu bekerja
Perbedaan antara angka-angka dalam string awalnya 2. Setiap kali urutan besarnya dilewati, perbedaan ini meningkat sebesar 1; ini dapat dicapai dengan mengambil perbedaan antara jumlah digit dari angka saat ini dan jumlah digit dari angka saat ini ditambahkan ke perbedaan, yaitu 1 hanya bila diperlukan. Fungsi ini hanya loop sementara panjang string kurang dari input, ditambahkan ke string dan memperbarui perbedaan dan nomor yang diperlukan, dan kemudian memotong sebelum dicetak.
Cobalah di Ideone
Versi keluaran tanpa batas, 69 byte
sumber
R, 92 byte
Contoh output:
sumber
Jelly ,
221918 byteCobalah online!
Temukan
n
angka pertama dalam string kemudian gabungkan daftar dengan tanda bintang. Ini akan selalu lebih lama darin
yang diizinkan oleh OP dalam komentar.Program secara selektif memperbarui register dengan nomor saat ini dalam urutan dalam
#
loop dengan¹©=¡
. Saya berharap ini bisa lebih pendek, dengan menempatkan©
setelahµ
contoh misalnya, tapi sayangnya itu tidak berhasil dan saya tidak dapat menemukan hal yang lebih pendek.sumber