Program kotak-kotak adalah program di mana nilai ordinal setiap karakter individu berganti dari genap menjadi ganjil, tidak termasuk terminator garis (yang dapat berupa akhir garis standar).
Program segitiga adalah program di mana setiap baris memiliki satu karakter tambahan dari baris sebelumnya, dengan baris pertama memiliki satu karakter. Anda tidak perlu menangani input kosong.
Tugas Anda adalah untuk membangun program yang memvalidasi bahwa input yang diberikan mematuhi kriteria dan output / mengembalikan sesuatu yang benar jika program memenuhi kriteria, atau sesuatu yang palsu sebaliknya.
Program Anda juga harus memenuhi kriteria ini.
Contoh program yang valid
G
`e
@u^
5r{B
^
cB
+$C
VA01
Aturan
- Program Anda dapat mulai dengan byte ganjil atau genap asalkan paritas karakternya berganti.
- Program Anda harus memvalidasi program yang dimulai dengan karakter ganjil atau genap.
- Untuk karakter unicode, nilai byte yang mendasarinya harus memiliki paritas bolak-balik.
- Anda dapat berasumsi bahwa input hanya berisi karakter yang dapat dicetak. Jika program Anda mengandung unsintables, itu masih bisa memvalidasi dirinya sendiri.
- Program Anda dapat menyertakan satu baris tambahan, ini tidak perlu diizinkan oleh validasi Anda karena Anda dapat menganggap ini dihapus sebelum memvalidasi.
- Celah standar dilarang.
- Kode terpendek dalam byte, dalam setiap bahasa, menang.
code-golf
restricted-source
source-layout
Dom Hastings
sumber
sumber
E\nOE\nOEO
. Semoga itu bisa membantu!Jawaban:
Stax , 26 byte
Jalankan test case online
Saya harus memperkenalkan 3 karakter sampah.
i
adalah no-op ketika di luar semua konstruksi loop.selalu menjadi no-op.
O
melipat 1 di bawah tumpukan, tetapi nilainya tidak digunakan dalam program.Jalankan yang ini
sumber
C (gcc), 189 byte
Cobalah online!
␉
mewakili karakter tab (maaf). Perhatikan bahwa ada beberapa spasi / tab tambahan (saya lebih menyesal). Dokumen asli dengan tab utuh paling baik dilihat di vim with:set tabstop=1
(kata-kata tidak bisa mengungkapkan betapa aku menyesal).Ini adalah fungsi (dipanggil
f
, yang tidak langsung terlihat dengan meliriknya) yang mengambil string sebagai argumen dan mengembalikan salah satu0
atau1
.Saya dapat mengurangi ini dengan setidaknya satu dan mungkin dua atau lebih baris, tetapi perhatikan bahwa itu menjadi semakin berantakan dan usaha rendah menjelang akhir, sebagian besar karena menulis kode yang mengerikan (bahkan dengan standar PPCG) membuat saya merasa seperti orang jahat dan saya ingin berhenti sesegera mungkin.
Ide dasar di sini adalah untuk menghindari konstruksi yang tentu melanggar format (
++
,+=
,return
, dll). Ajaibnya, kata kunci penting sepertifor
,,char
danwhile
(yang akhirnya tidak saya gunakan) kebetulan cocok dengan aturan paritas bolak-balik. Kemudian saya menggunakan spasi (bahkan paritas) dan tab (paritas ganjil) sebagai padding untuk membuat sisanya sesuai dengan aturan.sumber
Haskell ,
10801033 byteCobalah online!
Penjelasan
Ini merupakan tugas yang cukup menarik bagi Haskell.
Keseimbangan
Untuk memulainya kita perlu beberapa cara untuk menentukan apakah suatu karakter memiliki titik kode genap atau ganjil. Cara normal yang dapat dilakukan seseorang adalah mendapatkan titik kode dan memodifikasinya dengan 2. Namun, karena orang mungkin sadar, mendapatkan titik kode dari suatu karakter memerlukan impor, yang karena pembatasan sumber berarti bahwa tidak dapat bekas. Haskeller yang lebih berpengalaman akan berpikir untuk menggunakan rekursi.
Char
Ini adalah bagian dariEnum
typeclass sehingga kita bisa mendapatkan pendahulu dan penggantinya. Namunpred
dansucc
keduanya juga tidak dapat digunakan karena mereka tidak mengganti paritas byte.Jadi ini membuat kita cukup macet, hampir tidak bisa melakukan manipulasi dengan karakter. Solusi untuk ini adalah untuk mem-hardcode semuanya. Kita dapat mewakili (kebanyakan) bahkan karakter sebagai literal, kemungkinan kita memiliki masalah dengan
'
itu aneh sehingga tidak bisa di sebelah karakter itu sendiri membuat literal tidak mungkin untuk mengekspresikan sebagian besar karakter aneh. Jadi kita membuat kode semua byte genap, dan kemudian menambahkan tangkapan semua untuk byte aneh di akhir.Bytes yang bermasalah
Anda mungkin memperhatikan bahwa ada beberapa bahkan byte yang tidak dapat dibuat literal dengan membungkusnya dalam tanda kutip tunggal. Mereka adalah unsintables, newlines dan
\
. Kita tidak perlu khawatir tentang hal-hal yang tidak patut karena selama kita tidak menggunakannya, kita tidak perlu memverifikasi. Bahkan kita masih bisa menggunakan unsintables aneh, seperti tab, saya hanya akhirnya tidak perlu. Newline secara bijaksana dapat diabaikan karena itu akan dipangkas dari program. (Kita dapat memasukkan baris baru, karena itu titik kode agak mudah, tetapi kita tidak perlu). Daun ini sangat valid. Kemudian ketika kita perlu mewakili baris baru kita akan melihat bahwa untungnya memiliki properti yang sama .\
, sekarang\
memiliki codepoint 92, yang nyaman adalah bilangan ganjil diikuti oleh bilangan genap, sehingga\92
berganti-ganti antara genap dan odds dengan demikian literal'\92'
'\10'
Masalah spasi
Sekarang untuk mulai menulis kode aktual kita harus dapat menempatkan sejumlah besar karakter pada satu baris. Untuk melakukan ini, saya menulis topi:
Tutup tidak melakukan apa pun kecuali Haskell valid. Saya awalnya berharap untuk membuat definisi yang akan membantu kami dalam kode nanti, tetapi tidak. Ada juga cara yang lebih mudah untuk membuat tutup, misalnya spasi putih dan titik koma, tetapi mereka tidak menyimpan byte melalui cara ini jadi saya belum repot-repot mengubahnya.
Hardcoder
Jadi sekarang saya memiliki cukup ruang pada sebuah baris saya mulai nilai hardcoding. Ini sebagian besar sangat membosankan, tetapi ada beberapa hal yang menarik. Untuk satu kali garis mulai semakin lama bisa kita gunakan
;
untuk meletakkan beberapa deklarasi pada sebuah baris, yang menghemat satu ton byte.Yang kedua adalah karena kita tidak selalu dapat memulai sebuah baris dengan yang
g
sering kita harus membuat indentasi sedikit. Sekarang Haskell benar-benar peduli tentang lekukan, sehingga akan mengeluh tentang ini. Namun jika baris terakhir sebelum baris indentasi berakhir dengan tanda titik koma, itu akan memungkinkannya. Mengapa? Saya belum pingsan, tapi berhasil. Jadi kita hanya harus ingat untuk meletakkan titik koma di akhir baris.Fungsi Blok Bangunan
Setelah hardcoder selesai, lancar berlayar ke akhir program. Kita perlu membangun beberapa fungsi sederhana. Pertama saya membangun versi
drop
, bernamai
.i
berbeda daridrop
itu jika kita mencoba untuk melewati akhir string itu hanya mengembalikan"y"
.i
berbeda dari drop juga dalam bahwa jika ia mencoba untuk menjatuhkan baris baru itu akan kembali"y"
, Ini akan berguna karena nanti ketika kita memverifikasi bahwa program adalah segitiga ini akan memungkinkan kita untuk kembaliFalse
ketika baris terakhir tidak selesai, atau ketika garis berakhir lebih awal.k
k
True
k
False
Kami kemudian membuat alias untuk
k
,m
.m
hanyak
dengan1
dalam argumen pertama, dan baris baru diawali dengan argumen kedua.Selanjutnya yang kita miliki
o
.o
mengambil nomor dan string. Ini menentukan apakah byte string (mengabaikan baris baru) bergantian dalam paritas (menggunakan kamig
) dimulai dengan nomor input.Terakhir kita memiliki
s
yang berjalano
dengan keduanya1
dan0
, jika berhasil maka itu berlaku untukm
. Jika gagal keduanya hanya kembaliFalse
. Ini adalah fungsi yang kita inginkan. Ini menentukan bahwa input adalah segitiga dan bergantian.sumber
05AB1E ,
3426 byteCobalah online!
Mengambil input sebagai string multiline (input antara "" " ). Penjelasan yang akan datang nanti.
sumber
Java 10, 209 byte
Void lambda mengambil iterable atau array
byte
. Menunjukkan benar dengan mengembalikan secara normal, salah dengan melemparkan pengecualian runtime. Program mengharapkan garis akhir untuk diakhiri dengan benar, yaitu diakhiri dengan karakter baris baru. Baris terakhir dari program ini juga diakhiri.Semuanya dilakukan di bawah UTF-8, dengan interpretasi bahwa "karakter" mengacu pada poin kode Unicode.
Tab diganti dengan spasi dalam tampilan ini.
Cobalah secara Online
Hex dump
Kembalikan dengan
xxd -p -r
di Unix.Tidak disatukan
f
adalah jumlah karakter yang diharapkan pada baris saat ini,h
adalah jumlah karakter yang terlihat sejauh ini pada baris saat ini,c
adalah byte terakhir yang terlihat, danb
apakaha
adalah baris baru.Kondisi
a > -65
menguji apakaha
byte pertama dalam sebuah karakter. Ini berfungsi karena karakter single-byte (ASCII) nonnegatif dalam komplemen 8-bit two, byte pertama dari karakter yang lebih panjang memiliki bentuk biner11xxxxxx
(setidaknya -64 dalam komplemen dua), dan byte non-leading dalam karakter tersebut adalah dari formulir10xxxxxx
, paling banyak -65 dalam pelengkap dua. ( Sumber )Ketika sebuah karakter melanggar pola segitiga atau kotak-kotak (yaitu baris baru muncul lebih awal atau lebih lambat atau satu byte dari paritas yang salah muncul), cabang kiri terner terkait (dalam penugasan ke
f
atauc
) diaktifkan dan metode melempar pengecualian aritmatika.sumber
Python 3 (3.4?), 350 byte
Tantangan rumit untuk bahasa tertentu tentang spasi putih sebagai Python 3. Kiriman dicetak
0
atau1
standar keluar dan macet untuk beberapa input. Program mengharapkan garis akhir untuk diakhiri dengan benar, yaitu diakhiri dengan karakter baris baru. Baris terakhir dari program ini juga diakhiri. UTF-8 digunakan untuk memeriksa paritas byte.Tab diganti dengan spasi dalam tampilan ini.
Bekerja untuk saya dengan Python 3.4.2; tidak berfungsi pada Python 3 apa pun di TIO. Menurut saya bug di penerjemah TIO.
Hex Dump
Kembalikan dengan
xxd -p -r
di Unix.sumber