pb , 83 byte
^<b[1]>>>w[B!0]{<w[B!0]{t[B]<b[T]>>}<b[0]<b[0]<[X]>>}w[B=0]{<}t[B]<[X]t[B+T]vb[T/2]
Meskipun setidaknya ada 3 karakter dalam string input, yang pertama dan terakhir dihapus. Ini menyisakan 1 karakter (harus dicetak tidak dimodifikasi) atau 2 (harus dirata-rata dan dicetak). Untuk menangani ini, karakter pertama dan terakhir dari string ditambahkan bersama-sama dan dibagi dua. Jika hanya ada satu karakter (a+a)/2==a
,. Jika ada dua,(a+b)/2
adalah karakter yang perlu dicetak. pb "meminjam" evaluasi ekspresi Python ( def expression(e): return eval(e, globals())
) jadi ini secara otomatis didasarkan.
Menangani input kosong menghabiskan biaya 5 byte. Secara khusus, <b[1]>
pada baris pertama. Sebelumnya, ketika saya mengatakan "string", itu adalah kebohongan total. pb tidak memiliki string, ia memiliki karakter yang berdekatan satu sama lain. Mencari "karakter terakhir dari string" hanya berarti menggerakkan kuas ke kiri hingga menyentuh karakter. Ketika tidak ada input yang disediakan, loop "sementara setidaknya ada 3 karakter" dilewati seluruhnya dan mulai mencari karakter terakhir. Tanpa itu <b[1]>
, ia akan terus mencari selamanya. Kode itu menempatkan karakter dengan nilai 1 pada (-1, -1) khusus ditemukan ketika input kosong. Setelah menemukan "karakter terakhir" dari string kuas mengasumsikan yang pertama adalah pada (0, -1) dan langsung ke sana, menemukan nilai 0. (1+0)/2
adalah 0 dalam pb,
Tapi monorel, itu masih dicetak! Spesifikasi tantangan mengatakan (empty input) => (empty output)
! Bukankah mencetak kecurangan karakter nol? Juga, ini tidak berhubungan, tetapi Anda cerdas dan tampan.
Terima kasih, penanya-pertanyaan hipotetis. Sebelumnya, ketika saya mengatakan "cetak", itu adalah kebohongan total. Di pb, Anda tidak benar-benar mencetak nilai, Anda cukup meletakkannya di kanvas. Daripada "cara untuk output", lebih tepat untuk membayangkan kanvas sebagai array 2D yang sangat besar. Ini memungkinkan indeks negatif di kedua dimensi, dan banyak pemrograman di pb benar-benar memastikan sikat sampai ke lokasi di kanvas yang Anda inginkan. Ketika program selesai dieksekusi, semua yang ada di kanvas dengan koordinat X dan Y yang tidak negatif akan dicetak ke lokasi yang sesuai di konsol. Ketika program dimulai, seluruh kanvas diisi dengan nilai 0. Agar tidak harus mencetak jumlah baris yang tak terbatas, masing-masing dengan jumlah byte nol yang tak terbatas, setiap baris output hanya dicetak hingga karakter bukan nol terakhir, dan baris hanya dicetak hingga yang terakhir dengan karakter bukan nol di dalamnya. Jadi menempatkan a0
at (0, 0) masih merupakan output kosong.
Tidak Disatukan:
^<b[1]> # Prevent an infinite loop on empty input
>>w[B!0]{ # While there are at least 3 chars of input:
<w[B!0]{ # Starting at the second character:
t[B]<b[T]>> # Copy all characters one position to the left
# (Effectively erasing the first character)
}
<b[0]<b[0] # Delete both copies of the last character
<[X]>> # Get in place to restart loop
}
w[B=0]{<} # Go to last character of remaining string
t[B]<[X]t[B+T] # Find it plus the first character
vb[T/2] # Divide by 2 and print