Ini tantangan pertama saya di ppcg!
Memasukkan
String yang terdiri dari dua karakter ascii yang berbeda. Sebagai contoh
ABAABBAAAAAABBAAABAABBAABA
Tantangan
Tugasnya adalah untuk memecahkan kode string ini mengikuti aturan berikut:
- Lewati dua karakter pertama
- Pisahkan sisa string menjadi grup 8 karakter
- Di setiap grup, ganti setiap karakter dengan
0
jika karakter itu sama dengan karakter pertama dari string asli, dan dengan yang1
lain - Sekarang setiap grup mewakili byte. Ubah setiap grup menjadi karakter dari kode karakter byte
- Menggabungkan semua karakter
Contoh
Mari kita decode string di atas.
AB AABBAAAA AABBAAAB AABBAABA
^^ ^ ^ ^
| | | |
| \---------|---------/
| |
Skip Convert to binary
Perhatikan bahwa itu A
adalah karakter pertama dalam string asli dan B
yang kedua. Karena itu, ganti masing A
- masing dengan 0
dan masing B
- masing dengan 1
. Sekarang kami memperoleh:
00110000 00110001 00110010
yang ada [0x30, 0x31, 0x32]
dalam biner. Nilai-nilai ini mewakili karakter ["0", "1", "2"]
masing-masing, sehingga hasil akhirnya seharusnya 012
.
Mencetak gol
Ini, tentu saja, kode-golf , yang berarti membuat kode Anda sesingkat mungkin. Skor diukur dalam byte.
Batasan dan format IO
Aturan standar berlaku. Berikut ini beberapa aturan tambahan:
- Anda dapat menerima input yang valid
- String input terdiri dari tepat dua karakter yang berbeda
- Dua karakter pertama berbeda
- Panjang minimal dari string input adalah 2 karakter
- Panjangnya akan selalu memberikan 2 modulo 8
- Anda dapat menganggap bahwa string hanya akan selalu terdiri dari karakter ASCII yang dapat dicetak
- Baik dalam input maupun dalam string yang diterjemahkan
- Whitespace terkemuka dan tertinggal diizinkan dalam output (semua yang cocok
/\s*/
)
Jawaban:
brainfuck ,
76 7165 byte-6 byte terima kasih kepada Nitrodon!
Cobalah online!
Terasa aneh mengalahkan Python ...
sumber
Stax ,
1511 byteJalankan dan debug di staxlang.xyz!
Pendekatan cepat dan kotor. Bekerja untuk memperbaikinya.Memperbaikinya!Dibongkar (13 byte) dan penjelasan
sumber
JavaScript (Node.js) , 67 byte
Cobalah online!
Bagaimana?
Kami menggunakan dua sintaks yang berbeda dari
Buffer
konstruktor:Buffer([n])
menghasilkan buffer yang berisi byte tunggal n dan dipaksa ke karakter ASCII yang sesuai. Hanya 8 bit n paling signifikan yang dipertimbangkan.Buffer(n)
menghasilkan buffer n byte. Oleh karena itu,Buffer(0)
menghasilkan buffer kosong, yang dipaksa ke string kosong.Catatan: Keduanya tidak digunakan lagi dalam versi Node terbaru.
Buffer.from([n])
danBuffer.alloc(n)
harus digunakan sebagai gantinya.Berkomentar
sumber
bash,
595852 byteCobalah online!
Terima kasih kepada Sapi dukun untuk menghemat 6 byte.
Tantangan ini bekerja sangat baik dengan serangkaian coreutils (dan
dc
untuk melakukan konversi dan output di akhir). Pertama, kita gunakanuntuk mentransliterasikan dua karakter dalam input ke nol dan satu. The
-t
bendera memotong argumen pertama dengan panjang kedua, jadi ini untuk mengurangi transliterasi dua karakter pertama di input ke0
dan1
, yang adalah apa yang kita inginkan. Kemudian,menghapus dua karakter pertama, dan
menghasilkan 8 karakter per baris. Akhirnya,
sed
perintah mengubah setiap baris menjadidc
potongan yang membaca angka sebagai biner dan menampilkan byte tersebut.sumber
cut -c
dapat dihapus)Kode mesin Z80 pada BPK Amstrad,
32 3130 byteKode mengambil instruksi menggantikan setiap karakter dengan
0
jika karakter itu sama dengan karakter pertama dari string asli, dan dengan1
sebaliknya secara harfiah dan tidak pernah repot untuk memeriksa bahwa karakter cocok dengan karakter kedua dalam string input. Itu hanya memeriksa sama-sebagai-karakter pertama dan berbeda-dari-karakter pertama.Aku berlari keluar dari register (Z80 hanya memiliki 7 8-bit register mudah digunakan, petunjuk sisa perlu lagi) jadi aku meletakkan
&01
diH
, bersama dengan menggunakanL
untuk membangun karakter ASCII (saya baru sadar itu tidak perlu untuk menginisialisasiL
, menyimpan satu byte ). KetikaH
meluap ke bendera Carry, karakter diL
siap untuk menjadi output. Untungnya, ada 16-bitADC
( Ad dengan C arry) yang melakukan pekerjaan instruksi shift-kiri.(DE)
hanya bisa dibacaA
meskipun(HL)
dapat dibaca ke register 8-bit, jadi itu adalah kompromi yang digunakan. Saya tidak dapat membandingkan(DE)
denganC
secara langsung, jadi saya harus memuatnyaA
terlebih dahulu. Label hanyalah kata-kata acak yang dimulai denganL
(persyaratan assembler).A
Akumulator - satu-satunya register yang dapat melakukan perbandinganB
register registeruntuk instruksi. Dengan mengatur ulang kode, saya dapat melakukan pekerjaanDJNZ
: D ecrement (B
) dan J ump jika N on Z eroDJNZ
dengan satu byte lebih sedikitC
karakter pertama dalam string inputD
,E
sebagaiDE
alamat karakter input saat iniH
pemicu carry (setiap loop ke-8)L
karakter keluaran sedang dibangunsumber
05AB1E , 10 byte
Cobalah online!
-3 Terima kasih kepada emigna.
sumber
01‡
bukan loop.¦¦Sk8ôJCçJ
J,
1713 Bytes-4 Terima kasih kepada FrownyFrog
Versi lama:
Penjelasan:
Contoh:
sumber
2}.1{=
untuk menyimpan 4 byte.[:
di awal :)Python 2 , 77 byte
Cobalah online!
sumber
R , 71 byte
Cobalah online!
Golf yang mengejutkan!
Pertama, ubah string menjadi ascii code-points with
utf8ToInt
, simpan sebagaiy
. Menghapus dua karakter pertama dengan pengindeksan negatif lebih pendek daripada menggunakantail
.Array
y[-1:-2]==y[2]
sama dengan bit ketika%*%
(perkalian matriks) diterapkan, tetapi pertama-tama kita membentuk kembali array menjadimatrix
dengannrow=8
, mengkonversi dari array linier ke byte pengelompokan. Kebetulan, kita kemudian dapat mengkonversi ke titik kode ascii menggunakan perkalian matriks dengan kekuatan yang sesuai dari 22^(7:0)
,, dan kemudian kita mengubah titik kode kembali ke string denganintToUtf8
.sumber
Python 3 , 77 byte
Cobalah online!
sumber
PHP,
7371 byteJalankan sebagai pipa dengan
-nR
atau coba online .golf:
-6
dan pra-kenaikan oleh8
strtr
mengabaikan karakter berlebihan di parameter yang lebih panjang (tidaksubstr
diperlukan)10
dan kemudian membalik tidak perlu tanda kutip -> -1 byte~
berfungsi sebagai batas kata -> -1 byte.sumber
for(;$s=substr($argn,2+8*$i++,8);)echo~chr(bindec(strtr($s,$argn,10)));
Pyth,
209 byteDisimpan 11 byte berkat FryAmTheEggman.
Coba di sini
Penjelasan
sumber
Ruby ,
8279 byteCobalah online!
sumber
.join
dapat digantikan oleh*''
, dans[0..1]
olehs[0,2]
.Japt, 11 byte
Cobalah
Penjelasan
sumber
s2
pintasan yang sangat pintar , bagus.PHP + GNU Multi Precision,
6361sayangnya ekstensi GMP tidak diaktifkan secara default (tetapi dikirimkan).
Jalankan seperti ini:
sumber
<?=
menghemat 2 byte dan mungkin hari itu. ;-)-R
(saya mencoba).-F
sajaHaskell , 75 byte
Cobalah online!
sumber
Java 8,
143142141 byte-1 byte terima kasih kepada @ OlivierGrégoire .
Cobalah online.
Penjelasan:
sumber
Python 3 ,
9986 byteCobalah online!
Berkat ASCII-hanya untuk dasarnya semuanya benar-benar
sumber
APL + WIN, 30 byte
Indeks asal 0. Anjuran untuk input string
Penjelasan:
sumber
Merah , 110 byte
Cobalah online!
Penjelasan:
Solusi mudah dan sederhana, tanpa builtin.
sumber
Google Sheets, 123 byte
Input ada di sel
A1
. Google akan secara otomatis menambahkan)))
ke akhir formula.Penjelasan:
Mid(A1,3+8*(Row(A:A)-1),8)
meraih potongan karakter 8 sekaligus, dimulai dengan yang ketiga.Substitute(Mid(~),Left(A1),0)
mengganti setiap instance dari karakter pertama dengan 0.Substitute(Substitute(~),Mid(A1,2,1),1)
mengganti karakter kedua dengan 1.Char(Bin2Dec(Substitute(~)))
mengubah chunk ke desimal dan kemudian ke ASCII.IfError(Char(~,""))
mengoreksi semua kesalahan yang dihasilkan dari fakta yangRow(A:A)
mengembalikan nilai jauh lebih banyak daripada yang kamiBin2Dec
berikan kepada kami banyak nilai nol danChar
kesalahan keluar dari nol.ArrayFormula(Join("",IfError(~)))
bergabung bersama semuaChar
hasil danArrayFormula
inilah yang membuatRow(A:A)
pengembalian array nilai bukan hanya nilai pertama.sumber
Ruby ,
6142 byte-19 byte terima kasih kepada benj2240
Cobalah online!
sumber
pack
adalah pilihan yang diilhami, tetapi saat ini Anda sedang berusaha keras. Itu dapat melakukan lebih banyak pekerjaan untuk Anda.Perl 5
-lp
, 34 byteCobalah online!
sumber
REXX, 41 byte
Cobalah online!
sumber
Python 2 , 88 byte
Cobalah online!
Bukan yang terpendek - hanya cara alternatif.
Versi berikut mencetak output pada satu baris untuk 98 byte meskipun aturan menyatakan bahwa trailing spasi diperbolehkan .:
Cobalah online!
sumber
/\s*/
.C # (Visual C # Compiler) , 158 byte
Cobalah online!
sumber
Perl 5
-p
, 40 byteCobalah online!
sumber
Scala , 95 byte
Cobalah online!
sumber
Haskell ,
12410593 byteCobalah online!
f
mengubah string menjadi daftar bit dengan membandingkan setiap karakter dengan yang pertama, mengubahBool
s menjadi nol dan yang denganfromEnum
.g
membagi daftar ini menjadi kelompok 8, mengubahnya menjadi desimal, dan mengambil nilai dari angka yang dihasilkan sebagaiEnum
, yangChar
merupakan turunan dari.Perubahan:
map
ke dalam fungsi)take
dengan zip dengan daftar pendek)sumber
toEnum
alih-alihchr
dan menjatuhkan impor. Jugamap
dapat dimasukkan ke dalamg
. Ruang antar8 s
bisa dihilangkan.Keempat (gforth) , 83 byte
Cobalah online!
Input adalah string Keempat standar (alamat dan panjang) output dicetak ke stdout
Penjelasan
sumber