แยกเป็นตัวเลขเข้าร่วมเป็นสตริงทำซ้ำ


14

พิจารณากระบวนการ:

  1. การที่ไม่ใช่เชิงลบจำนวนเต็ม N. เช่น
    27

  2. แยกมันออกเป็นจำนวนเต็มN - floor(N/2)และfloor(N/2)(ครึ่ง 'ใหญ่กว่า' และ 'เล็กกว่า') แล้วเขียนตามลำดับนั้น
    เช่นจะกลายเป็น2714 13

  3. การลบพื้นที่เพื่อเข้าร่วมจำนวนเต็มเป็นจำนวนเต็มใหม่ที่มีขนาดใหญ่กว่ามาก
    เช่นจะกลายเป็น14 131413

  4. ทำซ้ำขั้นตอนที่ 2 และ 3 ตามจำนวนครั้งที่ต้องการ
    เช่น1413→การ707 706→การ707706→การ353853 353853→การ353853353853→การ ...

ความท้าทายนี้เกี่ยวกับการทำสิ่งนี้ แต่ไม่เสมอไปในฐาน 10

ท้าทาย

เขียนโปรแกรมที่ใช้ตัวเลขสามตัวคือ B, N และ S:

  • B เป็นจำนวนเต็มตั้งแต่ 2 ถึง 10 ซึ่งเป็นฐานของ N (ไบนารีถึงทศนิยม)

  • N เป็นจำนวนเต็มแบบไม่ลบเพื่อใช้กระบวนการแยกเข้าร่วม เพื่อให้การป้อนข้อมูลของผู้ใช้ง่ายขึ้นจะได้รับเป็นสตริงในฐาน B ไม่ใช่จำนวนเต็ม

  • S เป็นจำนวนเต็มที่ไม่เป็นลบที่เป็นจำนวนครั้งที่จะทำซ้ำกระบวนการแยกเชื่อมต่อ

เอาต์พุตของโปรแกรมคือการแทนค่าสตริงของ N ในฐาน B หลังโพรซีเดอร์การแยกการรวม S

เมื่อ S คือ 0ไม่ทำการแยกดังนั้นเอาต์พุตจะเป็น N เสมอ

เมื่อ N คือ0แยกทั้งหมดมีรูปแบบ0 0และลดไป0อีกครั้งดังนั้นการส่งออกเป็นเสมอ0อีกครั้งเพื่อการส่งออกอยู่เสมอ

ตัวอย่าง

  • 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 ทั้งหมดที่มี N = 1สำหรับ S = 0ถึง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 ทั้งหมดด้วยการสุ่ม N สำหรับ S = 0ถึง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

รายละเอียด

  • รับอินพุตผ่าน stdin หรือบรรทัดรับคำสั่ง ส่งออกไปยัง stdout
  • แทนที่จะเป็นโปรแกรมคุณสามารถเขียนฟังก์ชั่นที่รับ B, N และ S และพิมพ์ผลลัพธ์ได้ตามปกติหรือคืนค่ามัน (เป็นสตริง)
  • B, N และ S อาจถูกดำเนินการในลำดับใดก็ได้
  • อินพุตทั้งหมดที่สร้างเอาต์พุตที่มีค่าทศนิยมต่ำกว่า 2 32ควรทำงาน
  • N แสดงตามปกติ 0คือหลักที่สำคัญที่สุดครั้งแรกและไม่มีศูนย์นำยกเว้นในศูนย์เองซึ่งเขียน (การส่งออก00แทนที่จะ0ไม่ถูกต้อง)
  • รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

ฉันขอให้คุณเพลิดเพลินไปกับความท้าทายของฉันลองพิจารณามอบBlock Building Bot Flocks! บางความรัก :)


ฉันไม่ทราบว่ากระดานแต้มนำสำหรับคำตอบจำเป็นหรือไม่
orlp

5
@ orlp อาจจะไม่ ฉันจะลบมันและนำกลับมาถ้ามีคำตอบมากมาย ฉันแค่อยากจะอวดและเพิ่มประสิทธิภาพกอง Snippet ฉันแง่
งานอดิเรกของ Calvin

คำตอบ:


5

Pyth, 21 19 ไบต์

vujksmjldQc2UiGQvwz

N\nB\nSจะเข้าในรูปแบบ ลองใช้ออนไลน์: การสาธิตหรือชุดควบคุมการทดสอบ

คำอธิบาย

                      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

Pyth, 29 21 ไบต์

jku+j-JiGQK/J2QjKQvwz

การใช้งานที่ตรงไปตรงมาจริงๆ

รับอินพุตบน stdin ในรูปแบบต่อไปนี้:

N
B
S

นี้จะช่วยให้การส่งออกที่ไม่ถูกต้องสำหรับ00 N=0
Jakube

5

Mathematica, 101 ไบต์

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

ใช้Throughกลอุบายบางอย่างเพื่อใช้ทั้งฟังก์ชั่นเพดานและพื้น เพียงแค่ละเว้นข้อผิดพลาด


5

CJam, 24 ไบต์

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

ทดสอบที่นี่ ใช้อินพุตเป็น"N" S Bจะเข้าเป็น

คำอธิบาย

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 9เอาท์พุ00ท ฉันพยายามเล่นกอล์ฟ: q~:B;{:~Bb,2/z:,Bfbs}*แต่ก็ไม่ถูกต้องเพราะมันแสดงผลสตริงที่ว่างเปล่าแทน
jimmy23013

ในตอนท้ายจะดูแลi 00คุณจะได้รับกลับไบต์โดยการแทนที่ด้วย2/:I-I] )\]2f/
เดนนิส

3

JavaScript ( ES6 ) 78 79

ฟังก์ชั่นวนซ้ำ เรียกใช้ตัวอย่างเพื่อทดสอบ (Firefox เท่านั้น)

แก้ไข 1 ไบต์ที่บันทึกแล้วขอบคุณ @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>


ฉันรักที่จะพิสูจน์ความสำเร็จของคุณอย่างละเอียด นอกจากนี้คุณยังสามารถบันทึก 1 โดยการแทนที่ด้วยm&&s m*s
DocMax

1
@DocMax เป็นการทดสอบหน่วยที่เป็นประโยชน์และแท้จริง มันง่ายเกินไปที่จะทำลายทุกสิ่งขณะเล่นกอล์ฟ
edc65

1

ECMAScript 6, 90 ไบต์

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))

การกำหนดฟังก์ชันแบบเรียกซ้ำโดยใช้ตัวแปรนั้นไม่ใช่สไตล์ที่ดี แต่เป็นรหัสที่สั้นที่สุดที่ฉันสามารถใช้ใน ECMAScript 6

การเรียกใช้ตัวพิมพ์เล็กอย่าง"00" => "0"ถูกต้องจะสูญเปล่าสามไบต์ ( s(n)แทนที่จะเป็นแบบง่ายๆN )

จะลองมันออกคุณสามารถใช้REPL Babel ของ : คัดลอก / console.log(f(9, "27", 2))วางรหัสและตัวอย่างการพิมพ์ผลการภาวนาเช่นดังนั้น:


1

Common Lisp - 113 ตัวอักษร

(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)

Ungolfed

(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)
  • ~vRรูปแบบคำสั่งผลจำนวนเต็มในฐานvที่ให้ไว้เป็นข้อโต้แย้งที่จะvformat
  • parse-integerยอมรับ:radixอาร์กิวเมนต์สำหรับการแปลงจากฐานที่ระบุ
  • #1=และ#1#(ตามลำดับกำหนดและใช้) เป็นตัวแปรผู้อ่านที่อนุญาตให้แชร์นิพจน์ย่อยทั่วไป เมื่อขยายพวกเขาจะให้รหัสต่อไปนี้:

    (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 ไบต์

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

รับค่าฐานจำนวนเต็มและจำนวนการทำซ้ำเป็นอาร์กิวเมนต์บรรทัดคำสั่ง อัลกอริทึมนั้นตรงไปตรงมา แต่ใช้คุณสมบัติภาษาที่น่าสนใจสองอย่าง:

                             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

ประเภทสเกลาร์ของ Pip ซึ่งแสดงทั้งตัวเลขและสตริงมีประโยชน์ที่นี่เช่นเดียวกับการดำเนินการรายการที่ชาญฉลาดในรายการ; โชคไม่ดีที่วงเล็บและผู้ประกอบการทั้งสองตัวละครFB,TBและ//ลบล้างประโยชน์ใด ๆ

โซลูชันสำรองโดยไม่มีการมอบหมายระดับกลาง แต่ยังคงมี 27 ไบต์:

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

0

C, 245 ไบต์

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");}

นี่จะไม่ชนะอะไรเลยแต่มันสนุกที่จะทำ!


0

PHP ,115 112 ไบต์

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;}

ลองออนไลน์!

Ungolfed:

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;
}

เอาท์พุต

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 ไบต์

_nW o ó ®ÊsWÃq}gV

ลองออนไลน์!

จะเข้าในลำดับที่ S, N, B กับ N เป็นรายการเดี่ยว ยอมรับ N โดยไม่ต้องรายการเดี่ยวค่าใช้จ่าย2 ไบต์

คำอธิบาย:

_             }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 ไบต์

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

ลองออนไลน์!

คำอธิบาย

เปลี่ยนฐานเป็น B จากนั้นในลูปที่รัน S คูณ:

  • แปลงสตริงเป็นตัวเลข
  • แบ่งจำนวนเป็น 2 ส่วน (หนึ่งใหญ่กว่าอีกถ้าแปลก)
  • รวมตัวเลขสองตัวกลับเข้าไปในสตริง

พิมพ์สตริงเมื่อเสร็จแล้วตั้งค่าฐานกลับเป็น 10 (เพื่อให้เราสามารถเรียกใช้หลายครั้งในแถว)

รหัสคำอธิบาย

: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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.