Dalam tantangan ini, Anda akan menulis penerjemah untuk bahasa sederhana yang saya buat. Bahasa ini didasarkan pada akumulator tunggal A, yang panjangnya tepat satu byte. Pada awal program, A = 0. Ini adalah instruksi bahasa:
!
: Pembalikan
Instruksi ini hanya membalikkan setiap bit akumulator. Setiap nol menjadi satu dan setiap orang menjadi nol. Sederhana!
>
: Shift Kanan
Instruksi ini menggeser setiap bit di A one place ke kanan. Bit paling kiri menjadi nol dan bit paling kanan dibuang.
<
: Shift Kiri
Instruksi ini menggeser setiap bit di A satu tempat ke kiri. Bit paling kanan menjadi nol dan bit paling kiri dibuang.
@
: Swap Nybbles
Instruksi ini menukar empat bit teratas A dengan empat bit terbawah. Misalnya, Jika A adalah 01101010
dan Anda mengeksekusi @
, A akan menjadi 10100110
:
____________________
| |
0110 1010 1010 0110
|_______|
Itu semua instruksinya! Sederhana bukan?
Aturan
- Program Anda harus menerima input sekali di awal. Ini akan menjadi baris kode. Ini bukan penerjemah interaktif! Anda hanya dapat menerima input satu kali dan tidak perlu mengulang kembali ke awal setelah baris itu dieksekusi.
- Program Anda harus mengevaluasi kata input. Setiap karakter yang tidak disebutkan di atas diabaikan.
- Program Anda kemudian harus mencetak nilai akhir akumulator, dalam desimal.
- Aturan biasa untuk bahasa pemrograman yang valid berlaku.
- Celah standar tidak diijinkan.
- Ini adalah kode-golf , jumlah byte terkecil yang menang.
Berikut adalah beberapa program kecil untuk menguji kiriman Anda. Sebelum panah adalah kode, setelah itu adalah hasil yang diharapkan:
!
->255
!>>
->63
!<@
->239
!nop!&6*!
->255
Nikmati!
sumber
! -> 255
bahwa kita akan menggunakan 8 bit per byte di sini? Pertanyaannya tidak eksplisit.Jawaban:
Pyth,
3635 byteUji harness
Representasi internal akumulator adalah bilangan bulat. Integer ini dimodifikasi oleh 256 pada setiap iterasi, sesuai keinginan. Operasi yang dilakukan adalah
-G-1
,G/2
,G*2
danG
dikonversi ke basis 16, terbalik, dan dikonversi kembali ke pangkalan 10, di manaG
adalah akumulator.Saya melewatkan baris tentang mengabaikan segala sesuatu yang lain. Ini telah diperbaiki. Terima kasih, @Dennis.
sumber
-G-1
lebih pendek dari~G
pada Pyth? Saya agak meragukannya.t_G
mana_
negasi dant
berada-1
. Dalam Pyth,~
berarti sesuatu yang sama sekali berbeda.~
(bitwise NOT)C, 96
Dengan asumsi input ASCII (atau yang kompatibel):
Lebih rapi:
Pada dasarnya itu hanya kumpulan ekspresi tersier bersarang. Saya menambah nilai yang diperoleh dari
getchar()
sehingga EOF (-1) menghasilkan nilai nol dan program keluar.(tautan ideone)
sumber
!<>
harus menghasilkan127
dan tidak255
). Tetapkana
sebagai Andachar
, atau gunakan barisa&=255
(dan gunakan%u
) untuk mendapatkan efek yang benar. Anda juga dapat mempersingkat negasi Andaa^255
menjadi~a
.a>>4&15
juga lebih pendek dari Anda(a&240)/16
.%u
bukan%hhu
a/16|a*16
bukana/16|(a&15)*16
. Beberapa bit di atas bisa dihapus oleh&255
.a*257/16
satu byte lebih pendek daria/16|a*16
.Python 3, 133 byte
Menggunakan kamus untuk menebus kurangnya sintaks kasus sakelar di Python. Lihat lebih lanjut di sini .
Akumulator adalah string yang diubah menjadi nomor basis 10 di akhir.
Contoh I / O:
sumber
for i in sys.stdin:
:)Javascript (ES6),
809190 byteCukup pendek yang bisa didapat. Menentukan fungsi anonim yang menjadikan program sebagai input.
!
, ambilx XOR 255
, karena JS~
akan mempertimbangkanx
nomor 32-bit.<
, gandakanx
dengan 2 dan ambil hasilnya mod 256.>
, benar-benar menggeser bitx
1 bit ke kanan.@
, lantaix/16
dan menambahkannya kex%16*16
.Terima kasih kepada @vihan karena menyarankan penggunaan
reduce
untuk menyimpan byte.sumber
<
untuk menghemat sekitar 4 byte. Menggunakan pengurangan mungkin juga menghemat beberapa byte<
di tempat==
? Jika demikian, itu tidak akan berfungsi, karena karakter no-op akan melakukan operasi yang salah. Saya menggunakannya dalam solusi 80 byte saya sebelumnya.CJam, 37 byte
Cobalah online di juru bahasa CJam .
Bagaimana itu bekerja
sumber
Java (8),
514483411366359239224229198194187186184182181180177 karakterWow, ini sudah banyak golf! Terima kasih kepada semua orang yang memberi saya saran! Saya sangat menghargainya!
Golfed 31 (!) Byte dengan mengoptimalkan nibble swap dengan operasi bitwise sebagai lawan dari
Integer.???
metode yang panjang .Golfed 72 (!!!!) chars dengan menghapus string yang tidak perlu dibuat untuk menukar camilan. Jauh lebih baik dari sebelumnya !?
Golfed 45 (!!) karakter dengan menghapus penggunaan
java.util.Scanner
dan membacaSystem.in
langsung. Perhatikan bahwa sekarang karena ekspresi lambda hilang, Java 8 tidak lagi diperlukan! Hanya dengan Java 1 saja!Golf 7 karakter dengan membuat kelas
(default)
(public
kata kunci dihapus ), terima kasih kepada @bmarksGolf 120 (!!!!!!!) karakter dengan memutar semua
Integer
operasi kelas yang panjang dalam sedikit membalik255 - a
. Nah, itu jauh lebih singkat!Golf 15 (!) Karakter dengan mengubah shift ke perkalian dan pembagian, menghapus kawat gigi dari pernyataan while, dan membuat
a
lokal dalammain
metode.Ungolfed 9 = (karakter karena masalah dengan shift kiri tidak membuang byte paling kiri. Oleh karena itu, sekarang saya lakukan
mod (256)
. Shift kanan akan membuat nomor yang dihasilkan sedikit lebih pendek dari sebelumnya, sehingga tidak perlu digunakanmod
pada shift kanan. Nibble-swap saya akan menukar 4 bit terakhir dan nibble kedua terakhir, danand (&)
memotong semua bit lainnya. Program inversi saya tidak menimbulkan masalah jika nomor aslinya kurang dari 256.Golf
3135 karakter berkat @Geobits dengan mengubahswitch
pernyataan menjadi banyak pernyataan ternary, dan juga mengubah karakter menjadi int, memperpendek literal.Golf 7 karakter dengan menghapus yang tidak perlu
&240
di swap menggigit ((a&240)>>4
kea>>4
dan mengkonversi(a&15)<<4
kea<<4&240
. Perubahan terakhir hanya golf satu karakter.Golfed 1 arang dengan menghapus yang tidak perlu
=
dia /= 2
, karenaa = a /= 2
setara dengana = a / 2
.Golf 2 karakter dengan beralih
println
keprint
.Golf 2 karakter dengan menghapus disengaja
a=
dalama=255-a
(a=a=255-a
setara dengana=255-a
)Golf 1 char dengan berubah
a<<4&240
menjadia%16<<4
.Golf 1 char dengan menambahkan tanda kurung ke luar pernyataan ternary dan melakukan
%256
. Dengan begitu,%16
tidak perlu di bagian shift-kiri dari nibble swap. Kurung menambahkan 2 karakter dan%16
menyimpan 3 karakter.Golf 3 karakter dengan mengubah
class
keinterface
dan menghapuspublic
menggunakan fitur metode antarmuka statis Java 8. Terima kasih kepada @TheNumberOne (tidak ada komentar, tetapi temukan jawabannya di "Tips untuk bermain golf di Jawa"sumber
Integer
metode kelas.switch
golf sementara. Thecase
/break
yang terlalu panjang. Anda harus bisa menyelamatkan banyak dengan membuat semuanya menjadi ternary; sesuatu sepertia=i=='!'?255-a:i==62?a/2:i=='<'?a*2%256:i=='@'?(a&240)>>4|(a&15)<<4:a;
Rust,
121115 byteContoh dijalankan:
Tidak Disatukan:
Sangat pendek untuk Rust. Tidak ada hal lain yang benar-benar menarik selain fakta bahwa saya belajar lebih banyak aturan diutamakan hari ini — yang tahu
(a>>b)|c
samaa>>b|c
?Memotong satu byte dengan mengubah
n>>=1
ken/=2
; Namun, hal yang sama tidak dapat dilakukan dengan perkalian, karena aritmatika overflow adalah kepanikan (yaitu crash) di Rust.sumber
>>
adalah semacam seperti divisi dan|
merupakan semacam seperti penambahan.HP 41C / CV / CX (? Byte, 42 langkah)
Murni untuk cekikikan, ini dia kalkulator HP 41C / CV / CX. (Membutuhkan modul Fungsi Diperluas, atau 41CX untuk fungsi ATOX.) Sayangnya, kalkulator tidak melaporkan ukuran program dalam byte.
Masukkan program Anda ke dalam register Alpha, yang sedikit rumit, karena tidak ada cara untuk masuk! atau @ langsung dari keyboard (gunakan XTOA masing-masing dengan kode ASCII 33 dan 64 untuk menambahkannya).
Langkah 08 dan 10 memungkinkan untuk mengabaikan opcode yang tidak valid; hapus langkah-langkah itu untuk menyimpan 2 langkah, tetapi program akan macet pada input yang tidak valid.
sumber
Python 2, 79 byte
Saya menyadari bahwa saya telah melakukan sesuatu yang sangat mirip dengan ini di Python sebelumnya. Ini hanyalah port jawaban Ruby saya , tetapi kebetulan itu adalah jawaban Python terpendek seperti sekarang: D
Perbedaan dari versi Ruby adalah bahwa ini tidak mengabaikan instruksi yang tidak valid saat iterasi input. Alih-alih, saya mengambil keuntungan dari fakta bahwa Python cenderung untuk kembali
-1
alih-alihnil
ketika tidak ada kecocokan - Nilai saata
ini ditambahkan ke bagian belakang array hasil, sehingga semua instruksi yang tidak valid memetakan ke nilai yang sama dan tidak berubah.sumber
Python 3,
1249493 byte"!" sama dengan mengurangi dari 255.
"<" sama dengan mengalikan dengan 2. Tetapi register 8 bit berarti mod 256.
">" sama dengan pembagian integer dengan 2.
"@" berarti menggeser 4 bit terakhir (
a%16
) dengan 4 bit (*16
) dan menambahkan empat bit pertama (a/16
).EDIT (baca penyalinan memalukan)
Melihat jawaban lain dengan python (dengan peluruhan Beta). Ini menggunakan cara yang sangat efektif untuk mensimulasikan kasus saklar menggunakan kamus. Dengan itu kita bisa menulis
Terima kasih, Beta Decay.
sumber
256
kan? Jadi mengapa tidak melakukan itu di akhir:a={"!":255-a,"<":a*2,">":a//2,"@":(a%16)<<4+a>>4}.get(i,a)%256
. Ini segera menghemat satu byte (karena Anda akan melakukana*2
alih - aliha<<1
) ... tetapi jawaban @ daniero juga menunjukkan bahwa jika Anda melakukannya dengan cara ini maka(a%16)<<4
dapat disingkat menjadi hanyaa<<4
, karena bit 16 atau lebih besar akan dihilangkan setelah Anda mengalikan dengan 16 dan menguranginya mod 256. Bagus! Selain itu, Anda sekarang dapat mengganti255-a
dengan-1-a
... atau lebih baik, hanya dengan~a
. Secara keseluruhan, saran ini akan menghemat 9 byte.Haskell, 89 byte
Contoh penggunaan:
f "!>>"
->63
sumber
Rust, 111 byte
Lebih banyak komentar pada jawaban @ Doorknob, tapi saya tidak punya perwakilan untuk komentar karena saya baru saja membuat akun.
Satu dapat mencukur 10 byte dari solusi Rust-nya dengan berikut:
sumber
Python 3, 127 byte
Edit: korslet, terima kasih @ Jakube
Sunting2: perbaiki, terima kasih @Anachor
sumber
!<
berikan510
waktu yang seharusnya254
Ceylon,
297290Diformat:
#f
dan#f0
merupakan bilangan heksadesimal untuk camilan,.byte
mengubah integer menjadi byte. Saya beruntung bahwa.string
atribut Byte sudah menggunakan representasi byte yang tidak ditandatangani. Ceylon juga memiliki fitur pernyataan switch tanpa jatuh, dan string adalah daftar karakter, yang dapat diulang.Saya juga mencoba untuk memotong nama-nama metode shift panjang dengan menggunakan impor aliasing, tetapi ini sebenarnya menjadi 7 byte lebih lama:
Diformat:
Ini mungkin berguna jika kita membutuhkan metode itu sedikit lebih sering.
sumber
Rubi,
8173 byteJauh lebih sederhana - tanpa eval! Untuk setiap karakter yang valid dalam input, ia mengevaluasi setiap instruksi, dan menemukan instruksi yang sesuai melalui indeks
$&
(karakter saat ini dalam input).sumber
STATA, 197 byte
Tidak disatukan
Tidak bekerja dengan penerjemah online dan memerlukan penerjemah default tidak bebas. Ini akan lebih mudah dengan operasi bitwise yang sebenarnya, tetapi saya tidak berpikir mereka terlalu berguna untuk sebagian besar penggunaan umum STATA.
sumber
JavaScript, 104
Operator ternary memetakan instruksi.
BITWISE AND digunakan untuk membatasi tipe Number kami menjadi satu byte.
sumber
Julia,
117948673 byteIni adalah fungsi anonim yang menerima string dan mengembalikan integer. Untuk menyebutnya, tetapkan ke variabel.
Tidak Disatukan:
Disimpan 8 byte berkat Sp3000 dan 13 berkat Dennis!
sumber
JavaScript (ES6), 76
81Sebagai fungsi yang tidak disebutkan namanya mengembalikan nilai akumulator
Ini adalah porting jawaban super pintar oleh @daniero (yang memiliki terlalu sedikit upvotes)
Bonus: Anda dapat melewati nilai awal akumulator. Jika tidak lulus, nilai awal adalah 0 sebagai spesifik.
Tes menjalankan cuplikan di bawah ini di peramban EcmaScript 6 apa pun (saya uji di Firefox)
sumber
Crystal, 139 byte
sumber
C # 193
sumber
using System;
atau sesuatu seperti itu untuk mengaksesConsole.ReadLine
danConsole.Write
tanpaSystem.
awalan?byte
untuk setiap operasi tetapi saya bisa saja salah.Lua, 344 char
Terinspirasi oleh @Beta Decay menggunakan akumulator string, mengingat lua tidak memiliki tipe byte. Mungkin bisa bermain golf lebih banyak dengan menggunakan lebih sedikit fungsi.
sumber
R, 194 byte
ungolfed
sumber
<-
bisa diganti di=
sini, sehingga mengurangi kode sebanyak 7 byte. Selain itu, Anda mungkin dapat mengganti serangkaianif
pernyataan dengan satu panggilan keswitch
(seperti padaA=switch(r,"!"=(A+1)%%2, ...)
)b=readline();A=rep(0,8);s=strsplit(b,"")[[1]];for(r in s)A=switch(r,"!"=(A+1)%%2,">"=c(0,A)[1:length(A)],"<"=c(A,0)[-1],"@"=c(A[5:8],A[1:4]),A);print(sum(A*(2^(7:0))))
adalah 167 byte.RPL, 170,5 byte
Input harus dimasukkan sebagai string pada level 1.
sumber
K, 57 byte
Ini awal:
diuji menggunakan Kona:
Saya mungkin bisa melakukan yang lebih baik di k5, tapi ini adalah serangkaian kompromi yang rumit - misalnya, mengubah biner ke desimal semudah
2/
, tetapi perilaku?
membuatnya lebih sulit untuk menangani kasus default untuk pencarian instruksi.sumber
PHP, 189 byte
Bukannya itu akan mengalahkan banyak jawaban, itu hanya untuk latihan
sumber
HPPPL ,
302294 byteTidak Disatukan:
Jawaban ini memastikan bahwa HP Prime menggunakan bilangan bulat 8 bit yang tidak ditandatangani meskipun mode diatur ke misalnya 64 bit oleh pengguna. Jika kalkulator diatur secara manual untuk menggunakan bilangan bulat desimal 8 bit yang tidak ditandatangani, maka
pragma
perintah dapat dihilangkan. Jika output tidak perlu mengikuti format ketat makaa*1
pada akhirnya bisa dengan mudaha
. Mengalikan hasilnya dengan 1 hanya memastikan output tidak mengikuti output internal untuk nilai integer. Theprint
perintah di baris 4 juga dapat dihilangkan jika terminal tidak perlu dibersihkan sebelum mencetak hasilnya. Jika melewati program sebagai argumen string diizinkan, makaINPUT
perintah dapat dihilangkan juga.Ini adalah versi terpendek dengan input dan output yang tepat, tanpa argumen pragma (jika kalkulator diatur ke Uint8 secara default:
243 byte:
sumber
Perl 6,
9689 byteSolusi lama:
sumber
C #, 119 byte
Versi lain saya coba, tetapi membutuhkan lebih banyak byte:
sumber
Python 2.7.3, 104 byte
Memiliki kode dalam string untuk dievaluasi terlihat sangat kotor, tetapi berfungsi: D
Inilah output (dan input sebenarnya ..)
Dan ya, itu benar-benar berjalan pada RaspberryPi :)
sumber