Saya pernah mendengar bahwa kode Anda dapat berjalan lebih cepat jika Anda memasukkannya secara terbalik, sehingga kompiler dapat memprosesnya seperti pola desain pohon dari bagian atas "cabang" ke bawah. Ini membantu karena gravitasi akan mempercepat waktu yang dibutuhkan untuk mengkompilasi kode Anda, dan efisiensi struktur data ditingkatkan. Berikut ini contohnya, dalam skrip Java:
function fib(n) {
var a = 1, b = 1;
while (--n > 0) {
var tmp = a;
a = b;
b += tmp;
if (a === Infinity) {
return "Error!";
}
}
return a;
}
Tetapi untuk beberapa alasan Notepad tidak memiliki pengaturan untuk melakukan ini secara otomatis, jadi saya perlu program untuk melakukannya untuk saya.
Deskripsi
Pengajuan harus mengambil cuplikan kode sebagai input, membalikkan lekukan, dan mengeluarkan kode yang dihasilkan.
Ini dilakukan dengan prosedur berikut:
Bagi kode menjadi beberapa baris. Setiap baris akan mulai dengan nol atau lebih banyak spasi (tidak akan ada tab).
Temukan semua level lekukan unik dalam kode. Misalnya, untuk contoh di atas, ini akan menjadi
0 4 8 12
Membalik urutan daftar tingkat indentasi ini, dan memetakan daftar terbalik ke daftar asli. Ini sulit dijelaskan dengan kata-kata, tetapi sebagai contoh, akan terlihat seperti
0 — 12 4 — 8 8 — 4 12 — 0
Terapkan pemetaan ini ke kode asli. Dalam contoh ini, baris dengan indentasi 0-spasi akan menjadi indentasi oleh 12 spasi, 4 spasi akan menjadi 8 spasi, dll.
Input output
Input dan output dapat disediakan namun Anda ingin (STDIN / STDOUT, parameter fungsi / nilai pengembalian, dll.); jika bahasa Anda tidak mendukung input multiline (atau Anda tidak mau), Anda dapat menggunakan |
karakter untuk memisahkan baris.
Input akan terdiri dari hanya baris ASCII + yang dapat dicetak, dan tidak akan berisi baris kosong.
Uji kasus
Memasukkan:
function fib(n) {
var a = 1, b = 1;
while (--n > 0) {
var tmp = a;
a = b;
b += tmp;
if (a === Infinity) {
return "Error!";
}
}
return a;
}
Output: contoh kode di atas.
Memasukkan:
a
b
c
d
e
f
g
h
Keluaran:
a
b
c
d
e
f
g
h
Memasukkan:
1
2
3
2
1
Keluaran:
1
2
3
2
1
Memasukkan:
foo
Keluaran:
foo
sumber
Jawaban:
CJam,
43 39 3635 byteIni terlihat terlalu panjang. Saya yakin saya tidak cukup Mengoptimalkan !Bagaimana itu bekerja:
Ide dasarnya adalah untuk membagi input pada baris baru, menghitung jumlah spasi terdepan di setiap baris, mengurutkan dan mendapatkan nomor unik, menyalin array itu dan membalikkan salinan, mentransliterasikan nomor urutan asli dengan dua array ini dan akhirnya membentuk string terakhir menggunakan informasi ini.
Bagian terlama adalah untuk mencari tahu berapa banyak ruang utama yang ada di setiap baris karena CJam tidak memiliki cara mudah untuk melakukannya.
Perluasan kode:
Dan dalam semangat pertanyaan. Perluasan nyata dari kode:
7 byte disimpan berkat Martin dan 1 byte berkat Dennis
Cobalah online di sini
sumber
{}#
memiliki bug: mengembalikan Integer, tetapi harus mengembalikan Long. Ironisnya,i
(cast to integer) memperbaiki ini. 2. Karena""#
tidak memiliki bug yang sama,_Sm0=#
lebih pendek satu byte.Python 2 -
137131 byteMengambil input dengan
|
alih - alih\n
.Penjelasan
Tiga baris pertama cukup mudah. Buat daftar semua garis dalam input, tentukan fungsi yang memberi tahu Anda seberapa besar spasi yang dimiliki oleh string, dan buat daftar nilai yang diurutkan yang fungsi tersebut keluarkan untuk setiap baris input.
Baris terakhir jauh lebih menyenangkan.
sumber
()
hemat 4raw_
)f(s)for s in i
seharusnyamap(f,i)
.d=[];d+=set(L)
adalah versi lebih pendek darid=sorted(set(L))
.JavaScript, ES6,
113 103101 byteSaya cukup yakin ini bisa bermain golf setidaknya sedikit lebih jauh, tapi begini saja.Tidak akan pernah berpikir bahwa akan ada solusi JS byte 101, mengalahkan Python!
Ini menciptakan metode bernama
f
yang dapat dipanggil dengan string input. Jika Anda menggunakan Firefox terbaru, Anda memiliki string templat dan Anda dapat memanggil metode sepertiKalau tidak, Anda juga bisa menyebutnya seperti
atau, coba cuplikan di bawah ini:
sumber
\s
dengan karakter spasi), dan menghapus tanda kurung dix
dalam fungsi ganti.(x)
: /b
danc
apakah Anda? Mereka hanya merujuk pada array yang sama.Ruby, 63 byte
Ini mendefinisikan fungsi tanpa nama yang mengambil dan mengembalikan string. Anda bisa memanggilnya dengan menambahkan
["string here"]
atau dengan menugaskannya ke variabel, dan kemudian memanggil variabel itu.Cara kerjanya:
s.scan(r=/^ */)
memberikan daftar semua ruang terkemuka dan toko yang masuk kembalir
untuk digunakan nanti.uniq
menghilangkan duplikat.sort
... macam.Sekarang lompat ke akhir,
l.zip(l.reverse)
berikan array pasangan yang ingin kita gantikan.to_h
mengubahnya menjadi hash, menafsirkan pasangan sebagai pasangan kunci-nilai.Sekarang
s.gsub
diganti semua kecocokan regex (semua ruang utama) dengan menggunakan hash itu sebagai tabel pencarian untuk menemukan penggantinya.sumber
Pyth 39
Cobalah online.
Menggunakan
|
opsi pembatas.sumber
Japt
-R
, 27 byteCobalah online!
Dibongkar & Cara kerjanya
Cara benar-benar bekerja
sumber
Scala,
176171Ini akan menambahkan baris baru ekstra di akhir. Jika saya tidak harus menyimpan ruang di akhir baris, saya bisa mendapatkannya ke 167:
Tidak Disatukan:
sumber
PowerShell , 112 byte
Cobalah online!
Kurang bermain golf:
sumber
Haskell, 116
sumber
PHP - 173 byte
Kode yang tidak dioptimalkan harus disimpan dalam
$v
variabel:Ini adalah versi yang tidak diklik dan dikomentari:
Saya mungkin tidak pernah menulis sesuatu yang begitu kotor. Aku malu.
sumber
JavaScript, 351
Versi tidak disatukan:
Pengujian
Tampilkan cuplikan kode
Tampilkan cuplikan kode
Tampilkan cuplikan kode
Tampilkan cuplikan kode
sumber
Perl 5, 112
111 +1 untuk
-n
(-E
gratis)Saya yakin itu bisa dilakukan dengan pukulan lebih sedikit, tetapi saya tidak melihat bagaimana saat ini.
sumber