Tugas Anda - jika Anda memilih untuk menerimanya - adalah membangun sebuah program yang mem-parsing dan mengevaluasi string (dari kiri ke kanan dan panjang sewenang-wenang) dari token yang memberikan arahan - baik kiri atau kanan. Berikut adalah empat token yang mungkin dan artinya:
> go right one single step
< go left one single step
-> go right the total amount of single steps that you've gone right, plus one,
before you previously encountered this token and reset this counter to zero
<- go left the total amount of single steps that you've gone left, plus one,
before you previously encountered this token and reset this counter to zero
Namun ada kendala - token arah yang harus diurai oleh program Anda akan disajikan dalam formulir ini:
<<->-><<->->>->>->
... dengan kata lain, mereka digabungkan, dan itu adalah tugas program Anda untuk menentukan prioritas yang benar dari arah dan jumlah langkah yang harus diambil (dengan melihat ke depan). Urutan prioritas adalah sebagai berikut (dari prioritas tertinggi ke terendah):
->
<-
>
<
Jika Anda menemukan <-
ketika tidak ada langkah ke kiri yang telah dilakukan sejak awal atau sejak reset terakhir, ambil satu langkah tunggal ke kiri. Aturan yang sama berlaku untuk ->
, tetapi kemudian untuk ke kanan.
Program Anda harus mulai dari 0 dan hasilnya harus berupa bilangan bulat bertanda tangan yang mewakili posisi akhir.
Anda mungkin berharap input selalu valid (jadi, tidak seperti <--->>--<
, misalnya).
Input contoh:
><->><-<-><-<>>->
Langkah-langkah dalam contoh ini:
step | token | amount | end position
------+-------+--------+--------------
1. | > | +1 | 1
2. | < | -1 | 0
3. | -> | +2 | 2
4. | > | +1 | 3
5. | <- | -2 | 1
6. | < | -1 | 0
7. | -> | +2 | 2
8. | <- | -2 | 0
9. | < | -1 | -1
10. | > | +1 | 0
11. | > | +1 | 1
12. | -> | +3 | 4
Untuk klarifikasi: output dari program hanya harus menjadi posisi akhir sebagai integer yang ditandatangani. Tabel di atas hanya ada untuk menggambarkan langkah-langkah yang diambil contoh saya. Tidak perlu menampilkan tabel seperti itu, baris tabel, atau bahkan hanya posisi akhir langkah. Hanya posisi akhir akhir, sebagai bilangan bulat yang ditandatangani, yang diperlukan.
Kode terpendek, setelah satu minggu, menang.
<-
adalah jika segera diikuti oleh a<
atau a->
. Tidak ada cara dalam bahasa ini untuk mewakili urutan<-
itu>
- yang akan terjadigo left the total amount of single steps that you've gone left, plus one, then go right one single step
. Apakah ini benar dan sesuai desain?Jawaban:
GolfScript, 46 karakter
Ini adalah salah satu program GolfScript paling linier yang pernah saya tulis - tidak ada satu pun loop, kondisional atau penugasan variabel di dalamnya. Semuanya dilakukan dengan menggunakan manipulasi string:
Pertama, saya mengganti setiap kemunculan
->
oleh)
. Karena input dijamin valid, ini memastikan bahwa setiap kejadian yang tersisa-
harus menjadi bagian dari<-
.Selanjutnya, saya membuat dua salinan string. Dari salinan pertama, saya menghapus karakter
<
dan-
, hanya menyisakan>
dan)
. Saya kemudian menduplikasi hasilnya, menghapus semua)
dan setiap>
mengikuti yang terakhir)
dari salinan kedua, menggabungkan mereka dan menghitung karakter. Jadi, pada dasarnya, saya menghitung:)
,>
setelah yang terakhir)
, dan>
sebelum yang terakhir)
.Selanjutnya, saya melakukan hal yang sama untuk salinan lain, kecuali kali ini menghitung
<
dan<-
bukannya>
dan)
, dan menghapus-
s sebelum penghitungan karakter akhir. Jadi, saya hitung:<-
,<
setelah yang terakhir<-
, dan<
sebelum yang terakhir<-
.Akhirnya, saya kurangi jumlah kedua dari yang pertama, dan hasilkan hasilnya.
sumber
Python 2.7 -
154147134128 bytePerubahan serius telah dilakukan terhadap cara kerja program ini. Saya telah menghapus penjelasan lama, yang masih dapat ditemukan di riwayat edit jawaban ini.
Yang ini kotor.
Cara kerjanya hampir sama dengan jawaban lain untuk pertanyaan ini, mengganti karakter dalam input dengan pernyataan yang valid dalam bahasa itu dan menjalankannya. Namun, ada satu perbedaan utama:
replace
kata yang panjang. Persetan dengan itu.@ProgrammerDan dalam obrolan muncul dengan gagasan menggunakan tuple dengan string
;').replace('
di dalamnya 4 kali, untuk menggunakanstr.format()
metode pra -format teks. Empat contoh%s
berada di string pada baris kedua, masing-masing mengambil nilainya dari elemen terkait tuple di akhir. Karena semuanya sama, masing%s
- masing diganti;').replace('
. Saat Anda melakukan operasi, Anda mendapatkan string ini:Ini sekarang kode python yang valid yang dapat dieksekusi dengan
exec
. Benar, sayang: Sarangexec
saya gunakan operasi string pada kode yang perlu melakukan operasi string pada kode . Seseorang tolong bunuh aku.Sisanya cukup mudah: Setiap perintah diganti dengan kode yang melacak tiga variabel: Posisi saat ini, jumlah hak sejak terakhir
->
, dan yang sama untuk kiri dan<-
. Semuanya dijalankan dan posisinya dicetak.Anda akan melihat bahwa saya melakukannya
raw_input(';')
, menggunakan ';' sebagai prompt, daripadaraw_input()
yang tidak memiliki prompt. Ini menyimpan karakter dengan cara yang tidak intuitif: Jika saya melakukannyaraw_input()
, saya harus mengisi tuple).replace('
, dan setiap instance%s
akan memiliki '; \' 'sebelum itu kecuali yang pertama . Memiliki prompt menciptakan lebih banyak redundansi sehingga saya dapat menyimpan lebih banyak karakter secara keseluruhan.sumber
list.index()
kembali-1
ketika gagal menemukan karakter" .. erm no. Itu menimbulkanIndexError
. Anda mungkin bingung dengan itustr.find
. Bahkan Anda bisa menggantinya[list('><rl').index(c)]
dengan['><rl'.find(c)]
.Perl,
134131...9995 byteMengambil input sebagai satu baris di stdin, misalnya:
atau:
Saya membagi instruksi menjadi operator "kanan" (">" dan "->") dan "kiri" ("<" dan "<-"). Keuntungan dari hal ini adalah bahwa lebih mudah untuk mengeksploitasi paralelisme antara operator kiri dan kanan, dan kita tidak perlu melakukan hal-hal lain untuk mengubah token string. Setiap "arah" ditangani sebagai operasi substitusi di mana kami menyesuaikan total running dengan jumlah langkah yang diambil ke arah itu, mengabaikan arah sebaliknya yang ditangani oleh operasi substitusi lainnya. Berikut adalah leluhur yang kurang golf dari kode ini sebagai semacam dokumentasi:
Dalam iterasi sebelumnya dari kode ini, semua penggantian dilakukan dalam satu pass. Ini memiliki keuntungan menjaga pemetaan langsung antara $ p / $ pos dan posisi yang akan dikembalikan pada titik waktu tertentu, tetapi mengambil lebih banyak byte kode.
Jika Anda ingin menggunakan () 5.10.0, Anda dapat s / print / say / untuk mencukur 2 karakter lainnya, tetapi itu bukan gaya saya.
sumber
Perl,
8877 byteMasukan diharapkan melalui STDIN, misalnya:
Memperbarui
Tidak perlu mengubah string ke penjumlahan, karena
s//
sudah menghitung. :-)Versi pertama
Masukan diharapkan melalui STDIN, contoh:
Penjelasan:
Idenya adalah untuk mengubah string arah menjadi penjumlahan sehingga hasilnya adalah keluaran dengan sederhana
print eval
.>
sebelum apa pun->
mengambil dua langkah, satu sekaligus dan yang lainnya di berikutnya->
. Tidak masalah, yang mana dari->
saat itu mengikuti setidaknya satu dari mereka. Penghitung internal diatur ulang setelah yang berikutnya->
, sehingga>
tidak menyebabkan langkah lebih lanjut, maksimumnya adalah dua langkah. Kemudian->
tambahkan satu langkah untuk dirinya sendiri dan begitu juga yang tersisa>
setelah yang terakhir->
.Hal yang sama berlaku untuk arah mundur dengan jumlah langkah negatif bukannya positif.
Misalnya:
><->><-<-><-<>>->
s/->/+1/
: Mulai dengan arah maju, karena->
memiliki prioritas tertinggi.Misalnya:
><+1><-<+1<-<>>+1
s/>(?=.*1)/+2/g
: Pola lihat-depan memastikan bahwa hanya yang>
sebelum->
dikonversi.Misalnya:
+2<+1+2<-<+1<-<+2+2+1
s/>/+1/g
: Sekarang sisanya>
tertutup.Misalnya:
+2<+1+2<-<+1<-<+2+2+1
s/<-/-1/g
: Analog dengan arah mundur.Misalnya:
+2<+1+2-1<+1-1<+2+2+1
s/<(?=.*-)/-2/g
: Dalam pola melihat-depan penuh-1
dari mantan<-
tidak diperlukan, karena tidak ada-
satu simbol arah kiri.Misalnya:
+2-2+1+2-1-2+1-1<+2+2+1
s/</-1/g
: Sisa<
setelah yang terakhir<-
dikonversi.Misalnya:
+2-2+1+2-1-2+1-1-1+2+2+1
print eval
: Hitung dan keluarkan hasilnya.Misalnya:
4
sumber
-p
: 74 byte saya mengubah Andas/>//g
untuky/>//
menyimpan byte dalam setiap kasus yang juga memungkinkan untuk penghapusan parens dalam ekspresi.Ruby, 141 byte
Tidak Disatukan:
sumber
l=1;r=1
bisal=r=1
dan$><<o
bisap o
. Saya pikir Anda bisa mencukur banyak dengan mengganti pernyataan kasus dengan sesuatu yang kurang besar, mungkin sesuatu di sepanjang gariseval %w(o-=1;l+=1 o+=1;r+=1 o-=l;l=1 o+=r;r=1)['<>LR'.index c]
l=r=1;o=0;gets.gsub('->',??).scan(/<-|./){eval"o+=#{%w[-1;l+ -l;l 1;r+ r;r][$&[-1].ord%4]}=1"};p o
Anda bisa turun ke 94 menggunakanruby -p
D - 243
Golf :
Tidak golf :
sumber
C,
148141140140:
141:
148:
Dengan spasi putih:
Mungkin lebih banyak ruang untuk bermain golf ini. Sebagian besar saya menyerah untuk mencoba memanipulasi 4 variabel di terner yang menangkap nilai-nilai (itu terus keluar lebih lama dan semakin belakangan), tetapi tidak lulus pertama yang buruk. Pass array yang cukup lurus ke depan. Mengambil input sebagai argumen baris perintah, menghasilkan melalui nilai balik.
Anda perlu
-std=c99
bendera untuk mengompilasinya dengan gcc.EDIT: Ya, sudah terlambat - melewatkan beberapa hal yang jelas.
sumber
main
:main(char*x,char**v)
. Maka Anda memiliki 138 bukannya 140.>><-
memberi 0 bukannya 1 atau><->
memberi 0 bukannya 2.char
dan*
, dan menggantinya(*(x+1)==45)?(x++,o-=l+2,l=0):(o--,l++)
dengan(*++x==45)?(o-=l+2,l=0):(x--,o--,l++)
.JavaScript, 136
Tidak dijinakkan:
Bagaimana itu bekerja
Diberikan input string
s
seperti ini:Ia menggunakan Regex untuk mengganti setiap perintah dengan satu set instruksi yang memodifikasi
z
(posisi akhir),l
(gerakan kiri tersimpan) danr
gerakan kanan tersimpan. Setiap Regex dilakukan dalam urutan prioritas.Untuk input di atas ini dikonversi
s
ke:Cantik, bukan?
Akhirnya kita
eval(s)
melakukan instruksi dan peringatanz
yang berisi posisi akhir.sumber
Javascript (116,
122,130)116:
122:
130:
sumber
JavaScript [217 byte]
Mungkin bisa dipersingkat sedikit lebih ...
sumber
PHP,
284282Tidak ada regex.
Tidak Disatukan:
sumber
str_split($i)
(1
apakah default untuk argumen kedua.) Dan$i
mungkin seharusnya$c
, benar?$i
): P Memperbaikinya!Solusi perl lain, 113 karakter
Sudah ada dua jawaban yang mengalahkan ini, hanya untuk cekikikan. Ini menggunakan pendekatan berdasarkan pengamatan Ilmari tentang nilai token:
Meledak sedikit:
sumber