Chia thành số, tham gia dưới dạng chuỗi, lặp lại


14

Xem xét quá trình:

  1. Lấy một số nguyên không âm N.
    ví dụ 27.

  2. Chia nó thành các số nguyên N - floor(N/2)floor(N/2)(một nửa 'lớn hơn' và 'nhỏ hơn') và viết chúng theo thứ tự đó.
    ví dụ 27trở thành 14 13.

  3. Xóa không gian để nối các số nguyên thành một số nguyên mới, lớn hơn nhiều.
    ví dụ 14 13trở thành 1413.

  4. Lặp lại các bước 2 và 3 một số lần mong muốn.
    ví dụ: 1413707 706707706353853 353853353853353853→ ...

Thử thách này là về việc thực hiện chính xác điều này, nhưng không phải lúc nào cũng ở cơ sở 10.

Thử thách

Viết chương trình có ba số B, N và S:

  • B là một số nguyên từ 2 đến 10 là cơ sở của N (nhị phân đến thập phân).

  • N là số nguyên không âm để áp dụng quy trình chia tách lại. Để làm cho đầu vào của người dùng dễ dàng hơn, nó được cung cấp dưới dạng một chuỗi trong cơ sở B, không phải là một số nguyên.

  • S là một số nguyên không âm là số lần lặp lại quá trình chia tách lại.

Đầu ra của chương trình là biểu diễn chuỗi của N trong cơ sở B sau các thủ tục chia tách S.

Khi S là 0, không có sự phân tách nào được thực hiện, vì vậy đầu ra luôn là N.

Khi N là 0, tất cả các phần tách có dạng 0 0và giảm xuống 0một lần nữa, vì vậy đầu ra luôn luôn 0.

Ví dụ

  • B = 10, N = 27, S = 11413
  • B = 10, N = 27, S = 2707706
  • B = 9, N = 27, S = 11413
  • B = 9, N = 27, S = 2652651
  • B = anything, N = anything, S = 0N
  • B = anything, N = 0, S = anything0

Bảng cho tất cả B với N = 1for S = 0to 7:

B       S=0     S=1     S=2     S=3         S=4             S=5                 S=6                                 S=7
2       1       10      11      101         1110            111111              10000011111                         10000100001000001111
3       1       10      21      1110        202201          101101101100        1201201201212012012011              212100212102121002121212100212102121002120
4       1       10      22      1111        223222          111311111311        2232222232322322222322              11131111131311311111311113111113131131111131
5       1       10      32      1413        432431          213441213440        104220331443104220331442            2433241322130211014044424332413221302110140443
6       1       10      33      1514        535535          245550245545        122553122553122553122552            4125434125434125434125441254341254341254341254
7       1       10      43      2221        11111110        40404044040403      2020202202020220202022020201        10101011010101101010110101011010101101010110101011010100
8       1       10      44      2222        11111111        44444454444444      2222222622222222222226222222        11111113111111111111131111111111111311111111111113111111
9       1       10      54      2726        13581357        62851746285173      3142536758708231425367587081        15212633743485606571782880411521263374348560657178288040
10      1       10      55      2827        14141413        70707077070706      3535353853535335353538535353        17676769267676676767692676771767676926767667676769267676

Bảng cho tất cả B với N ngẫu nhiên cho S = 0to 3:

B       S=0     S=1         S=2                 S=3
2       11011   11101101    11101111110110      11101111110111110111111011
3       2210    11021101    20102012010200      1001212100121210012121001211
4       1113    230223      112112112111        2302302302323023023022
5       101     2323        11341134            31430423143042
6       120     4040        20202020            1010101010101010
7       134     5252        24612461            1230456412304564
8       22      1111        445444              222622222622
9       4       22          1111                505505
10      92      4646        23232323            1161616211616161

Chi tiết

  • Lấy đầu vào thông qua stdin hoặc dòng lệnh. Đầu ra cho thiết bị xuất chuẩn.
  • Thay vì một chương trình, bạn có thể viết một hàm lấy B, N và S và in kết quả bình thường hoặc trả về nó (dưới dạng một chuỗi).
  • B, N và S có thể được thực hiện theo thứ tự bất kỳ.
  • Tất cả các đầu vào tạo ra đầu ra có giá trị thập phân dưới 2 32 sẽ hoạt động.
  • N được biểu diễn theo cách thông thường. tức là chữ số có nghĩa đầu tiên và không có số 0 đứng đầu, ngoại trừ số 0 được viết 0. (Xuất ra 00thay vì 0không hợp lệ.)
  • Mã ngắn nhất tính bằng byte thắng.

Nếu bạn thích những thách thức của tôi, hãy xem xét đưa ra Block Bot Bot Flocks! một số tình yêu :)


Tôi không biết nếu bảng xếp hạng cho câu trả lời là thực sự cần thiết.
orlp

5
@orlp Có lẽ là không. Tôi sẽ xóa nó và đặt lại nếu có một loạt các câu trả lời. Tôi chỉ muốn thể hiện các shenanigans Stack và tối ưu hóa Stack của tôi .
Sở thích của Calvin

Câu trả lời:


5

Pyth, 21 19 byte

vujksmjldQc2UiGQvwz

Đưa đầu vào theo định dạng N\nB\nS. Dùng thử trực tuyến: Trình diễn hoặc thử nghiệm khai thác

Giải trình

                      implicit: z = 1st input (N)
                                Q = 2nd input evaluated (B)
 u              vwz   reduce z (evaluated 3rd input) times by:
             iGQ         convert string from base Q to base 10
            U            create a range [0, 1, ..., ^-1]
          c2             split into 2 lists (lengths are N-[N/2] and [N/2])
     m                   map each list d to:
       ld                   their length
      j  Q                  in base Q
    s                    join both lists
  jk                     join the numbers by ""
v                     convert string to int (getting rid of leading zeros)

5

Bình thường 29 21 byte

jku+j-JiGQK/J2QjKQvwz

Thực hiện đơn giản thực hiện.

Đưa đầu vào vào stdin theo định dạng sau:

N
B
S

Điều này cho đầu ra sai 00cho N=0.
Jakube

5

Toán học, 101 byte

Nest[a~Function~(b=FromDigits)[Through@((c=IntegerString)@*Ceiling<>c@*Floor)[a/2],#],#2~b~#,#3]~c~#&

Sử dụng một số Throughmẹo để áp dụng cả chức năng trần và sàn. Chỉ cần bỏ qua các lỗi.


5

CJam, 24 byte

q~:B;{:~Bb_)\]2f/Bfbs}*i

Kiểm tra nó ở đây. Đưa đầu vào là "N" S B.

Giải trình

q~                       e# Read an eval input.
  :B;                    e# Store the base in B and discard it.
     {               }*  e# Repeat S times.
      :~                 e# Turn the string N into an array of digits.
        Bb               e# Interpret as base B.
          _)\            e# Duplicate and increment. Swap order.
             ]2f/        e# Wrap them in an array and (integer-)divide both by 2.
                 Bfb     e# Convert both to base B.
                    s    e# Flatten into a single string.
                       i e# Convert to an integer to fix the N = 0 case.

"0" 1 9xuất ra 00. Tôi đã cố gắng đánh gôn nó : q~:B;{:~Bb,2/z:,Bfbs}*, nhưng cũng không hợp lệ vì nó đã xuất ra chuỗi trống thay thế.
jimmy23013

Một icuối cùng sẽ chăm sóc 00. Bạn có thể lấy lại byte bằng cách thay thế 2/:I-I]bằng )\]2f/.
Dennis

3

JavaScript ( ES6 ) 78 79

Hàm đệ quy. Chạy đoạn trích để kiểm tra (chỉ dành cho Firefox)

Chỉnh sửa 1 byte đã lưu thx @DocMax

F=(b,n,s,S=x=>x.toString(b),m=parseInt(n,b))=>m*s?F(b,S(-~m>>1)+S(m>>1),s-1):n

// Ungolfed

U=(b,n,s)=>
{
  var S=x=>x.toString(b) // function to convert in base b
  var m=parseInt(n,b) // string in base b to integer
  if (m==0 || s==0)
    return n
  else  
    return F(b,S((m+1)>>1) + S( m>>1 ),s-1)
}

// Test
test=[
  {B: 10, N: '0', S:3, K: '0' }, {B: 10, N: '27', S: 1, K: '1413' }, {B: 10, N: '27', S: 2, K: '707706' }, {B: 9, N: '27', S: 1, K: '1413' }, {B: 9, N: '27', S: 2, K: '652651' }
];

test2=[[2, '11011', '11101101', '11101111110110', '11101111110111110111111011'],[3, '2210', '11021101', '20102012010200', '1001212100121210012121001211'],[4, '1113', '230223', '112112112111', '2302302302323023023022'],[5, '101', '2323', '11341134', '31430423143042' ]  ,[6, '120', '4040', '20202020', '1010101010101010'],[7, '134', '5252', '24612461', '1230456412304564'],[8, '22', '1111', '445444', '222622222622'],[9, '4', '22', '1111', '505505'],[10, '92', '4646', '23232323', '1161616211616161' ]
]
test2.forEach(r=>test.push(
  {B:r[0],N:r[1],S:1,K:r[2]}, {B:r[0],N:r[1],S:2,K:r[3]}, {B:r[0],N:r[1],S:3,K:r[4]}
))  

test.forEach(t => (
  r=F(t.B, t.N, t.S), 
  B.innerHTML += '<tr><th>'+(r==t.K?'Ok':'Failed')
      +'</th><td>'+t.B +'</td><td>'+t.N
      +'</td><td>'+t.S +'</td><td>'+r +'</td><td>'+t.K +'</td></tr>'
))
th,td { font-size: 12px; padding: 4px; font-family: helvetica }
<table><thead><tr>
  <th>Test<th>B<th>N<th>S<th>Result<th>Check
  </tr></thead>
  <tbody id=B></tbody>
</table>


Tôi thực sự thích cách chứng minh thành công của bạn. Ngoài ra, bạn có thể lưu 1 bằng cách thay thế m&&sbằng m*s.
DocMax

1
@DocMax đó là một bài kiểm tra đơn vị thực sự và hữu ích. Thật quá dễ dàng để phá vỡ mọi thứ trong khi chơi golf.
edc65

1

ECMAScript 6, 90 byte

var f=(B,N,S)=>((n,s)=>S?f(B,s(n+1>>1)+s(n>>1),S-1):s(n))(parseInt(N,B),x=>x.toString(B))

Xác định hàm đệ quy bằng biến không phải là kiểu thực sự tốt, nhưng đó là mã ngắn nhất tôi có thể đưa ra trong ECMAScript 6.

Bắt trường hợp góc "00" => "0"phải lãng phí ba byte ( s(n)thay vì chỉ đơn giảnN ).

Để dùng thử, bạn có thể sử dụng REPL của Babel : sao chép / dán mã và in kết quả gọi ví dụ như sau : console.log(f(9, "27", 2)).


1

Lisp thông thường - 113 ký tự

(lambda(b n s)(dotimes(i s)(setf n(format ()"~vR~vR"b (- #1=(parse-integer n :radix b)#2=(floor #1# 2))b #2#)))n)

Ung dung

(lambda(b n s)
  (dotimes(i s)
    (setf n (format () "~vR~vR" b (- #1=(parse-integer n :radix b)
                                     #2=(floor #1# 2))
                                b #2#)))
  n)
  • Các ~vRchỉ thị định dạng đầu ra số nguyên trong cơ sở v, nơi vđược cung cấp như một đối số format.
  • parse-integerchấp nhận một :radixđối số để chuyển đổi từ một cơ sở được chỉ định.
  • #1=#1#(tương ứng gán và sử dụng) là các biến đọc cho phép chia sẻ các biểu thức con phổ biến. Khi mở rộng, họ đưa ra mã sau:

    (lambda (b n s)
      (dotimes (i s)
        (setf n
                (format nil "~vr~vr" b
                        (- (parse-integer n :radix b)
                           (floor (parse-integer n :radix b) 2))
                        b (floor (parse-integer n :radix b) 2))))
      n)

0

Pip , 27 byte

Lcb:+J[(bFB:a)%2i]+b//2TBab

Lấy cơ sở, số nguyên và số lần lặp lại làm đối số dòng lệnh. Thuật toán rất đơn giản, nhưng sử dụng một vài tính năng ngôn ngữ thú vị:

                             a, b, c initialized from cmdline args, and i = 0 (implicit)
Lc                           Do c times:
        bFB:a                Convert b from base a to decimal and assign back to b
      [(     )%2i]           Construct a list containing b%2 and 0 (using i to avoid
                               scanning difficulties)
                  +b//2      Add floor(b/2) to both elements of list; the list now contains
                               b-b//2 and b//2
                       TBa   Convert elements of list back to base a
     J                       Join list
    +                        Coerce to number (necessary to turn 00 into plain 0)
  b:                         Assign back to b
                          b  Print b at the end

Kiểu vô hướng của Pip, đại diện cho cả số và chuỗi, rất tiện ở đây, cũng như các thao tác theo mục trong danh sách; Thật không may, dấu ngoặc đơn và toán tử hai ký tựFB , TB//phủ nhận bất kỳ lợi thế.

Giải pháp thay thế, không có sự phân công trung gian nhưng vẫn có 27 byte:

Lcb:+J[bFBa%2i]+bFBa//2TBab

0

C, 245 byte

int b,z,n,f,r;c(char*t,n){return n?((z=c(t,n/b)),z+sprintf(t+z,"%d",n%b)):0;}main(){char t[99],*p;gets(t);b=atoi(t);f=n=strtol(p=strchr(t,32)+1,0,b);if(!(r=atoi(strchr(p,32)+1)))f=0;while(r--)n=strtol(t+c(t+c(t,n-n/2),n/2)*0,0,b);puts(f?t:"0");}

Điều này sẽ không giành được bất cứ điều gì , nhưng nó rất vui để thực hiện!


0

PHP ,115 112 byte

function($b,$n,$s){while($s--)$n=($c=base_convert)(ceil($n=$c($n,$b,10)/2),10,$b).$c(floor($n),10,$b);return$n;}

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

Ung dung:

function split_join_repeat( $b, $n, $s ) {
    // repeat S times
    for( $x=0; $x < $s; $x++ ) {
        // convert N from base B to base 10 for arithmetic
        $n = base_convert( $n, $b, 10 );
        // divide and split in base 10, convert back to base B and join
        $n = base_convert( ceil( $n / 2 ), 10, $b ) .
            base_convert( floor( $n / 2 ), 10, $b );
    }
    return $n;
}

Đầu ra

B = 10, N = 27, S = 1   1413
B = 10, N = 27, S = 2   707706
B = 9, N = 27, S = 1    1413
B = 9, N = 27, S = 2    652651

2   1   10  11  101 1110    111111  10000011111 10000100001000001111    
3   1   10  21  1110    202201  101101101100    1201201201212012012011  212100212102121002121212100212102121002120  
4   1   10  22  1111    223222  111311111311    2232222232322322222322  11131111131311311111311113111113131131111131    
5   1   10  32  1413    432431  213441213440    104220331443104220331442    12141204110401030043301214120411040103004330    
6   1   10  33  1514    535535  245550245545    122553122553122553122552    131022143412311313533131022143412311313533  
7   1   10  43  2221    11111110    40404044040403  2020202202020220202022020201    40556522600645213204055652260064521320  
8   1   10  44  2222    11111111    44444454444444  2222222622222222222226222222    76650460747555347665046074755534    
9   1   10  54  2726    13581357    62851746285173  3142536758708231425367587081    4861155667688600048611556676886000  
10  1   10  55  2827    14141413    70707077070706  3535353853535335353538535353    17676769267677271767676926767727

0

Japt , 17 byte

_nW o ó ®ÊsWÃq}gV

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

Đưa đầu vào theo thứ tự S, N, B với N là danh sách đơn . Chấp nhận N mà không có danh sách singleton tốn 2 byte .

Giải trình:

_             }g     #Get the Sth item generated by this function...
                V    #...Starting with N as the 0th item:
 nW                  # Evaluate the previous item as a base B number
    o                # Create a list with that length
      ó              # Divide it into two lists as evenly as possible
        ®   Ã        # For each of those lists:
         Ê           #  Get the length
          sW         #  Convert it to base B
             q       # Join the two strings together

0

Forth (gforth) , 105 byte

: f base ! 0 ?do 0. 2swap >number nip 2drop 2 /mod >r i + r> 0 tuck <# #s 2drop #s #> loop type decimal ;

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

Giải trình

Thay đổi cơ sở thành B, sau đó trong một vòng lặp chạy S lần:

  • Chuyển đổi chuỗi thành một số
  • Chia số thành 2 nửa (một số lớn hơn số còn lại nếu lẻ)
  • Kết hợp hai số lại thành một chuỗi

In chuỗi khi hoàn tất và đặt cơ sở trở lại 10 (để chúng tôi có thể chạy nhiều lần liên tiếp)

Giải thích mã

:f                    \ start a new word definition
  base !              \ set the base to B
  0 ?do               \ loop from 0 to S-1 (runs S times)
    0. 2swap          \ places a double-length 0 on the stack behind the string
    >number           \ converts the string to a number in the current base
    nip 2drop         \ get rid of string remainder and second part of double
    2 /mod            \ get the quotient and remainder of dividing by 2
    >r                \ throw the quotient on the return stack
    i                 \ get a copy of the quotient from the return stack
    +                 \ add quotient and remainder
    r>                \ move quotient from return stack to stack
    0 tuck            \ convert both to double-length numbers
    <#                \ start a pictured numeric output
      #s              \ add entire number to output
      2drop           \ drop empty number
      #s              \ add second number to output
    #>                \ convert output to a string and drop number from stack
  loop                \ end loop
  type                \ print output string
  decimal             \ set base back to 10
;                     \ end word definition
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.