จำนวนเต็มเจือจาง


26

จำนวนเต็มบวกสามารถเจือจางโดยการแทรก0ระหว่างสองบิตในการขยายฐานสอง ซึ่งหมายความว่าnหมายเลข -bit มีการn-1เจือจางซึ่งไม่จำเป็นต้องแตกต่างกันทั้งหมด

ตัวอย่างเช่นสำหรับ12(หรือ1100ในไบนารี) การเจือจางคือ

11000 = 24
   ^

11000 = 24
  ^

10100 = 20
 ^

ในการท้าทายนี้เราจะทำการหาผลรวมของการลดทอนทั้งหมดโดยไม่รวมจำนวนเดิม สำหรับ12การผลรวมของ24, 24, 20ผลในการ68ดังนั้นควรจะมีการส่งออกสำหรับ6812

ท้าทาย

รับจำนวนเต็มบวกn > 1เป็นอินพุตเอาต์พุต / ส่งคืนผลรวมเจือจางตามที่อธิบายไว้ข้างต้น

ตัวอย่าง

in    out
---   ---
2       4
3       5
7      24
12     68
333  5128
512  9216

กฎระเบียบ

  • อินพุตและเอาต์พุตสามารถสันนิษฐานว่าเหมาะสมกับชนิดจำนวนเต็มดั้งเดิมของภาษาของคุณ
  • อินพุตและเอาต์พุตจะได้รับในรูปแบบที่สะดวกใด
  • ยอมรับได้ทั้งโปรแกรมหรือฟังก์ชั่น หากฟังก์ชั่นคุณสามารถส่งคืนผลลัพธ์มากกว่าการพิมพ์
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือเพื่อให้ใช้กฎการเล่นกอล์ฟตามปกติทั้งหมดและรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ

"รูปแบบที่สะดวกใด ๆ " รวมสตริงไบนารีหรือไม่
Shaggy

1
@Shaggy "ใด ๆ รูปแบบที่สะดวก" มีวัตถุประสงค์เพื่อเป็นรวมวิธีการของอินพุต / เอาต์พุตไม่รูปแบบ เช่นนี้ฉันจะบอกว่าไม่คุณจะต้องใส่เป็นจำนวนเต็มหรือสตริงที่เป็นจำนวนเต็มนั้น
AdmBorkBork

ท้าทายมาก!
Manish Kundu

1
ลำดับนี้ปัจจุบัน (30 ม.ค. 2018) ไม่ได้อยู่ใน OEIS
จูเซปเป้

คำตอบ:


12

Python 2 , 43 39 ไบต์

f=lambda n,i=2:n/i and n*2-n%i+f(n,i*2)

ลองออนไลน์!


อย่างไร?

ฟังก์ชันการเรียกซ้ำแต่ละครั้งจะคำนวณการเจือจางเดียว ตำแหน่งของแทรกมี0 log2(i)ฟังก์ชั่นจะเกิดขึ้นอีกจนกว่าiจะมีขนาดใหญ่กว่าnและการแทรกจะอยู่ทางด้านซ้ายของตัวเลข ถ้าi>n, n/iประเมิน0ซึ่งเป็นค่า falsy ในหลาม

n*2เลื่อนตัวเลขไบนารีไปทางซ้ายจำนวนหนึ่งทั้งหมดn%iหรือn % 2**(position of insertion)คำนวณค่าของส่วนที่ไม่ควรเลื่อนไปทางซ้าย ค่านี้จะถูกลบออกจากตัวเลขที่เลื่อน

ตัวอย่าง (n = 7)

call       n/i          bin(n)  n*2     n%i   dilution       return value

f(7, i=2)  3 => truthy  0b111   0b1110  0b1   0b1101 = 13    13 + f(7, 2*2) = 13 + 11 = 24
f(7, i=4)  1 => truthy  0b111   0b1110  0b11  0b1011 = 11    11 + f(7, 4*2) = 11 + 0 = 11
f(7, i=8)  0 => falsy                                        0

7

เยลลี่ 11 ไบต์

BJṖ2*ɓdḅḤ}S

ลองออนไลน์!

มันทำงานอย่างไร

BJṖ2*ɓdḅḤ}S  Main link. Argument: n (integer)

B            Binary; convert n to base 2. This yields a digit array A.
 J           Indices; yield [1, ..., len(A)].
  Ṗ          Pop; remove the last element, yielding [1, 2, ..., len(A)-1].
   2*        Elevate 2 to these powers, yielding [2, 4, ..., 2**(len(A)-1)].
             Let's call the result B.
     ɓ       Begin a new, dyadic chain, with left argument n and right argument B.
      d      Divmod; yield [n/b, n%b], for each b in B.
        Ḥ}   Unhalve right; yield 2b for each b in B, i.e., [4, 8, ..., 2**len(A)].
       ḅ     Unbase; convert each [n/b, n%b] from base 2b to integer, yielding
             (2b)(n/b) + (n%b).
          S  Take the sum.

5

MATL , 13 ไบต์

tZl:W&\5ME*+s

ลองที่MATL Online! หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย

พิจารณาการป้อนข้อมูล12เป็นตัวอย่าง

t     % Implicit input. Duplicate
      % STACK: 12, 12
Zl    % Binary logarithm
      % STACK: 12, 3.584962500721156
:     % Range (rounds down)
      % STACK: 12, [1 2 3]
W     % Power with base 2, element-wise
      % STACK: 12, [2 4 8]
&\    % 2-output modulus, element-wise: pushes remainders and quotients
      % STACK: [0 0 4], [6 3 1]
5M    % Push array of powers of 2, again
      % STACK: [0 0 4], [6 3 1], [2 4 8]
E     % Multiply by 2
      % STACK: [0 0 4], [6 3 1], [4 8 16]
*     % Multiply, element-wise
      % STACK: [0 0 4], [24 24 16]
+     % Add, element-wise
      % STACK: [24 24 20]
s     % Sum of array. Implicit display
      % STACK: 68

4

C,  58  56 ไบต์

ขอบคุณ @Dennis สำหรับการบันทึกสองไบต์!

s,k;f(n){for(s=0,k=2;k<=n;k*=2)s+=n/k*k*2+n%k;return s;}

ลองออนไลน์!

C (gcc) , 50 ไบต์

s,k;f(n){for(s=0,k=2;k<=n;)s+=n%k+n/k*(k+=k);k=s;}

การย้อนกลับโดยk=s;เป็นพฤติกรรมที่ไม่ได้กำหนด แต่ทำงานกับ gcc เมื่อปิดใช้งานการปรับให้เหมาะสม นอกจากนี้ยังn%k+n/k*(k+=k)มีพฤติกรรมที่ไม่ระบุแต่ดูเหมือนว่าจะทำงานได้ดีกับ gcc

ลองออนไลน์!


s,k;f(n){for(s=0,k=2;k<=n;)s+=n%k+n/k*(k*=2);return s;}(55 bytes)
Kevin Cruijssen

1
มีบอกที่หนึ่งที่ได้รับการประเมินไม่ได้เป็นครั้งแรกหรือn%k n/k*(k*=2)
Steadybox

1
@KevinCruijssen จะทำการประเมินด้านไหนก่อนโดยไม่ระบุ C เป็นเช่นนั้น ...
Steadybox

2
อ่าฉันเห็นว่าคุณได้เพิ่มคำตอบของคุณลงไปอย่างแน่นอน ไม่ทราบว่ามีพฤติกรรมที่ไม่ได้กำหนดชนิดนี้เกิดขึ้นใน C. ฉันมีประสบการณ์สามชั่วโมงใน C ดังนั้นฉันแทบไม่รู้อะไรเลยเกี่ยวกับมัน TIL :) ใน Java for(s=0,k=2;k<=n;)s+=n%k+n/k*(k*=2);return s;นั้นสมบูรณ์ดีและn%kจะถูกประเมินมาก่อนn/k*(k*=2)และn/kจะประเมินก่อนk*=2เสมอ ขอบคุณสำหรับคำอธิบาย (ฉันจะลบความคิดเห็นบางส่วนของฉันตอนนี้เพื่อลดความยุ่งเหยิง)
Kevin Cruijssen

ฉันชอบใช้ UB เป็นคุณสมบัติ และการตีกอล์ฟด้วยภาษาในชีวิตจริงควรอยู่ในหมวดหมู่ต่อไป :) :)
Regis Portalez

4

เยลลี่ , 9 8 ไบต์

BḊḄÐƤạḤS

ลองออนไลน์!

B                        to binary          42 -> 1 0 1 0 1 0
 Ḋ                       drop first                 0 1 0 1 0
  ḄÐƤ                    each suffix to decimal   10 10 2 2 0
      Ḥ                  double the input                  84
     ạ                   absolute difference   74 74 82 82 84
       S                 add them up                      396

ในทางกลับกันB¹ƤṖ+BḄS: รับส่วนนำหน้าวางล่าสุดเพิ่มไปยังอินพุตและผลรวม


4

J , 20 15 14 ไบต์

+/@}:@:+[\&.#:

ลองออนไลน์

15 ไบต์

1#.-,+:-#.\.@#:

ลองออนไลน์!

     +:             Input×2
       -            Subtract
        #.\.@#:     The list of binary suffixes of input (in decimal)
   -,               Append negative input
1#.                 Add them up

ทำไมสูตรลบสองครั้งจึงใช้งานได้ ทำไมมันจึงเท่ากับการเจือจาง
Jonah

1
@Jonah เจือจางกำลังเพิ่มคำนำหน้าไบนารีบางอย่าง (หมายเลข "ปัดเศษลง") ไปยังหมายเลขซึ่งเทียบเท่ากับการเพิ่มจำนวนทั้งหมดให้กับตัวเอง (ทั้งคำนำหน้าและส่วนที่เหลือ) จากนั้นจึงลบส่วนที่เหลือ
FrownyFrog

4

Japt , 12 11 ไบต์

¢¬£¢iYTÃÅxÍ

ลองมัน


คำอธิบาย

                 :Implicit input of integer U
¢                :Convert to base-2 string
 ¬               :Split to an array of individual characters/digits
  £    Ã         :Map over the elements, with Y being the current 0-based index
   ¢             :  Convert U to a base-2 string
    iYT          :  Insert a 0 in that string at index Y
        Å        :Slice off the first element of the array
          Í      :Convert each element to a base-10 integer
         x       :Reduce by addition

3

JavaScript (ES6), 41 40 ไบต์

บันทึก 1 ไบต์ต้องขอบคุณ Mr.Xcoder

f=(n,k=1)=>k<n&&(n&k)+2*(n&~k)+f(n,k-~k)

กรณีทดสอบ


3

Retina , 53 50 47 ไบต์

.+
*
+`(_+)\1
$1O
O_
_
L$`\B
$`O$'
+%`\B
¶$`¶
_

ลองออนไลน์! ลิงค์มีกรณีทดสอบ แก้ไข: บันทึกแล้ว 3 ไบต์ด้วย @MartinEnder คำอธิบาย:

.+
*
+`(_+)\1
$1O
O_
_

แปลงจากทศนิยมเป็นไบนารี แต่ใช้ O เพื่อแทน 0 เนื่องจากไม่ใช่ตัวเลขและ _ เพื่อแทน 1 เนื่องจากเป็นอักขระการซ้ำซ้อนเริ่มต้นใน Retina 1

L$`\B
$`O$'

แทรก O ระหว่างตัวเลขแต่ละคู่และรวบรวมผลลัพธ์เป็นรายการ

+%`\B
¶$`¶

แปลงจากไบนารี่เป็นเอก (การแปลงนี้ให้ผลพิเศษOแต่เราไม่สนใจ)

_

ผลรวมและแปลงเป็นทศนิยม


การแปลงแบบไบนารีเป็นทศนิยมสามารถทำได้ใน 12 ไบต์ (ประหยัด 3): tio.run/##K0otycxLNPz/…ดูคำตอบนี้สำหรับวิธีการใช้งาน
Martin Ender

@ มาร์ตินเดอร์ขอบคุณมากฉันลืมไปตลอดเลย (ฉันก็ผิดหวังเล็กน้อยเช่นกันว่ารุ่นทางเลือกใช้งานได้กับหมายเลขเดียวเท่านั้น)
Neil

%ทั้งในกรณีที่คุณได้มีตัวเลขแต่ละตัวในสายของตัวเองคุณสามารถทำให้การทำงานที่มีการเพิ่มเติม /[O_]+/_ถ้ามันมีความซับซ้อนมากขึ้นคุณจะต้องสิ่งที่ต้องการ
Martin Ender

2

Pyth , 13 ไบต์

smiXd.BQZ2Ssl

ลองที่นี่!

คำอธิบาย

smiXd.BQZ2Ssl | โปรแกรมเต็มรูปแบบ

           sl | ลอการิทึมฐาน 2 ของอินพุตปูพื้นเป็นจำนวนเต็ม
          S | สร้างช่วงจำนวนเต็ม [1 ... ลอการิทึมที่ปูพื้น]
 m | และแผนที่ฟังก์ชั่นมากกว่านั้น
------------ + - + ----------------------------------- ------------------
  iXd.BQZ2 | ฟังก์ชั่นที่จะแมป (ใช้ตัวแปร d)
     .BQ | ในการเป็นตัวแทนไบนารีของอินพุต ...
   XZ | ... ใส่ศูนย์ ...
    d | ... ที่ดัชนี d
  ฉัน 2 | และแปลงผลลัพธ์จากฐาน 2 เป็นจำนวนเต็ม
------------ + - + ----------------------------------- ------------------
s | รวมรายการผลลัพธ์

2

เยลลี่ 10 ไบต์

BµLḤ_J’×µḄ

ลองออนไลน์!

ไม่สั้นที่สุดในขณะนี้ แต่อาจเป็นไปได้ว่ามีวิธีแก้ไขBµ µḄ...

คำอธิบาย

BµLḤ_J’×µḄ    Main link. Argument: n (integer)
B             Binary; convert n to an binary of binary digits. Call this A.
 µ            Start a new monadic link with argument A.
  L           Length; yield len(A). We'll call this l.
   Ḥ          Unhalve; yield l * 2.
     J        Length range; yield [1, 2, ..., l].
    _         Subtract; yield [l*2 - 1, l*2 - 2, ..., l].
      ’       Decrement; subtract one from each item.
       ×      Multiply each item by the corresponding item in A. Call this B.
        µ     Start a new monadic link with argument B.
         Ḅ    Unbinary; convert from a binary array to a decimal.

โดยพื้นฐานแล้วมันใช้งานได้โดยการคูณเลขฐานสองแต่ละหลักด้วยหมายเลขเวทย์มนตร์ ฉันไม่สามารถอธิบายได้หากไม่เห็นภาพดังนั้นนี่คือเลขฐานสองที่เราจะทำงานด้วย:

1111

ตามที่อธิบายโดยการท้าทายเขาเอาท์พุทที่เราต้องการคือผลรวมของเลขฐานสอง:

10111  = 2^4 + 2^2 + 2^1 + 2^0
11011  = 2^4 + 2^3 + 2^1 + 2^0
11101  = 2^4 + 2^3 + 2^2 + 2^0

อย่างไรก็ตามเราไม่จริงต้องใส่เลขศูนย์: เยลลี่ของ "unbinary" อะตอมจะยอมรับตัวเลขอื่น ๆ มากกว่าเพียงแค่การและ0 1เมื่อเราอนุญาตให้เราใช้2รูปแบบนี้จะง่ายขึ้น:

2111   = 2*2^3 + 1*2^2 + 1*2^1 + 1*2^0
2211   = 2*2^3 + 2*2^2 + 1*2^1 + 1*2^0
2221   = 2*2^3 + 2*2^2 + 2*2^1 + 1*2^0

เมื่อเราสรุปตัวเลขในแต่ละคอลัมน์เราจะได้รับ

6543   = 6*2^3 + 5*2^2 + 4*2^1 + 3*2^0 = 48 + 20 + 8 + 3 = 79.

เคล็ดลับที่คำตอบนี้ใช้คือการสร้างรูปแบบนี้และคูณแต่ละหลักด้วยตัวเลขที่สอดคล้องกันในต้นฉบับเพื่อยกเลิกคอลัมน์ที่จำเป็น ตัวอย่างเช่น 12 จะแสดงเป็น

 1100
×6543
=6500  = 6*2^3 + 5*2^2 + 0*2^1 + 0*2^0 = 48 + 20 + 0 + 0 = 68.


1

Husk , 13 12 ไบต์

-1 ไบต์ขอบคุณ @Mr Xcoder!

ṁḋ§z·+Θḣotṫḋ

ลองออนไลน์!

คำอธิบาย

ṁḋ§z·+Θḣ(tṫ)ḋ  -- example input: 6
            ḋ  -- convert to binary: [1,1,0]
  §            -- fork argument
        (tṫ)   -- | tail of tails: [[1,0],[0]]
       ḣ       -- | heads: [[1],[1,1],[1,1,0]]
   z           -- and zipWith the following (example with [1,0] [1])
    · Θ        -- | prepend 0 to second argument: [0,1]
     +         -- | concatenate: [1,0,0,1]
               -- : [[1,0,1,0],[1,1,0,0]]
ṁ              -- map the following (example with [1,0,1,0]) and sum
 ḋ             -- | convert from binary: 10
               -- : 22


1

Pip , 21 18 ไบต์

2*a-a%2**_MS1,#TBa

ลองออนไลน์!

คำอธิบาย

aโทรไปยังหมายเลขป้อนข้อมูลของเรา สำหรับแต่ละดัชนีไบนารีiที่เราต้องการแทรกศูนย์เราสามารถคำนวณบิตซ้ายของจุดแทรกเป็นa // 2**i(ซึ่ง//เป็นส่วนจำนวนเต็มและ**เป็นยกกำลัง), บิตขวาของจุดแทรกเป็นและดังนั้นจึงเป็นจำนวนเต็มเจือจางa % 2**i 2 * (a // 2**i) * 2**i + (a % 2**i)แต่(a // 2**i) * 2**iจะมีค่าเท่ากับและเพื่อให้เราสามารถจัดเรียงให้เป็นสูตรสั้น:a - (a % 2**i) =2 * (a - a % 2**i) + a % 2**i2 * a - a % 2**i

2*a-a%2**_MS1,#TBa
                       a is 1st command-line argument (implicit)
               TBa     Convert a to binary
              #        Length of the binary expansion
            1,         Range from 1 up to (but not including) that number
          MS           Map this function to the range and sum the results:
2*a-a%2**_              The above formula, where _ is the argument of the function
                       The final result is autoprinted

1

R , 141 48 ไบต์

function(n,l=2^(1:log2(n)))sum(n%%l+(n%/%l*2*l))

ลองออนไลน์!

ไม่ว่าฉันจะทำอะไรผิดพลาดจริง ๆ หรือ R ก็แย่มาก ๆ Porting วิธีหลุยส์ Mendo ของเป็นเรื่องง่ายที่ถูกต้องและ golfy

แต่ถ้าคุณต้องการโคลนด้วยการทำงานของบิตจริง ๆMickyTแนะนำ 105 byter ต่อไปนี้:

function(i)sum(sapply(1:max(which(b<-intToBits(i)>0)),function(x)packBits(head(append(b,F,x),-1),"i")))-i

ลองออนไลน์!


นี่คือ111 byteที่ฉันแน่ใจว่าคุณสามารถใช้อีกไม่กี่
MickyT

@MickyT ไชโย! ดีมากถึงแม้ว่าการพอร์ตด้วยวิธีที่แตกต่างอย่างสิ้นเชิงนั้นดีกว่า
Giuseppe


1

แบตช์, 92 77 ไบต์

@set/an=2,t=0
:l
@if %1 geq %n% set/at+=%1*2-(%1%%n),n*=2&goto l
@echo %t%

แก้ไข: เปลี่ยนเป็นสูตรเดียวกันกับที่ทุกคนใช้อยู่




0

ทูต , 57 ไบต์

Sum##UnBin=>{Join[Join=>_,"0"]}=>SplitAt#1&`:@{#_-1}##Bin

ลองออนไลน์!

ฉันคิดว่าฉันจะเข้าถึงปัญหาจากวิธีการจัดการที่ไม่ใช่บิตเนื่องจากวิธีการดังกล่าวใช้ไม่ได้กับ Attache ฉันต้องตรวจสอบบางส่วนของวิธีการนี้เพื่อหาทางเลือกอื่น

คำอธิบาย

นี่คือรุ่นที่ขยาย:

Define[$joinByZero, {Join[Join=>_,"0"]}]

Define[$insertionPoints,
    SplitAt#1&`:@{#_-1}
]

Define[$f,
Sum##UnBin=>joinByZero=>insertionPoints##Bin
]

นี่ใช้การแทนเลขฐานสองของตัวเลขโดยแยกเป็นจุดที่แน่นอนใส่เลขศูนย์ตรงนั้นแปลงกลับเป็นทศนิยมและนำผลรวมมารวมกัน


0

J , 33 ไบต์

1#.[:}:#.@(<\;@(,0;])"0<@}.\.)@#:

ส่วนใหญ่อาจมีห้องพักมากสำหรับการเล่นกอล์ฟต่อไป

อย่างไร?

@#: แปลงเป็นไบนารี่และ

<@}.\. - ค้นหาความพอเพียงทั้งหมดวางตัวเลขตัวแรกจากแต่ละช่อง

<\ - ค้นหาคำนำหน้าทั้งหมดและใส่ในกล่อง

(,0;])"0 - ในแต่ละคำนำหน้าต่อท้าย 0 จากนั้นผนวกส่วนต่อท้ายของหัวที่เกี่ยวข้อง

;@ ทำลาย (unbox)

1#.[:}:#.@ - แปลงเป็นทศนิยม, ลดลงและผลรวม

ลองออนไลน์!

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