Pita Pengukur Tali


15

Motivasi : Terkadang Anda perlu tahu di mana Anda berada dalam sebuah tali. Anda ingin dapat melihat bagian mana pun dari string dan tahu persis di mana Anda berada, sejauh mungkin.

Tantangan : menulis sebuah program untuk menghasilkan string pita pengukur panjang tertentu. Sebuah pita ukuran tali diri menjelaskan nya panjang-jadi-jauh sesering mungkin sepanjang itu panjang sendiri.

Aturan :

  1. Program Anda harus mengambil satu parameter bilangan bulat positif, untuk panjang total string pita pengukur
  2. Untuk setiap string angka yang berdekatan dalam output, digit ini harus secara akurat melaporkan panjang output sejauh ini - inklusif !
    1. Panjang diukur dari awal string ke akhir setiap angka
  3. Nomor panjang sebanyak mungkin harus dimasukkan dalam string
  4. Hindari ambiguitas. Pemisah / pembatas dapat digunakan untuk menghindari angka yang disandingkan, yaitu 12kata dua belas bukan satu, dua.
  5. String harus selalu secara akurat melaporkan panjang totalnya di ujungnya, tanpa pemisah tambahan
  6. Anda mungkin perlu beberapa pemisah untuk menjaga panjangnya tetap akurat, mis. Inilah contoh pita pengukur panjang 4: 1--4

Contoh non preskriptif / lengkap:

  • pita pengukur string panjang 1: 1
  • pita pengukur panjang 2: -2
  • pita pengukur panjang 3: 1-3
  • pita pengukur tali panjang 4: 1--4atau -2-4(keduanya panjang laporan sesering mungkin, yaitu dua kali, dan akhiri dengan panjang total yang benar)
  • pita pengukur panjang 10: 1-3-5-7-10
  • pita ukuran string dengan panjang 11: 1-3-5-7--11atau 1-3-5--8-11atau 1-3--6-8-11atau 1--4-6-8-11atau -2-4-6-8-11(semua memiliki banyak nomor panjang mungkin, dan finish dengan total panjang string)

Jadi setiap digit dalam string tidak berbatasan dengan digit lain, string seluruhnya terdiri dari tanda hubung -, dan Anda perlu memiliki tanda panjang sebanyak mungkin di string?
Rɪᴋᴇʀ

Bisakah kita menggunakan pengindeksan berbasis 0?
Rɪᴋᴇʀ

@EasterlyIrk Rule 3 adalah sebanyak mungkin angka yang harus dimasukkan ke dalam string.
Post Rock Garf Hunter


@EasterlyIrk Anda tidak dapat memiliki semua tanda hubung karena gagal memenuhi motivasi dan melanggar aturan 3 dan 5. Tidak ada pengindeksan. Hanya panjang. Jadi tidak, pita pengukur satu tali panjang, tidak bisa 0.
Tom Viner

Jawaban:


12

Python, 50 48 47 46 byte

f=lambda x:x*"1"if x<2else f(x-len(`-x`))+`-x`

Penjelasan

Solusi lambda rekursif yang cukup sederhana

Kasing dasar kami adalah 1 dan 0 yang dicakup oleh "1"*xjika tidak, kami mendapatkan string -xdengan `-x`dan menambahkan hasil memanggil fungsi pada len(`-x`)less.


1
Bisakah Anda menyimpan byte dengan meregangkan -x?
Martin Ender

@ MartinEnder Ok saya mulai bekerja. Terima kasih atas tipnya! Aku merasa agak bodoh karena tidak memperhatikan itu sebelumnya.
Post Rock Garf Hunter

5

Mathematica, 67 57 byte

Terima kasih kepada Martin Ender untuk membuang 10 byte!

""["1"][[#]]/._@__:>#0[#-1-IntegerLength@#]<>ToString@-#&

Fungsi tanpa nama mengambil argumen integer nonnegatif dan mengembalikan string. Cukup banyak algoritma rekursif yang jelas: pastikan string berakhir dengan nomor input yang didahului oleh "-", dan kemudian panggil fungsi lagi menggunakan#0 .

Tapi ada kesenangan golf yang bisa didapat dalam mengimplementasikan algoritma. ""["1"][[#]]menunjukkan #argumen th ekspresi ""["1"]: argumen 0 adalah kepala ""dan argumen 1 terlihat "1", yang menyediakan dasar kasus rekursi. Jika #melebihi 1, maka ""["1"][[#]]melempar pesan kesalahan dan tetap sebagai fungsi yang tidak dievaluasi. Tapi kemudian/._@__:> adalah aturan yang mengambil fungsi yang tidak dievaluasi dan mengubahnya menjadi ekspresi yang muncul berikutnya, yang merupakan panggilan rekursif ke fungsi asli.

Pengajuan asli:

If[#<2,""["1"][[#]],#0[#-1-IntegerLength@#]<>"-"<>IntegerString@#]&

2
""["1"][[#]]/._@__:>#0[#-1-IntegerLength@#]<>ToString@-#&menyimpan satu byte dengan menghindari Ifdan banyak byte dengan menghindari IntegerStringdan "-"<>.
Martin Ender

1
OMG, _@__adalah sihir jahat
Greg Martin

3

JavaScript (ES6), 49 byte

f=(n,s='',t=''+-n)=>n>1?f(n-t.length,t+s):n?n+s:s
<input type=number oninput=o.value=f(this.value)><br><textarea id=o></textarea>


1
Saya pikir Anda perlu mendefinisikanf
Tom Viner

@ TomViner, saya selalu melakukan itu. (Setidaknya saya memiliki hitungan byte yang tepat.)
Neil


1

Perl 6 , 43 byte

{[R~](-$_,{$_+.comb}...^*>-1).&{S/^\-1/1/}}

Penjelasan:

{                                         }  # A lambda.
                    ...                      # Generate a sequence...
      -$_                                    #   starting from the negated lambda argument,
         ,{        }                         #   continuing iteratively using the formula:
           $_+.comb                          #     Last element plus length of last element.
                        *>-1                 #   until we hit 0 or higher,
                       ^                         end-point not inclusive.
 [R~](                      )                # Reverse and concatenate the number sequence.
                             .&{         }   # Apply to this the transformation:
                                S/^\-1/1/    #   Remove the sign from a leading "-1".

Jadi misalnya untuk input 10, ia menghasilkan urutan (-10, -7, -5, -3, -1), dan dari string itu -1-3-5-7-10, dan dari string terakhir 1-3-5-7-10.

Cobalah online .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.