Chuỗi đo băng


15

Động lực : Đôi khi bạn cần biết bạn đang ở đâu trong một chuỗi. Bạn muốn có thể nhìn vào bất kỳ phần nào của chuỗi và biết chính xác bạn đang ở đâu, càng xa càng tốt.

Thách thức : viết chương trình để xuất chuỗi đo băng có độ dài cho trước. Một chuỗi đo băng tự mô tả độ dài của nó thường xuyên nhất có thể dọc theo chiều dài của chính nó.

Quy tắc :

  1. Chương trình của bạn phải lấy một tham số nguyên dương, cho tổng chiều dài của chuỗi đo băng
  2. Đối với mỗi chuỗi chữ số liền kề trong đầu ra, các chữ số này phải báo cáo chính xác độ dài của đầu ra cho đến nay - bao gồm !
    1. Độ dài được đo từ đầu chuỗi đến cuối mỗi số
  3. Càng nhiều số độ dài càng tốt trong chuỗi
  4. Tránh sự mơ hồ. Dấu phân cách / dấu phân cách có thể được sử dụng để tránh các số bị xen kẽ, tức là 12nói mười hai không phải một, hai.
  5. Chuỗi phải luôn báo cáo chính xác tổng chiều dài của nó ở cuối, không có dấu phân cách
  6. Bạn có thể cần nhiều dấu phân cách để giữ độ dài chính xác, ví dụ: đây là một chuỗi đo băng ví dụ có độ dài 4: 1--4

Ví dụ không kê đơn / toàn diện:

  • băng đo dây dài 1: 1
  • băng đo dây dài 2: -2
  • băng đo dây dài 3: 1-3
  • băng đo chuỗi có độ dài 4: 1--4hoặc -2-4(cả hai độ dài báo cáo càng thường xuyên càng tốt, tức là hai lần và kết thúc với tổng độ dài chính xác)
  • băng đo dây dài 10: 1-3-5-7-10
  • thước dây chuỗi có độ dài 11: 1-3-5-7--11hay 1-3-5--8-11hay 1-3--6-8-11hay 1--4-6-8-11hay -2-4-6-8-11(tất cả có nhiều số chiều dài càng tốt, và kết thúc với tổng chiều dài chuỗi)

Vì vậy, mỗi chữ số trong chuỗi không liền kề với một chữ số khác, chuỗi được tạo thành hoàn toàn bằng dấu gạch ngang -và bạn cần phải có nhiều dấu độ dài nhất có thể trong chuỗi?
Rɪᴋᴇʀ

Chúng ta có thể sử dụng lập chỉ mục dựa trên 0 không?
Rɪᴋᴇʀ

@EasterlyIrk Quy tắc 3 càng nhiều số càng tốt phải phù hợp với chuỗi.
Đăng Rock Garf Hunter


@EasterlyIrk bạn không thể có tất cả dấu gạch ngang vì không đáp ứng được động lực và phá vỡ quy tắc 3 và 5. Không có lập chỉ mục. Chỉ cần độ dài. Vì vậy, không, một chuỗi đo băng có độ dài một, không thể 0.
Tom Viner

Câu trả lời:


12

Python, 50 48 47 46 byte

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

Giải trình

Giải pháp lambda đệ quy khá đơn giản

Các trường hợp cơ sở của chúng tôi là 1 và 0 được bao phủ bởi "1"*xnếu không chúng tôi nhận được chuỗi -xvới `-x`và trả trước kết quả của việc gọi hàm trên len(`-x`)ít hơn.


1
Bạn có thể lưu byte bằng cách xâu chuỗi -x?
Martin Ender

@MartinEnder Ok tôi đã làm cho nó hoạt động. Cảm ơn vì tiền hỗ trợ! Tôi cảm thấy ngớ ngẩn vì không nhận ra điều đó sớm hơn.
Đăng Rock Garf Hunter

5

Toán học, 67 57 byte

Cảm ơn Martin Ender vì đã vứt bỏ 10 byte!

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

Hàm không tên lấy một đối số nguyên không âm và trả về một chuỗi. Khá nhiều thuật toán đệ quy rõ ràng: đảm bảo chuỗi kết thúc với số đầu vào đứng trước a "-", và sau đó gọi lại hàm bằng cách sử dụng #0.

Nhưng có niềm vui golf để có được trong việc thực hiện thuật toán. ""["1"][[#]]biểu thị #đối số thứ của biểu thức ""["1"]: đối số 0 là đầu ""và đối số thứ nhất là rõ ràng "1", cung cấp các trường hợp cơ bản của đệ quy. Nếu #vượt quá 1, thì ""["1"][[#]]sẽ ném một thông báo lỗi và vẫn là một hàm không được đánh giá. Nhưng sau đó /._@__:>là một quy tắc lấy bất kỳ hàm không được đánh giá nào và biến nó thành biểu thức tiếp theo, đó là lệnh gọi đệ quy cho hàm ban đầu.

Trình gốc:

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

2
""["1"][[#]]/._@__:>#0[#-1-IntegerLength@#]<>ToString@-#&lưu một byte bằng cách tránh Ifvà một loạt byte bằng cách tránh IntegerString"-"<>.
Martin Ender

1
ồ, _@__là ma thuật xấu xa
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
Tôi nghĩ bạn cần xác địnhf
Tom Viner

@TomViner Tôi luôn luôn làm điều đó. (Ít nhất là tôi đã có số byte đúng.)
Neil


1

Perl 6 , 43 byte

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

Giải trình:

{                                         }  # 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".

Vì vậy, ví dụ cho đầu vào 10, nó tạo ra chuỗi (-10, -7, -5, -3, -1)và từ chuỗi đó -1-3-5-7-10và từ chuỗi cuối cùng 1-3-5-7-10.

Hãy thử trực tuyến .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.