Tugas
Ini adalah tantangan sederhana. Input Anda adalah string tunggal yang tidak kosong, hanya berisi digit 0123456789
dan hash #
. Ini akan berisi tepat satu putaran digit, yang mengkodekan integer nonnegatif dan mungkin membungkus ujung string, dan setidaknya satu #
. Bilangan bulat mungkin memiliki angka nol di depan. Sebagai contoh, ##44##
, 013####
dan 23###1
merupakan input yang valid, sementara ###
, 0099
dan #4#4
tidak.
Tugas Anda adalah mengekstrak integer n
dari string, dan mengeluarkan string yang diputar n
ke kanan.
Contohnya
- Input
#1##
harus diputar 1 langkah ke kanan, sehingga output yang benar adalah##1#
. - Input
#026###
harus diputar 26 langkah ke kanan, karena awalan 0 diabaikan. Output yang benar adalah26####0
. - Input
1####2
berisi bilangan bulat 21 yang dibungkus ujungnya, sehingga harus diputar 21 langkah ke kanan. Output yang benar adalah##21##
.
Aturan dan penilaian
Anda dapat menulis program atau fungsi lengkap. Hitungan byte terendah menang, dan celah standar tidak diizinkan.
Anda dapat menganggap bahwa nomor tersebut n
sesuai dengan int
jenis standar bahasa Anda. Sebaliknya, jika int
tipe standar itu mengimplementasikan bilangan bulat presisi arbitrer, Anda harus mendukung (secara teori) besar sembarang n
.
Uji kasus
#1## -> ##1#
##4## -> #4###
1####1 -> ####11
1####2 -> ##21##
#026### -> 26####0
#000### -> #000###
###82399 -> ##82399#
51379#97 -> #9751379
#98##### -> ###98###
#######4## -> #4########
60752#1183 -> 8360752#11
####99366800## -> 366800######99
########9##### -> ###9##########
91#####515694837 -> 1#####5156948379
###6114558###### -> #6114558########
######219088736090042#### -> 9088736090042##########21
#46055080150577874656291186550000138168########### -> 0138168############4605508015057787465629118655000
568375993099127531613012513406622393034741346840434468680494753262730615610086255892915828812820699971764142551702608639695081452206500085233149468399533981039485419872101852######################3680 -> 99533981039485419872101852######################36805683759930991275316130125134066223930347413468404344686804947532627306156100862558929158288128206999717641425517026086396950814522065000852331494683
n
sesuai denganint
jenis asli bahasa Anda (yang mungkin presisi sewenang-wenang). Saya akan memperbarui teks tantangan nanti.1234
?Jawaban:
CJam, 11 byte
Cobalah online! atau verifikasi semua kasus uji .
Perhatikan bahwa ini tidak akan berfungsi untuk dua kasus uji terakhir, karena angka yang terlibat tidak masuk ke dalam 64 bit.
Bagaimana itu bekerja
sumber
Julia,
7165 byteIni adalah fungsi anonim yang menerima string dan mengembalikan string. Untuk menyebutnya, tetapkan ke variabel.
Kami menambahkan input ke dirinya sendiri, membaginya menjadi array dengan
#
sebagai pemisah, parsing setiap integer, dan ambil yang maksimal. Ini menentukan berapa kali kita menggeser string ke kanan. Kami memerciki string menjadiChar
array, bergeser, danjoin
kembali bersama.sumber
Python, 66 byte
sumber
Retina,
655749Disimpan 8 byte berkat Martin!
Cobalah secara Online!
Perhatikan bahwa ini akan kehabisan / kehabisan memori untuk kasus uji yang sangat besar secara online, dan pada sebagian besar mesin waras, untuk beberapa yang lebih besar.
Ini mengambil angka terakhir dalam string dan angka pertama atau tidak ada dalam string dan menempatkannya di depan string. Kemudian mengkonversi angka gabungan menjadi unary dan berulang kali berputar sambil menjatuhkan digit unary.
sumber
Jelly,
1210 byteCobalah online! atau verifikasi semua kasus uji .
Latar Belakang
Katakan inputnya
51379#97
.Dengan mengulangi string dua kali (
51379#9751379#97
), kita dapat memastikan bahwa itu akan berisi representasi angka yang berdekatan.Selanjutnya, kami menerapkan bitwise TIDAK untuk semua karakter. Ini mencoba untuk melemparkan ke int, jadi '1' akan dievaluasi menjadi 1 , lalu dipetakan ke ~ 1 = -2 . Pada kegagalan (
#
), ia mengembalikan 0 .Sebagai contoh kita, ini memberi
Selanjutnya, kami membagi pada nol untuk memisahkan bagian yang menyandikan nomor dari yang lain.
Bitwise TIDAK memetakan n ke -n - 1 , jadi kami menambah masing-masing untuk mendapatkan -n .
Selanjutnya, kami mengonversi setiap daftar dari basis 10 ke integer.
Angka terendah adalah negatif dari yang kita cari. Karena atom rotasi daftar jeli
ṙ
berputar ke kiri , ini menghindari perkalian dengan -1 untuk memutar ke kanan.Bagaimana itu bekerja
sumber
MATL ,
28251716 byte8 byte kurang meminjam ide Dennis untuk memisahkan array dan membalik urutan potongan
Dua test case terakhir tidak berfungsi karena angkanya terlalu besar.
EDIT (20 Mei 2016) Kode dalam tautan menggunakan
Xz
alih-alihXv
, karena perubahan bahasa terbaru.Cobalah online!
sumber
PowerShell, 153 byte
(Tetapi lihat bagian Kredit Ekstra, di bawah)
PowerShell tidak memiliki konsep "menggeser" array, jadi saya harus memutar solusi saya sendiri. Akan membutuhkan waktu lama untuk angka yang lebih besar, tetapi pada akhirnya harus menyelesaikan apa pun yang cocok dengan int 32-bit.
Mengambil input
$a
, dan menetapkan variabel baru$d
sebagai objek [System.Collections.ArrayList] . Ini dilakukan karena, secara teknis, array di PowerShell tidak dapat diubah (dijelaskan lebih lanjut di bawah dalam Kredit Tambahan) , dan karenanya tidak mendukung penyisipan atau pemindahan yang sewenang-wenang, yang diperlukan untuk pengalihan. Lalu, kita masukkan satufor
lingkaran.Kondisi awal adalah trik yang saya temukan - jika kita menggabungkan input bersama, membagi
#
, dan mengabaikan kosong, elemen kedua dari array yang dihasilkan akan sama dengan nomor kita, terlepas dari pembungkusnya. Kami atur itu$b
, dan kurangi$b
setiap kali hingga nol.Setiap iterasi, kami menetapkan helper
$r
sebagai elemen terakhir dalam daftar array, menghapus elemen terakhir, dan kemudian memasukkan elemen ke depan ... secara efektif "menggeser" array ke kanan dengan satu elemen.Akhirnya, kami cukup mengeluarkan dengan
-join$d
sehingga disatukan menjadi satu string.Kredit tambahan
Jika masalahnya adalah menggeser array ke kiri dan bukan ke kanan , kita dapat melakukannya secara signifikan menggunakan lebih pendek banyak penugasan . Pada dasarnya, "Jika nilai penugasan berisi lebih banyak elemen daripada variabel, semua nilai yang tersisa ditugaskan ke variabel terakhir."
Intinya, ini berarti sesuatu seperti
$c=@(1,2,3)
dan$a,$b=$c
akan memiliki
$a=1
int dan$b=@(2,3)
array.PowerShell, 90 byte, melakukan shift kiri dan bukannya shift kanan
Di sini kita sekali lagi mengambil input, dan mengatur
$b
seperti di atas. Kami melemparkan kembali$a
sebagai array char, dan kemudian masukkanfor
loop yang sama seperti di atas. Namun, kali ini, kami tidak perlu mendukung penghapusan / penyisipan sewenang-wenang, jadi kami tidak perlu menggunakan[System.Collections.ArrayList]
objek yang mahal , maupun metode yang mahal. Alih-alih, kami hanya mengatur$r
untuk menjadi elemen pertama$a
, dan elemen lainnya disimpan kembali$a
. Lalu kita+=
kembalikan ke akhir.(Seperti yang saya katakan, array PowerShell secara teknis tidak dapat diubah, tetapi
+=
operator di sini kelebihan beban - dibutuhkan sebuah array dan objek lain, menggabungkan keduanya (istilah teknis) ke dalam array baru, mengembalikannya dan menyimpannya sebagai nama variabel, dan menghancurkannya array asli. Secara fungsional, kami baru saja menambahkan elemen ke akhir array, tetapi secara teknis (dan dari perspektif memori / sampah-pembersihan, dll) itu adalah array baru. Ini jelas dapat menjadi operasi yang mahal jika array berukuran besar atau kompleks, flipside adalah itu, karena array tidak dapat diubah, pengindeksan ke dalam array atau iterasi di atasnya sangat murah.)Output tetap aksi yang sama, dengan
-join
pernyataan untuk mengubahnya menjadi string tunggal.sumber
Serius, 21 byte
Cobalah online!
Peringatan: solusi ini sangat tidak efisien, sehingga kasus uji yang lebih besar akan habis pada TIO. Gunakan penerjemah lokal.
Penjelasan:
sumber
Mathematica, 69 Bytes
Temukan urutan angka dalam, jika ada 2 maka urutannya perlu dibalik. Menggabungkan string (jika hanya satu itu hanya mengembalikan string angka). Ubah string menjadi numerik dan putar string tersebut beberapa kali.
sumber
FromDigits
bekerja bukanToExpression
.Pyth,
2214 byteCoba di sini!
Penjelasan
Ini berfungsi untuk semua testcases dan juga hampir selesai secara instan untuk angka yang sangat besar.
sumber
-...\#
bukanh:..."\d+"1
. Juga, tidak perlu mengkonversiz
ke daftar karakter,.>
berfungsi juga pada string.JavaScript (ES6) 66
Untuk sekali ini,
%
javascript negatif bodoh untuk angka negatif bergunasumber
b+a
adalah rangkaian string.a='32',b='1', (b?b+a:a)=='132', (b|0+a)==33
Pyth, 10 byte
Cobalah online. Suite uji.
Ini adalah terjemahan dari jawaban Dennis 'CJam . Saya menjadikannya wiki komunitas, karena saya tidak memunculkannya.
Penjelasan
sumber
JavaScript (ES6),
6764 bytePort lain dari jawaban Dennis CJam.
Sunting: Disimpan 3 byte dengan menggunakan bagian jawaban edc65 yang tidak menarik perhatiannya.
sumber
s+s
trik itu sebagai gantinya. (Saya benar-benar memikirkannya tadi malam tapi saya terlalu lelah untuk mencobanya saat itu.)Perl 5, 41 byte
39 byte plus dua untuk
-lF
bendera (-M5.01
gratis):perl -lF -M5.01 script.pl
Penjelasan:
-lF
membaca input, menghapus baris baru, memasukkan sisanya ke dalam string$_
, membaginya menjadi karakter, dan menempatkan yang terbagi ke dalam array@F
./#+/
menemukan string pertama#
dalam$_
dan set$`
sama dengan barang sebelumnya dan$'
sama dengan barang setelahnya. Jika$`
kosong maka$'
mungkin mengandung lebih banyak#
s. Namun,$'.$`
adalah string yang substring awalnya adalah berapa kali untuk memutar array.1..$'.$`
, yang memperlakukan$'.$`
sebagai bilangan bulat dan dengan demikian menjumlahkannya, yang menghapus final#
, jadi daftar adalah dari1
berapa kali untuk memutar array.pop
elemen terakhir danunshift
itu ke awal).say
semua elemen dari array yang diputar.sumber
Ruby -
687270 bytesplit
mengubah string menjadi array(s+s).scan(/\d+/)
merangkai string ke dirinya sendiri dan mendapatkan array angka (sebagai string)map(&:to_i)
mengkonversi string ke intsmax
pilih int terbesarrotate
max
waktu*""
mengubah array kembali menjadi string (singkatan untukjoin
)Penggunaan:
ruby scriptname.rb "[string]"
sumber
05AB1E ,
1413 byteYah, kodenya sangat tidak mungkin untuk diakhiri untuk angka yang lebih besar dari 100000, tetapi jika Anda cukup sabar, akan ada output :). Kode:
Penjelasan:
Cobalah online!
Menggunakan pengodean CP-1252
sumber
VBSCRIPT,
8299 BYTESkode sebelumnya tidak menangani kasus dengan nomor dibungkus ujung
UNGOLFED
ini agak menyebalkan ... mungkin ada cara yang lebih baik untuk melakukannya, bahkan dalam VBscript
sumber
a
input fungsi, dan mengembalikan output? Dengan begitu, Anda tidak perluinputbox
danmsgbox
menelepon.b
?Mathematica,
7358 byteBanyak byte. 15 byte disimpan berkat untuk IPoiler
sumber
StringRotateRight
menyimpan beberapa byte di sini.Matlab (73)
sumber
matlab
(86)72Fungsi menjumlahkan string dua kali, sekali untuk ekstraksi bilangan bulat, kedua untuk tugas yang diinginkan, tidak membutuhkan terlalu banyak waktu karena matlab melanjutkan untuk memutar oleh
(Dim)modulus(Length)
pengecualian bahwa ia jatuh dalam kegagalan segmentasi untuk rentang yang lebih besar.Akan berjuang bagaimana golf itu lebih ....
(86)
sumber