Shifty-eyes ASCII suka menggeser ASCII Ii
:
>_> <_< >_< <_>
Diberikan string orang-orang licik, berjarak atau memisahkan garis, menggeser Ii
sisi ke sisi, meninggalkan dinding dan ke kanan langit:
Ii
Shifter terpendek memenangkan hadiah.
Katakan apa?
Tulis sebuah program atau fungsi yang mengambil string daftar sembarang dari empat emotikon ASCII ini, baik spasi atau baris baru dipisahkan (dengan baris tambahan opsional):
>_>
<_<
>_<
<_>
Misalnya, inputnya mungkin
>_> >_> <_>
atau
>_> >_> <_>
(Metode yang Anda dukung terserah Anda.)
Setiap emotikon melakukan tindakan berbeda pada I
dan i
karakter, yang selalu dimulai seperti ini:
Ii
>_>
bergeserI
ke kanan satu per satu, jika mungkin, dan kemudian bergeseri
ke kanan satu per satu.<_<
bergeserI
ke kiri satu per satu, jika mungkin, dan kemudian bergeseri
ke kiri satu per satu, jika mungkin.>_<
bergeserI
ke kanan satu per satu, jika mungkin, dan kemudian bergeseri
ke kiri satu per satu, jika mungkin.<_>
bergeserI
ke kiri satu per satu, jika mungkin, lalu bergeseri
ke kanan satu per satu.
I
tidak dapat digeser ke kiri jika berada di tepi kiri garis (seperti pada awalnya), dan tidak dapat digeser ke kanan jika i
langsung ke kanannya (seperti pada awalnya).
i
tidak dapat digeser ke kiri jika I
langsung ke kiri (seperti pada awalnya), tetapi selalu dapat digeser ke kanan.
Perhatikan bahwa dengan aturan ini, I
akan selalu tetap di sebelah kiri i
, dan I
dicoba digeser sebelumnya i
untuk semua emotikon.
Program atau fungsi Anda perlu mencetak atau mengembalikan string Ii
garis akhir setelah menerapkan semua pergeseran dalam urutan yang diberikan, menggunakan spasi (
) atau titik ( .
) untuk ruang kosong. Ruang atau periode yang tertinggal dan satu baris baru yang dibuntuti secara opsional diizinkan dalam output. Jangan mencampur ruang dan titik.
Misalnya input
>_> >_> <_>
memiliki output
I...i
karena shift berlaku suka
start |Ii >_> |I.i >_> |.I.i <_> |I...i
Kode terpendek dalam byte menang. Tiebreaker adalah jawaban dengan suara lebih tinggi.
Uji Kasus
#[id number]
[space separated input]
[output]
Menggunakan .
untuk kejelasan.
#0
[empty string]
Ii
#1
>_>
I.i
#2
<_<
Ii
#3
>_<
Ii
#4
<_>
I.i
#5
>_> >_>
.I.i
#6
>_> <_<
Ii
#7
>_> >_<
.Ii
#8
>_> <_>
I..i
#9
<_< >_>
I.i
#10
<_< <_<
Ii
#11
<_< >_<
Ii
#12
<_< <_>
I.i
#13
>_< >_>
I.i
#14
>_< <_<
Ii
#15
>_< >_<
Ii
#16
>_< <_>
I.i
#17
<_> >_>
.I.i
#18
<_> <_<
Ii
#19
<_> >_<
.Ii
#20
<_> <_>
I..i
#21
>_> >_> <_>
I...i
#22
<_> >_> >_> >_> <_> <_<
.I...i
#23
<_> >_> >_> >_> <_> <_< >_< <_< >_<
..Ii
#24
>_> >_< >_> >_> >_> >_> >_> >_> <_> <_> <_<
...I.....i
Jawaban:
CJam, 33 byte
Menggunakan algoritma yang sama dengan jawaban Python saya , kecuali dengan pengindeksan 0. Pada dasarnya:
<
ke -1 dan>
ke 1I
dan melamari
, kami berganti posisi yang kami perbarui setelah setiap panahTerima kasih kepada @ MartinBüttner untuk bermain golf pada langkah output, melepas 5 byte.
Cobalah online | Suite uji
sumber
Perl,
595654 byteTermasuk +1 untuk
-p
Jalankan dengan input pada STDIN, mis
perl -p shifty.pl <<< ">_> <_< >_< <_>"
shifty.pl
:Penjelasan
String kontrol bergantian instruksi untuk
i
danI
dan aturannya sama untuk keduanya jika Anda merumuskannya sebagai:<
Bergerak ke kiri jika ada ruang ke kiri>
Pindah ke kanan jika ada spasi atau ujung tali ke kananJadi saya akan menukar
i
danI
dalam string target pada setiap langkah jadi saya hanya perlu menerapkan aturan untuk satu huruf. Ini adalahy/iI/Ii/
Saya akan menjalankan string kontrol mencari
<
dan>
menggunakan substitusi yang biasanya merupakan cara terpendek dalam perl untuk memproses sesuatu karakter demi karakter. Untuk menghindari keharusan menulis,$var =~
saya ingin string kontrol dalam variabel default perl$_
. Dan saya juga ingin cara mudah untuk membedakan<
dari>
. Semua ini dapat dicapai dengan menggunakanTarget string saya juga ingin memanipulasi menggunakan pergantian dan untuk alasan yang sama saya ingin itu
$_
juga.$_
menjadi dua hal sekaligus tampaknya mustahil.Namun saya dapat memiliki kue dan memakannya juga karena bagian
$_
dalam tubuh pengganti tidak harus tetap sama dengan$_
yang diganti. Begitu perl mulai mengganti string, string ini tidak akan berubah bahkan jika Anda mengubah variabel dari mana string tersebut berasal. Jadi Anda dapat melakukan sesuatu seperti:Saya ingin mengganti yang asli
$_
dengan yang pertama"Ii"
hanya saat pertama kali badan substitusi dieksekusi (kalau tidak saya tetap mengatur ulang string target). Namun penggantian ini juga harus terjadi untuk string kontrol kosong, sehingga bahkan untuk string kontrol kosong tubuh perlu dieksekusi setidaknya sekali. Untuk memastikan substitusi menjalankan waktu ekstra di awal string kontrol (bahkan untuk string kontrol kosong) saya mengubah substitusi ke:Saya akan menjalankan
y/iI/Ii/
sebagai hal pertama di dalam kode substitusi. Meskipun$_
masih merupakan string kontrol, ini belum akan berisi apa punIi
, jadi jika transliterasi menunjukkan tidak ada yang berubah, itulah pemicu saya menginisialisasi$_
:Sekarang saya bisa menerapkan pemindahan huruf yang sebenarnya. Karena saya mulai dengan swap semua gerakan harus dilakukan
i
, bukanI
. Jika$1
diatur, pindahi
ke kanan:Jika
$1
tidak diatur, pindahi
ke kiriPerhatikan bahwa pada awal string kontrol ketika saya cocok
^
$1
tidak akan diatur, jadi mencoba untuk bergeraki
ke kiri pada string awalIi
. Ini tidak akan berfungsi karena tidak ada ruang di sana, jadi string awal tetap tidak terganggu (ini sebabnya saya meletakkan()
sekitar>
bukan<
)Hanya satu masalah yang tersisa: di akhir substitusi luar
$_
diatur ke hasil dari substitusi luar terlepas dari apa yang Anda lakukan$_
di dalam tubuh substitusi. Jadi target string dengan penempatan yang tepati
danI
tersesat. Dalam perl yang lebih tua ini akan menjadi kesalahan fatal. Namun perl yang lebih baru memilikir
pengubah yang berarti "membuat salinan dari string asli, lakukan substitusi pada itu dan kembalikan string yang dihasilkan (bukan jumlah kecocokan)". Ketika saya menggunakan itu di sini hasilnya adalah bahwa string perintah yang dimodifikasi akan dibuang sementara yang asli$_
tidak terganggu oleh perl dan dibiarkan setelah substitusi. Namun gangguan yang saya lakukan$_
masih dilakukan setelah perl dibiarkan$_
sendiri. Jadi pada akhirnya$_
akan menjadi target string yang tepat.The
-p
pilihan memastikan string asli dalam$_
dan juga mencetak final$_
.sumber
Ii
, bukaniI
.^
berarti saya harus menukar mereka. Jadi inisialisasi terbalik sudah benar.LittleLua - 178 Bytes
Implementasi lurus ke depan.
Tidak Disatukan:
Apa itu LittleLua?
LittleLua adalah pekerjaan yang sedang berjalan untuk mencoba menyejajarkan bidang bermain antara bahasa pilihan saya untuk tantangan ini dan bahasa esoterik yang sering memiliki built-in yang sangat kuat.
LittleLua adalah juru bahasa Lua 5.3.6 dengan modul tambahan (LittleLua.Lua), serta nama fungsi dan modul menyusut. Perubahan-perubahan ini akan berkembang selama satu atau dua hari berikutnya, sampai saya bahagia, tetapi karena berdiri beberapa perubahan terbesar antara LittleLua dan juru bahasa Lua standar adalah:
Fungsi dan modul menyusut:
Dibangun dalam variabel
LittleLua memiliki beberapa variabel bawaan untuk menyusutkan beberapa tugas:
Dibangun pada Fungsi
Saat ini daftar kecil yang menyedihkan, tapi ini dia:
sumber
$
, dan gunakan itu sebagai penggantiend
ataue
-A-Za-z
karakter non- kata tidak membutuhkan ruang di sekitar mereka, bukan? Itu akan mencukur byte perend
/e
if
untuki
, menyimpan satu byte per penggunaan, danend
untuke
, menyelamatkan dua, tetapi Anda meninggalkanelse
sendirian? Bahkan dalam program sederhana ini (5if
detik dan 2else
detik), Anda membuang lebih banyak byteelse
daripada menghematif
. (Saya menduga itu adalah perbaikan yang direncanakan?)Retina ,
10186Cobalah online
Disimpan 15 byte berkat daavko!
Mengambil input yang dipisahkan oleh baris baru dan keluaran dengan mata dipisahkan oleh spasi.
Penjelasan:
Saya akan menjelaskan tahap demi tahap seperti biasa. Semua tahapan ini dalam mode Ganti Retina. Itu berarti baris pertama adalah ekspresi reguler dan baris kedua adalah string pengganti.
Tambahkan inisial
Ii
ke akhir input.Backtick memisahkan stage dari opsi. Karakter opsi
(
menunjukkan bahwa tahap ini adalah awal dari loop tahapan yang akan dieksekusi berulang kali hingga siklus penuh selesai tanpa mengubah input. Karena tanda kurung terbuka ini tidak pernah ditutup, semua tahapan yang tersisa adalah bagian dari loop ini.Tahap sebenarnya sangat sederhana, jika karakter pertama dari string adalah baris baru maka hapuslah. Ini hanya untuk membantu mempermudah penanganan input kosong, jika tidak maka akan lebih mudah menambahkannya ke dua tahap terakhir.
Di sini, opsi
s
menyebabkan metacharacter Regex.
untuk mencocokkan baris baru. Tahapan ini menyebabkan pemimpin>
mencocokkanI
diikuti oleh ruang opsional. Kemudian itu menggantikan yang cocok dengan barang setelah>
, diikuti oleh ruang opsional (jadi string kosong jika ruang tidak dapat dicocokkan), dan kemudianI
.Tahap ini sangat mirip dengan yang sebelumnya, hanya ruang opsional sebelum
I
, dan urutan dan mata dibalik.Penanganan
i
sebenarnya sering kali lebih sederhana, karena kita tidak perlu khawatir tentang opsi menambahkan atau menghapus karenai
selalu dapat bergerak ke kanan. Untuki
kasus - kasus kami mencocokkan garis bawah serta tanda lebih besar / kurang dari, tetapi sebaliknya lakukan logika yang sama. Yang ini menambahkan ruang sebelumi
.Sekali lagi mirip dengan di atas, tetapi menghapus karakter sebelum
i
jika karakter itu adalah spasi, jika tidak hanya menghilangkan emotikon.sumber
s`^_>(.*)i( |$)?
=>s`^_>(.*)i
dan penggantinya$1$#2$* i
=>$1 i
, dans`^_<(.*?)( )?i
=>s`^_<(.*?) ?i
dan penggantinya$1i$2
=>$1i
.Python,
142141134122121 byteDisimpan 19 byte berkat xnor.
Contoh:
Penjelasan:
sumber
i
selalu lebih baik dariI
?I
,, titiki
,, tanpa perlu daftar dan bergabung.GNU sed, 81 byte
(termasuk +1 untuk
-r
bendera)Ini menciptakan program sed baru dari input (yang dapat Anda lihat dengan menghapus baris terakhir), dan menerapkannya ke status awal
Ii
.Penjelasan
<
dan>
untuk 'mengganti' perintah yang bergeser keI
kiri dan kanan masing-masing._
untuk dikerjakani
alih-alihI
i
tidak dibatasi oleh tepi kanan mana pun, jadi jangan tambahkan atau gunakan ruang untuk mengikutinyaIi
.s///e
selalu menggunakan/bin/sh
shell, jadi saya tidak bisa mempersingkat inised '&'<<<Ii
seperti yang saya inginkan (itu adalah sintaks pengalihan Bash).Hasil tes
sumber
Javascript (ES6)
176 171 168 155 148 147 142141 bytePemakaian
Degolfed (v6, v7 tidak jauh berbeda)
sumber
=>{ ... }
Anda bisa membuat ekspresi dan menyimpan beberapa byteMATL ,
5655504947 byteCobalah online!
sumber
Retina,
9186 byteSaya mungkin tidak mengambil pendekatan terbaik, jadi mungkin bisa bermain golf lebih banyak. Dan tidak, saya tidak menyalin FryAmTheEggman (saya tahu mereka sangat mirip dalam pendekatan kami). Saya bahkan tidak melihat jawabannya sampai saya memposting jawaban saya.
Cobalah online
sumber
( |)
di akhir garis pertandingan terakhir, karena tidak akan pernah ada ruang setelahnyai
. Juga, sekali lagi pada baris pertandingan terakhir, Anda tidak perlu menutup braket untuk loop. Loop tertutup ditutup secara otomatis pada akhir file di Retina.i
dan sesuatu setelah itu menggantikan. Lupa mengubahnya.Javascript (ES6) 166 byte
Menggunakan jawaban Charlie Wynn, saya berhasil menghemat 10 byte dengan mendefinisikan Math.max sebagai M dan memanggil M setiap kali skripnya menggunakan
(Saya tidak menulis golf ini, Charlie Wynn melakukannya di sini . Saya hanya memodifikasinya agar lebih pendek)
sumber
SyntaxError: missing : in conditional expression
ke Firefox. Anda dapat memperbaikinya dengan_=>{I=0,i=1,M=Math.max;_.split` `.map(m=>(I=(m=m.split`_`)[0]=='<'?M(0,I-1):M(i-1,I+1))+(i=m[1]=='<'?M(I+1,i-1):i+1));(a=Array(i).fill`.`)[I]='I';return a.join``+'i'}
, yang memiliki ukuran persis sama.JavaScript (ES6), 115
118Sunting: 3 byte disimpan thx CharlieWynn
p
adalah jumlah spasi sebelumnyaI
;q
adalah jumlah spasi antaraI
dani
. Tidak ada yang negatif.Kurang golf
Uji
sumber
Retina,
6158 byte3 byte disimpan berkat @FryAmTheEggman.
Penjelasan datang sedikit kemudian.
Cobalah online!
Kode yang dimodifikasi dengan uji batch.
sumber
Python 2,
9692 byteSolusi yang tampak licik untuk tantangan yang licik. Input like
f('>_> <_>')
, output like'I i'
.Program verifikasi (dengan asumsi
tests
adalah string kasus uji multiline):Program membaca setiap panah satu per satu, dimulai dengan
I=1, i=2
dan menggunakan indeks berbasis 1. Nama-nama variabel anak laki-laki menyesatkan karena mereka menukar peran - setelah setiap char,I
menjadii
dani
menjadiI
diperbarui. Char hanya diperbarui jika ia tidak akan bergerak ke posisi char lain atau posisi 0.Misalnya, untuk
>_> <_> >_<
kita lakukan:Ini memberi
' Ii'
seperti yang diinginkan.sumber
Lua, 104 byte
Pemakaian:
sumber
Javascript (ES5),
153125 bytemengambil input dengan mengatur variabel
a
sebelum berjalanAgak tidak terserang:
sumber
Mathematica, 125 byte
Fungsi murni dengan argumen pertama
#
. Idenya adalah bahwa setiap<_
,>_
,<
, dan>
dalam berkorespondensi masukan untuk aturan string pengganti."<_"|">_"|">"|"<"
adalah pola string yang cocok dengan salah satu dari empat ekspresi itu.StringCases[#,"<_"|">_"|">"|"<"]
akan menemukan semua kecocokan tersebut. Kemudian kita ganti (/.
) masing"<_"
- masing dengan aturan penggantian string".I"->"I."
, masing">_"
- masing dengan aturan"I."->".I"
, dan sebagainya. Lalu saya ingin secara berurutan menerapkan setiap aturan penggantian ke string"Ii"
, tetapiStringReplace
hanya akan mencari kecocokan di bagian-bagian string yang belum diganti, jadi kami meninggalkanFold
fungsi diStringReplace
atas daftar aturan penggantian dengan nilai awal"Ii"
.Mungkin akan lebih jelas dengan contoh (di sini
%
merujuk pada keluaran sel sebelumnya):sumber