Đếm ngược và tái chế


14

Đếm ngược

Mục tiêu của bạn cho thử thách chơi gôn mã này là đếm ngược và đồng thời tái chế số lượng. Hãy để tôi giải thích.

Đầu tiên, ứng dụng của bạn đọc một số, dưới dạng đối số chương trình hoặc sử dụng stdin. Tiếp theo bạn sẽ chỉ cần đếm ngược như thế này: 10 9 8 7 6(theo thứ tự giảm dần )

Nhưng chờ đợi, có nhiều hơn nữa!

Tái chế

Có những tình huống chúng ta có thể in mọi số, nhưng không liệt kê mỗi số, chúng ta có thể tái chế! Hãy để tôi đưa ra một ví dụ nhanh:

Input: 110

Output:   11091081071061051041031021010099... etc
Recycled:  10                        1

Bây giờ chúng tôi vẫn liệt kê tất cả các số, 110, 109, 108, nhưng chúng tôi đã tái chế 01 .

Một vi dụ khac:

Input: 9900

Output:   9900989989897989698959894... etc
Recycled:        9 98  

Thử thách chơi gôn

  • Đọc một số (đối số hoặc stdin)
  • Xuất bộ đếm ngược theo thứ tự giảm dần trong khi tái chế tất cả các số có thể (đến thiết bị xuất chuẩn hoặc tệp)
  • Dừng lại khi bạn đạt 1 HOẶC thời điểm bạn tái chế từ 0 đến 9 (bất cứ điều gì xảy ra trước)

Ví dụ đơn giản (cho đến khi đạt 1):

Input: 15
Output: 15141312110987654321

(Notice the 110 instead of 1110)

Ví dụ nâng cao hơn (tất cả được tái chế):

Input: 110
Output:   110910810710610510410310210100998979695949392919089887868584838281807978776757473727170696867665646362616059585756554535251504948474645443424140393837363534332313029282726252423221
Recycled:  10                            9                    8                    7                    6                    5                    4                    3                    2

(We've recycled all 0-9)


2
Nó thực sự không liên quan đến vấn đề "một vòng để thống trị tất cả".
Sẽ

@RoyvanRijn bạn đã không đề cập bất cứ điều gì về thứ tự tăng dần trong câu hỏi của bạn - nếu tôi không có phiếu bầu gần như trùng lặp, tôi sẽ có "không rõ bạn đang hỏi gì". nếu các số phải theo thứ tự tăng dần, thì làm sao 10 (trong ví dụ thứ hai của bạn) có thể đúng khi bắt đầu chuỗi?
tự hào

1
@proudhaskeller không câu hỏi chỉ định thứ tự giảm dần ? "đếm ngược" được hiểu là thứ tự giảm dần.
Sẽ

1
Roy, tôi đã không bỏ phiếu để đóng như là một bản sao. Nhưng việc đề cập rõ ràng đến các câu hỏi liên quan sẽ bổ sung cho việc tự động đoán các câu hỏi liên quan của hệ thống. @ Sẽ, tất nhiên nó liên quan. Xóa điều kiện dừng sớm và câu hỏi này yêu cầu bạn thực hiện chiến lược không tối ưu cụ thể cho "một chuỗi để cai trị tất cả".
Peter Taylor

Câu trả lời:


11

T-SQL - 291 277 267 217 199 191 166 158 153 145 142 128 117

Sau khi tiếp cận điều này theo một cách mới, tôi đã cố gắng giảm xuống còn 145 (142 sau một vài điều chỉnh nhỏ), không quá tồi tàn. Điều đó có nghĩa là tôi có thể cạnh tranh để giành bạc hoặc đồng. ^^

DECLARE @ INT=100;WITH N AS(SELECT 1A UNION ALL SELECT A+1FROM N WHERE A<@)SELECT LEFT(A,LEN(A)-1+A%11)FROM N ORDER BY-A

Điều này không in một danh sách, nó chọn kết quả. Câu hỏi không bao giờ đưa ra chi tiết cụ thể về đầu ra, vì vậy điều này sẽ ổn. Điều này vẫn có cùng giới hạn 100 cho đầu vào, một phần vì tôi lạm dụng thực tế là cứ sau 11 học kỳ dưới 100 thì mất một ký tự và một phần do giới hạn đệ quy 100 mặc định trên các biểu thức bảng chung.

DECLARE @ INT=100;

WITH N AS
(
    SELECT 1A
    UNION ALL
    SELECT A+1
    FROM N
    WHERE A<@
)

SELECT LEFT(A,LEN(A)-1+A%11)
FROM N
ORDER BY-A

1
Haha T-SQL, một trong những tốt đẹp!
Roy van Rijn

7

Con trăn 143 147

def t(n):
 p=o='';r=0 # p is previous string, o is output string, r is recycled bitmap
 while n and r<1023: # 1023 is first 10 bits set, meaning all digits have been recycled
    s=`n`;i=-1 # s is the current string representation of n
       # i is from end; negative offsets count backwards in strings
    while p.endswith(s[:i])-1:i-=1 # find common ending with prev; s[:0] is '',
       # which all strings end with
    for j in s[:i]:r|=1<<int(j) # mark off recycled bits
    o+=s[i:];p=s;n-=1 # concatenate output, prepare for next number
 print o # done

Mức thụt đầu tiên là không gian, cấp thứ hai là tab char.


2
Một số char tiết kiệm tiêu chuẩn: Đặt những thứ như p=o=''là thông số tùy chọn cho hàm; bạn có thể sử dụng *cho andtrong n and r<1023hoặc thậm chí r<1023*n; while x-1:có thể cạo một không gian như while~-x. Ngoài ra, có thể ngắn hơn để sử dụng một tập hợp các chữ số thay vì mặt nạ bit để lưu trữ các chữ số đã được sử dụng.
xnor

5

Haskell, 154 149 147 145 128 120 119 117 byte

import Data.List
(r%x)n|n>0&&r<":"=[(r\\t)%(x++(show n\\t))$n-1|t<-tails x,isPrefixOf t$show n]!!0|0<1=x
h=['0'..]%""

Thêm vào việc kiểm tra tái chế tốn rất nhiều ký tự ... thở dài

đánh gôn một chút bằng cách nhớ những chữ số nào chưa được tái chế và dừng lại khi danh sách trống. sau đó đánh gôn thêm một chút bằng cách chuyển sang đệ quy rõ ràng và thêm một vài thủ thuật.

đầu ra ví dụ:

*Main> h 110
"110910810710610510410310210100998979695949392919089887868584838281807978776757473727170696867665646362616059585756554535251504948474645443424140393837363534332313029282726252423221"

5

Con trăn 2: 119 117

Đánh dấu đây là wiki cộng đồng vì đây chỉ là phiên bản được đánh gôn nhiều hơn của Will .

n=input()
d=s,={''}
exec"t=`n`;i=len(t)\nwhile(s*i)[-i:]!=t[:i]:i-=1\ns+=t[i:];d|=set(t[:i]);n-=len(d)<11;"*n
print s

tuyệt diệu! Làm thế nào để d=s,={''}làm việc?
Sẽ

2
@ Sẽ d=s,={''}tương đương với d={''}; s,={''}. s,={''}sử dụng giải nén chuỗi, một tính năng được sử dụng phổ biến hơn trong các câu lệnh như a, b = (b, a), nhưng bạn cũng có thể sử dụng nó để trích xuất phần tử duy nhất từ ​​chuỗi phần tử đơn.
flornquake

1
@flornquake ơi, lỗi rồi. Tôi nghĩ bạn vẫn có thể làm được len(d)%11*n, mặc dù có vẻ như nó đang di chuyển với bạn bằng cách sử dụng vòng lặp exec.
xnor

1
@ Sẽ làm nền tảng cho lý do tại sao thủ thuật thông minh này hiệu quả, thật lâu dài để tạo ra một tập hợp trống set()hơn một tập hợp phần tử đơn {x}. Vì vậy, flornquake khởi tạo nó với một thành viên phụ và kiểm tra xem nó có đủ mười chữ số hay không bằng cách xem nó có mười một phần tử không. Vì chuỗi rỗng cần được khởi tạo thành s, nó được tạo để phục vụ như là thành viên phụ này, kết hợp các khởi tạo này để lưu ký tự.
xnor

1
@ len(d)%11*nSẽ có , sẽ rất tốt. :)
flornquake

4

Ruby, 145 139 130 byte

n=gets.to_i
d=*?0..?9
s=''
n.times{|i|j=(t=(n-i).to_s).size;j-=1 while s[-j,j]!=u=t[0,j];d-=u.chars;s=t;$><<t[j..-1];exit if[]==d}

Cách tiếp cận tương tự với Will, ngoại trừ tôi không sử dụng mặt nạ bit, nhưng thay vào đó là một mảng các chữ số không được sử dụng. Đầu vào là thông qua STDIN.

Có một phiên bản thay thế bằng cách sử dụng whilethay vì timesnhưng bất cứ điều gì tôi thử, số lượng byte là như nhau:

n=gets.to_i
d=*?0..?9
s=''
(j=(t=n.to_s).size;j-=1 while s[-j,j]!=u=t[0,j];d-=u.chars;s=t;$><<t[j..-1];exit if[]==d;n-=1)while 0<n

3

CJam, 80 77 65 57 54 Nhân vật

Có lẽ hoàn toàn không được tối ưu hóa, nhưng sau rất nhiều tối ưu hóa và gỡ lỗi ở đây là chuyển đổi trực tiếp câu trả lời ES6 của tôi trong CJam:

Mr{s:C_,{:H<M_,H->=!_CH@-@}g:T>+:MCT<_O@-+:O,A<Ci(*}h;

Hãy thử trực tuyến tại đây . Hàm lấy số là STDIN và đưa ra bộ đếm ngược được tái chế, dừng lại giữa chừng nếu quá trình tái chế hoàn tất.

Tôi sẽ cố gắng để chơi golf hơn nữa.

Làm thế nào nó hoạt động:

Ý tưởng cơ bản là với mỗi số đếm ngược C, kiểm tra xem các chữ số H đầu tiên có bằng các chữ số H cuối cùng của chuỗi kết quả hay không, trong đó H đi từ số chữ số trong C đến 0

Mr                                    "Put an empty string and input on stack";
  { ... }h;                           "Run while top element of stack is true, pop when done";
s:C                                   "Store string value of top stack element in C"
   _,                                 "Put the number of characters in C to stack";
     { ... }g                         "Run while top element of stack is true";
:H<                                   "Store the digit iteration in H and slice C";
   M                                  "M is the final output string in making";
    _,H-                              "Take length of M and reduce H from it";
        >                             "Take that many digits of M from end and..."
         =!_                          "Compare with first H digits of C, negate and copy";
            CH@                       "Put C and H on stack and bring the above result to top of stack";
               -                      "Reduce H if the matched result was false";
                @                     "Bring the matched result on top in order continue or break the loop"
             :T                       "Store top stack element in T after the loop";
               >+:M                   "Take everything but first T digits of C and add it to M and update M";
                   CT<_               "Take first T digits of C and copy them";
                       O@             "Put saved digits on stack, and rotate top three elements";
                         -            "Remove all occurence of first T digits of C from O";
                          +:O         "Add first T digits of C to O and update O";
                             ,A<      "Compare number of saved digits with 10";
                                Ci(   "Decrement integer value of C and put it on stack";
                                   *  "If number of saved digits greater than 9, break loop";

2

JavaScript ES6, 149 146 ký tự

Verbose như vậy, nhiều nhân vật, wow.

C=n=>{s=c='';while(n>0&s.length<10){j=1;while(t=(n+'').slice(0,-j++))if(c.endsWith(t)){s+=~s.search(t)?'':t;break}c+=(n--+'').slice(1-j)}return c}

Chạy nó trong Bảng điều khiển web mới nhất của Firefox.

Sau khi chạy, nó tạo ra một phương thức Cmà bạn có thể sử dụng như

C(12)
12110987654321

CẬP NHẬT : Đôi khi, đơn giản cũ returnlà ngắn hơn đóng chức năng mũi tên :)


Không nên đưa ra những chữ số nào được tái chế, chỉ có chuỗi đếm ngược sau khi tái chế
tự hào

Oh! phải không Tất cả các ví dụ của ông cũng xuất ra điều đó.
Tối ưu hóa

@proudhaskeller ơi, tôi cũng sản xuất các ký tự tái chế. Cảm ơn, điều đó sẽ giúp tôi tiết kiệm một số ký tự.
PenutReaper
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.