Ini Calvin . Hanya berusaha mendapatkan 20 rep sehingga pengguna ini dapat mengobrol di chatroom PPCG Minecraft Server .
Tulis program atau fungsi yang menggunakan bilangan bulat positif.
Jika bilangan bulat genap (2, 4, 6, ...), cetak atau kembalikan string seni ASCII ini:
__ __ __ __ ___
/\ /\ | |\ | | / | | /\ | |
/ \/ \ | | \ | |-- | |--\ /__\ |-- |
/ \ | | \| |__ \__ | \ / \ | |
Jika bilangan bulat ganjil (1, 3, 5, ...), cetak atau kembalikan string seni ASCII ini:
__ __
\ / | | /| | / | / \ __ / | |
\ /\ / | | / | |-- | |--/ \ / |-- |
\/ \/ | |/ | |__ \__ |__| \/ |__ _|_
Anda mungkin menganggap input selalu bilangan bulat positif.
Dalam kedua kasus keluaran, secara opsional mungkin ada sejumlah ruang trailing hingga ke tepi kanan "T" pada setiap baris, dan / atau satu baris trailing tunggal. Perhatikan bagaimana ada dua kolom spasi di antara setiap huruf.
Kode terpendek dalam byte menang.
code-golf
ascii-art
kolmogorov-complexity
Relay Obrolan Lama
sumber
sumber
Jawaban:
JavaScript (ES6),
343336289267265260 byteHanya untuk bersenang-senang ... :) (Terima kasih kepada Xufox karena telah memotong 46 byte, dan mendorong saya untuk memotong 37 byte saya sendiri.)
Disebut sebagai
a(4)
atau mirip. Coba di sini:Tampilkan cuplikan kode
Saya telah meringkas spasi putih menjadi string digit dari
2
ke8
(misalnya887
= 23 spasi). Setiap digit kemudian diganti dengan jumlah spasi yang sesuai.0
mewakili| |
, dan1
mewakili__
. Secara keseluruhan, program ini lebih pendek 170 byte dari gabungan dua string (203 + 227 = 430), jadi saya senang. :)Sunting: Entah bagaimana, panjangnya persis sama dengan satu-satunya entri lain pada saat ini .... o_o
Edit 2: Disimpan beberapa ruang dengan mengubah
n%2<1?
ken%2?
dan bertukar string. Juga mengambil keuntungan dari fakta bahwa awal dari dua string adalah sama untuk mengurangi 5 byte lainnya.Sunting 3:
|2|
tampaknya menunjukkan banyak sekali, jadi setiap kejadian disederhanakanx
, menghemat 7 byte. Saran Xufox memotong 40 byte lagi.Sunting 4: Saran Xufox untuk mengganti
\n
dengan jeda baris yang sebenarnya terbayar, menghapus 6 byte dari total. Mengubahx
ke0
dan__
ke1
(masukkan tawa jahat di sini), kemudian menggabungkan semua (masukkan jamak dari Regex di sini), seperti yang ia lakukan dalam entri, menyimpan tambahan 16 byte.Sunting 5: Karena saya telah memilih untuk menggunakan standar ES6, saya menggunakan interpolasi string templat kustom untuk mengurangi 2 byte terakhir.
sumber
.replace(/\d/g,d=>' '.repeat(d))
?\n
menghemat satu byte per jeda baris?Matlab,
343341Nomor input disediakan dari stdin.
Contoh dijalankan:
sumber
CJam,
158149145138 byteDi atas menggunakan notasi tanda kuret, karena kode mengandung karakter yang tidak patut dicetak.
Cobalah online di juru bahasa CJam .
Jika permalink tidak berfungsi di browser Anda, Anda dapat menyalin kode dari paste ini .
Contoh dijalankan
Ide
Alih-alih menyandikan string MINECRAFT (diisi untuk mencapai panjang garis konstan) secara langsung, kami akan menyandikan versi "zip", di mana baris dan kolom telah ditransposisi.
Setelah zip dan menghapus umpan baris, string ini (sebut saja R ) harus dikodekan:
Ada banyak spasi, jadi kami akan mengganti setiap kemunculan triplet ruang dengan linefeed.
Ini memberi kita tujuh karakter yang berbeda (
\n -/\_|
), jadi kami menetapkan masing-masing angka dari 0 hingga 6 dan mempertimbangkan digit array yang dihasilkan dari nomor basis 7, yang kemudian kami encode sebagai string byte.Decoding bekerja dengan membalik langkah-langkah dari atas.
String cermin dapat dibangun dari yang asli.
Jika kami membalik urutan keempat baris dan menukar solidus, kami mendapatkan yang berikut:
Entah bagaimana mirip, tapi kami jelas harus memutar baris untuk membawa baris bawah ke atas:
Itu akan terjadi jika bukan karena garis bawah sial itu.
Jika kita membaca string asli dari atas ke bawah dan mengabaikan umpan baris (sehingga mendapatkan R ) dan mengganti setiap garis bawah diikuti dengan spasi dengan spasi diikuti dengan garis bawah sebelum menggeser baris, ini hasilnya:
Jauh lebih baik! Semua yang tersisa untuk dilakukan adalah menghapus ruang pertama dari baris pertama (pergeseran semua garis bawah pada baris pertama kiri karakter), memindahkan garis bawah salah tempat di E dan C satu baris dan membuang garis bawah lebih T .
Kode
sumber
Pyth - 182 byte
Menggunakan pendekatan pengkodean dasar. Karena pengindeksan adalah modular dalam Pyth, saya bahkan tidak perlu melakukan apa pun untuk bahkan aneh, cukup taruh di urutan yang benar, dan gunakan
@Q
. Sebagai bonus, ini juga berfungsi dengan angka negatif.Saya hanya mencoba meng-enkode yang pertama, kemudian membalik dan mengganti garis miring, tetapi baris pertama dan terakhir terlalu sulit.
Saya bisa menyimpan 6 byte dengan memasukkan byte sebenarnya dalam kode, tapi itu terlalu banyak kesulitan.
Cobalah online di sini .
Terlihat online sangat buruk karena kotak output terlalu kecil dan membungkus. Saya merekomendasikan mengutak-atik konsol dev dan mengubah
col-md-5
kecol-md-7
.sumber
JavaScript (ES6),
312,285,281,272,270,263,262, 260Untuk pengeditan sebelumnya, lihat riwayat edit .
Sunting 5: Dalam konversi, saya mengganti nomor yang terkait dengan
-
(sekarang 0) dan spasi putih (sekarang 1). Di blok yang dihasilkan, angka 1, 2 dan 3 tidak digunakan lagi. Ini memungkinkan saya untuk menggunakan array dengan nomor yang hilang.Sunting 6: Meningkatkan array literal. Saya mencoba ini sebelumnya, tetapi menggunakan
777
dan77
sebagai string bukan angka dan hanya memperhatikan sekarang bahwa saya telah melewatkan ini.Sunting 7: "Kode Golf" adalah fungsi, seperti yang ditentukan oleh pertanyaan dan tidak perlu untuk
f=
memenuhi spesifikasi ini. Jadi, menghapusnya, menghemat dua byte.Runnable di Firefox 39:
Ini didasarkan pada sistem angka 6 dasar dan setiap karakter ASCII singkatan dari angka:
Kemudian, saya telah menggabungkan representasi angka dari setiap string ASCII. Sebagai contoh: ketika string ASCII pertama berisi
/
pada satu posisi dan yang lain berisi\
pada pada posisi yang sama , posisi itu menjadi32
, yang merupakan basis 6 (20
dalam desimal). Jika Anda mengonversinya menjadi basis 36 (untuk mendapatkan satu nomor basis-36 untuk setiap dua nomor basis-6), Anda dapatkank
.Semua ini dilakukan sebelumnya dan fungsi dasarnya membatalkan proses ini.
Sekarang kedua jawaban JavaScript masing-masing memiliki satu jawaban lainnya masing-masing, yang memiliki jumlah byte yang sama ...PS: Sebagai catatan untuk diri sendiri dan referensi ke orang lain, ini adalah kode yang saya gunakan:
sumber
~NaN == -1
?![…][x]+77
,77
tidak perlu menjadi string lagi), tapi tambahan membalikkan dalam kode golfed tidak membuatnya sepadan ...isNaN
dengan1+
, dan~~(i/6)
dengani/6|0
.f=
di awal, tapi saya punya. Saya juga membaca bahwa itu diterima untuk menghapusnya, jadi saya akan melakukannya sendiri, dan sekarang saya memiliki 260 byte. ;)CJam, 136 byte
Di atas menggunakan notasi tanda kuret, karena kode mengandung karakter yang tidak patut dicetak.
Linefeed semata-mata untuk "keterbacaan". Cobalah online di juru bahasa CJam .
Jika permalink tidak berfungsi di browser Anda, Anda dapat menyalin kode dari paste ini .
Contoh dijalankan
Ide
Pendekatan ini memiliki beberapa kesamaan dengan yang ada di jawaban saya yang lain , tetapi jauh lebih sederhana dan (agak mengecewakan) sedikit lebih pendek.
Kami mencari cara untuk menyandikan string berikut:
Setelah melapisi setiap baris (untuk mencapai panjang garis konstan), zipping (mentransposisi baris dan kolom) dan menghapus umpan baris, string ini harus dikodekan:
Kami akan mengganti setiap substring
" |||"
dengan 0 , setiap substring" "
dengan 1 dan karakter"/-_\| "
dengan 2 hingga 7 , membentuk array dari basis 8 digit, yang dapat dikodekan sebagai string byte.Decoding bekerja dengan membalik langkah-langkah dari atas.
Kode
sumber
Raket,
443434386 BytesHanya untuk iseng.
NB, Anda mungkin perlu menjalankan
#lang racket
jalur di DrRacket.sumber
05AB1E ,
179177176 byteCobalah online.
Penjelasan:
adalah angka yang dikompresi :
Cobalah online.
7в
mengubahnya menjadi Basis-7 sebagai daftar, jadi kami mendapatkan daftar digit:Cobalah online.
è
mengindeks setiap digit dalam string"\n-/\_|"
, danJ
kemudian menggabungkan seluruh daftar bersama, yang memberi kita yang berikut:Cobalah online.
2ä
membelah string menjadi dua bagian.Iè
mengambil input, dan mengindeksnya (dengan bungkus otomatis) untuk mendapatkan salah satu dari dua bagian, yang kemudian menjadi keluaran secara implisit.Terima kasih banyak kepada ASCII kompresor @MagicOctopusUrn yang digunakan untuk menghasilkan angka terkompresi dan transliteral Base-7. Cobalah online. (Setelah itu transliterate telah di-golf dengan membalikkan string dan nomor pada stack, menggunakan
в
alih-alihB
membuatnya menjadi daftar angka, dan mengindeks ke dalam string denganè
.sumber
C, 251 byte
Ini adalah fungsi
k
yang menerima parameter dan mencetak pesanstdout
.Versi yang lebih mudah dibaca:
Pertama, ia menyiapkan pesan kosong (diisi dengan spasi). Untuk setiap karakter (misalnya
|
atau-
), ia memiliki daftar posisi untuk menempatkan karakter itu.Untuk setiap posisi, jika versi terbalik harus dicetak, posisinya terbalik. Artinya, koordinat vertikalnya
y
diganti oleh4-y
atau3-y
(tergantung pada apakah karakternya garis bawah). Juga, arah garis miring dibalik - ini dilakukan olehXOR
dengan115
.Struktur kontrol ini juga digunakan untuk menempatkan karakter baris baru - tampaknya lebih efisien untuk menambahkan 4 koordinat lebih ke daftar daripada menulis loop eksplisit.
Ada beberapa gangguan kecil dengan sistem ini. Pertama-tama, huruf terakhir T terlihat sedikit berbeda dalam versi terbalik:
Untuk menampilkannya dengan benar, kode harus menempatkan
|
karakter setelah_
karakter.Selain itu, untuk memastikan string kontrol hanya berisi karakter ASCII, saya menyandikannya:
37
ditambahkan kepada mereka, untuk menggesernya ke dalam ASCII Range 32 ... 127. Saya bisa menambahkan angka yang lebih kecil, tetapi37
menghindari karakter seperti"
dan\
, yang harus melarikan diri dalam string literal.-
karakter pertama muncul di posisi 137. Untuk menjelaskan ini, saya menambahkan-
karakter buatan di posisi lain (79), yang kemudian ditimpa - karakter tersebut|
juga muncul di posisi 79.Hal lucu lainnya adalah saya tidak bisa menggunakan
puts
untuk mengeluarkan string - ini akan menghasilkan baris tambahan tambahan. Jadi sayaprintf
malah menggunakannya .Juga, angka
57
muncul 4 kali dalam kode golf - ekspresi yang tampaknya bertele-tele(w%2?4-i/6-p/57:p/57)*57+p%57
memungkinkan untuk menghilangkan variabely
, membuat kode lebih pendek.sumber
Perl,
292259246 byteIni mengambil keuntungan dari fakta bahwa kedua string sebagian besar mirip (misalnya seluruh IE dan C) dan membuat string dari karakter yang ditampilkan berbeda tergantung pada versi yang sedang ditampilkan. misal m berarti "garis miring ke depan untuk string arah kanan, garis miring ke belakang di atas". Itu substitusi transliterasi untuk menampilkan karakter yang benar. Spasi juga run-length dikodekan menggunakan pergantian string.
multi-line:
Ide:
Karena hanya ada 22 kolom unik dalam output, seharusnya dimungkinkan untuk menyimpannya sebagai 22 * 4 = 88 karakter dengan kisaran 0-17 (semua karakter "dua arti" yang mungkin), bersama dengan pencarian 56 karakter tabel dengan satu entri di kisaran 0-21 per kolom. Secara teori ini bisa dikodekan dengan <100 byte tetapi sulit untuk membuat ini menjadi kemenangan karena kode yang lebih rumit untuk memecahkan kode itu.
sumber
CJAM, 206
Dua gambar ascii dikodekan base-216, satu byte = 3 karakter.
Uji di sini
sumber
Powershell,
275253248 byteSkrip uji:
Keluaran:
Ide utama
Metode kompresi adalah metode diperpanjang CJam oleh Dennis ♦:
Script untuk kompresi:
String kompresi sebelum adalah:
sumber
SAS, 442 byte
Non-golf:
Tes:
Mungkin bisa menyimpan sedikit kode dengan meletakkannya di blok input, tetapi itu menambahkan batasan bahwa makro hanya bisa sekali per datastep yang saya rasa melanggar semangat menulisnya sebagai makro. (Dan saya menduga menambahkan prompt untuk mendapatkan input di datastep menambahkan lebih banyak karakter).
sumber
bash, 247 byte
String digabungkan dan di-gzip.
sumber
PHP, 225 byte
Jelek, solusi kekerasan.
Saya mengompres kemudian base64 menyandikan string bersambung untuk ditampilkan. Kode ini diterjemahkan, didekompresi, dan dipecah menjadi 224 karakter. String pertama adalah 224 karakter tanpa baris baru, yang kedua adalah 201 karakter (juga tidak ada baris baru setelah itu). Paritas argumen baris perintah (
$argv[1]%2
) digunakan sebagai indeks dalam array yang dihasilkan olehstr_split()
.sumber
Haskell, 138 byte
Ini sedikit peretasan. Saya bruteforcing hash SHA256 dari concatination dari dua teks minecraft, dan kemudian membaginya terpisah dan memilih teks yang sesuai berdasarkan parameter x. Ini adalah keberanian yang sangat tidak praktis dan tidak dapat dihitung secara real time, dan bahkan mungkin ada tabrakan di sepanjang jalan untuk semua yang saya tahu.
Karena Haskell tidak dapat memiliki representasi ASCII dari hash dalam sebuah string, saya membacanya dari file yang disebut "a", dan karenanya telah menambahkan 32 byte ke skor saya.
Penjelasan:
Membuat daftar setiap kombinasi huruf "/ \ | _-" pada 425 huruf (panjang kedua teks minecraft digabungkan)
Pilih yang pertama yang cocok dengan hash
Panjang teks pertama adalah 225 huruf, yang lain persis 200.
sumber
Javascript (ES6),
403296 byte(Dipindahkan dari jawaban saya sebelumnya ) Mencoba metode baru:
Perhatikan bahwa ada beberapa karakter yang tidak patut dicetak; ini telah diganti dengan mis
\x83
.Pengkodean itu sendiri sekitar 40 byte lebih pendek dari yang lain, tetapi proses decoding lebih rumit. Saya menggunakan sistem base-216 yang digunakan orang lain untuk menyandikan teks. Untuk referensi, inilah kode yang saya gunakan:
Ini pada dasarnya mengambil teks ASCII (pra-dikonversi ke basis 6) dan tiga kali lipat dengan sendirinya, mengubahnya menjadi basis 216. 53 kemudian ditambahkan untuk menghapus sebagian besar karakter yang tidak dapat dicetak.
Saran diterima!
Berikut kode asli 403-byte:
Menggunakan
for
loop,while
loop, empat variabel yang hanya digunakan sekali, dan satu ton algoritma panjang untuk hal-hal sederhana. Wah, sudahkah saya membaik ...sumber
y=[' ','/','|','\\','_','-'],
dan bukannyay[x]
menulis' /|\\_-'[x]
. =)Python, 312 byte
Fungsi mencetak keluaran yang diberikan int
sumber
C, 321 byte
Mengodekan pengulangan dan indeks karakter ke dalam string.
sumber
Python 3, 486
533612sumber
PHP , 263 byte
Cobalah online!
sumber
Ruby, 290 byte
Mungkin entri yang lemah dan tidak bisa diperbaiki. Pada dasarnya kompresi (buatan tangan) yang sangat sederhana di mana huruf kecil berarti bahwa banyak spasi (sebenarnya ord (ch) - spasi 'A') dan huruf besar hanyalah beberapa istilah umum yang menghemat beberapa byte.
sumber
SOGL V0.12 ,
7271 byteCoba Di Sini!
Mirroring vertikal SOGL bekerja dengan sempurna untuk ini.
sumber
Kanvas , 70 byte
Coba di sini!
sumber