ใช้ตัวดำเนินการไบนารีของ INTERCAL


29

ภาษาคอมไพเลอร์ที่ไม่มีตัวย่อที่ออกเสียงได้อย่างย่อINTERCALเป็นภาษาการเขียนโปรแกรมที่ไม่เหมือนใคร ท่ามกลางคุณสมบัติที่ไม่สามารถพิสูจน์ได้ของมันคือตัวดำเนินการไบนารี

INTERCAL ของสองผู้ประกอบการไบนารีแทรก (ยังเป็นที่รู้จักกันในชื่อMingle ) และเลือก Interleave แสดงด้วยการเปลี่ยนแปลง (¢) และ select ถูกแสดงด้วย sqiggle (~)

Interleave ทำงานโดยรับตัวเลขสองตัวในช่วง 0-65535 และสลับบิตของพวกเขา ตัวอย่างเช่น

234 ¢ 4321
234   = 0000011101010
4321  = 1000011100001
Result: 01000000001111110010001001
Output: 16841865

เลือกงานโดยใช้ตัวเลขสองตัวในช่วง 0-65535 รับบิตในตัวถูกดำเนินการแรกซึ่งอยู่ในตำแหน่งเดียวกับ 1 วินาทีในตัวถูกดำเนินการตัวที่สองและบรรจุบิตเหล่านั้นอย่างถูกต้อง

2345 ~ 7245
2345  = 0100100101001
7245  = 1110001001101
Taken : 010   0  10 1
Result: 0100101
Output: 37

ในการท้าทายนี้คุณจะได้รับนิพจน์ไบนารีโดยใช้การดำเนินการแบบแทรกหรือเลือก คุณต้องคำนวณผลลัพธ์โดยใช้จำนวนไบต์ที่น้อยที่สุดที่เป็นไปได้

นิพจน์จะถูกกำหนดเป็นสตริงที่คั่นด้วยช่องว่างซึ่งประกอบด้วยจำนวนเต็มใน 0-65535 ช่องว่างช่องว่าง¢หรือ~ช่องว่างและจำนวนเต็มใน 0-65535

อินพุตและเอาต์พุตอาจผ่านระบบมาตรฐานใด ๆ (STDIN, ฟังก์ชั่น, บรรทัดคำสั่ง ฯลฯ ) ช่องโหว่มาตรฐานถูกแบน

ตัวอย่าง:

5 ¢ 6
54

5 ~ 6
2

51234 ¢ 60003
4106492941

51234 ~ 60003
422

นี่คือรหัสกอล์ฟ - จำนวนน้อยที่สุดที่ชนะ โชคดี.

แก้ไข: เนื่องจากบางภาษาไม่รองรับสัญลักษณ์การเปลี่ยนแปลง (C) ของ INTERCAL คุณอาจใช้สัญลักษณ์เงิน ($) แทนได้ด้วยการลงโทษ 5 ไบต์


10
มันเป็นการลงโทษที่รุนแรงสำหรับผู้ใช้เครื่องหมายดอลลาร์ นั่นคือสิ่งที่ไม่สามารถช่วยได้
Beta Decay

9
ฉันเพิ่งรู้ว่า CLWNPA นั้นออกเสียงได้อย่างสมบูรณ์ในภาษาเวลส์ The W ออกเสียงว่า U ในภาษาสเปนหรือ OO เป็นภาษาอังกฤษ
เลเวลริเวอร์เซนต์

9
ฉันไม่ได้รับโทษ 5 ไบต์ C-INTERCAL $ใช้
kirbyfan64sos

13
คุณกำลังโต้เถียงกันเกี่ยวกับเรื่องอะไร? A $ ชัดเจนว่าแพงกว่า clearly อะไรที่คุณต้องการ 99 ¢เพื่ออะไร
สูงสุด

6
ฉันไม่คิดว่า INTERCAL จะอนุญาตให้คุณป้อนตัวเลขด้วยตัวเลขทศนิยม คุณไม่ต้องเขียนFIVE ONE TWO THREE FOURหรอกเหรอ? และผลลัพธ์ไม่ควรอยู่ในเลขโรมันใช่หรือไม่
Nate Eldredge

คำตอบ:


9

Pyth, 32 31 29 ไบต์

isummFdG}\~zCm.[Z16jvd2%2cz)2

ลองใช้ออนไลน์: อินพุตปกติ / ชุดทดสอบ

ขอบคุณ @isaacg สำหรับการตีหนึ่งไบต์

คำอธิบาย:

                         cz)   split input at spaces
                       %2      only take every second item (the numbers)
             m                 map each number d to:
                    vd           convert d to int
                   j  2          convert to base 2
              .[Z16              pad zeros at the left
            C                  zip
  u     }\~z                   apply the following function ("~" in input) times:
   m   G                         map each pair d to:
    mFd                          convert [x,0] to [] and [x,1] to [x]
 s                             take sum (unfold all lists)
i                           2  convert back from base 2 and print

คุณสามารถบันทึกหนึ่งไบต์โดยเปลี่ยนhMfeTเป็นsmmFdและย้ายสำเนาที่ซ้ำกันsภายนอก ternary นอกจากนี้รหัสปัจจุบันของคุณคือ 32 ไบต์ไม่ใช่ 33.
isaacg

@isaacg ว้าว ฉันจะไม่เคยคิดว่ากอล์ฟที่ฉลาด ขอบคุณ และใช่ได้เล่นกอล์ฟในนาทีสุดท้ายขณะที่เขียนคำอธิบายและไม่ได้อัปเดตจำนวนไบต์
Jakube

2
มันน่าสนใจจริงๆที่จะเห็นคำตอบของ Pyth และ CJam เกือบทุกครั้งจะมีจำนวนไบต์เดียวกัน แต่ Pyth ก็มักจะชนะ CJam เพียงไม่กี่ครั้ง
Kametrixom

13

Python 2, 115 112 bytes

x,y,z=input().split()
d=y<""
f=lambda a,b:a+b and(b%2+5&4-d)*f(a/2,b/2)+(a%2*2+b%2)/3**d
print f(int(x),int(z))

สตริงในบรรทัดที่สองประกอบด้วยอักขระ unprintable เดียว\x7d, ~ถ่านถัดไปหลังจาก

ความหวังทั้งหมดของแลมบ์ดาที่ดีเพียงอย่างเดียวจะถูกบดขยี้โดยรูปแบบอินพุต อาจเป็นวิธีที่ดีกว่าในการอ่านอินพุต ป้อนเช่น"51234 ¢ 60003"ผ่าน STDIN

ฟังก์ชันนี้fรวมฟังก์ชันการเรียกซ้ำสองรายการต่อไปนี้:

g=lambda a,b:a+b and 4*g(a/2,b/2)+a%2*2+b%2    # ¢
h=lambda a,b:a+b and(b%2+1)*h(a/2,b/2)+a*b%2   # ~

(-3 ไบต์ด้วยความช่วยเหลือของ @xnor)


1
+1 สำหรับคำตอบของ Python ที่มีการแข่งขันสูง ฉันสงสัยว่าทำไมคุณถึงรบกวนแลมบ์ดาและไม่เพียงแค่ใช้การแสดงออก แต่ดูเหมือนว่ามีการสอบถามซ้ำอีกครั้งในนั้น ฉันไม่รู้ Python ฉันหวังว่าจะได้คำอธิบาย
เลเวลริเวอร์เซนต์

การทุบตีที่ยอดเยี่ยม! ฉันกำลังดูการบีบอัดนิพจน์ค่าคงที่ การแสดงออก(a%2*2+b%2)/3**dบันทึกตัวอักษร 3 d=1-cแต่ใช้สมบูรณ์ คุณมีวิธีที่จะทำอย่างไร-~(3*c|b%2)กับส่วนประกอบหรือไม่? ที่เลวร้ายที่สุดจะสูญเสีย 2 3-3*dตัวอักษรด้วย นอกจากนี้รูปแบบand-~x+yอาจandy-~xยาวได้เมื่อyเริ่มต้นด้วยสัญลักษณ์หรือตัวเลข
xnor

@xnor เข้าใจ(b%2+5&4-d)แล้ว ขอบคุณ!
Sp3000

11

CJam, 31 ไบต์

rrc\r]{i2bF0e[}%(7=\zf{_)*?~}2b

ลองใช้ออนไลน์ในล่าม CJam

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

rr                              e# Read two tokens from STDIN.
  c\                            e# Cast the second to char and swap with the first.
    r                           e# Read a third token from STDIN.
     ]                          e# Wrap everything in an array.
      {       }%                e# For all three elements:
       i2b                      e#   Cast to int and convert to base 2.
          F0e[                  e#   Left-pad with zeroes to complete 15 digits.
                (               e# Shift out the first base 2 array.
                 7=             e# Select its eighth MSB (1 for '¢', 0 for '~').
                   \            e# Swap with the array of base 2 arrays.
                    z           e# Zip to transpose rows with columns.
                     f{     }   e# For each pair of base 2 digits:
                                e#   Push the bit, then the pair.
                       _        e#   Copy the pair.
                        )       e#   Pop the second digit.
                         *      e#   Repeat the first digit that many times.
                          ?     e#   Ternary if. Select the pair if the bit is
                                e#    truthy, the repeated first bit if it's falsy.
                           ~    e#   Dump the selected array on the stack.
                             2b e# Convert from base 2 to integer.

8

JavaScript (ES6), 103 117 119 124

แก้ไขการทำงานกับตัวเลขแทนที่จะเป็นสตริง

(ไม่นับช่องว่างนำขึ้นบรรทัดใหม่และความคิดเห็น)

ทดสอบการเรียกใช้ตัวอย่างบนเบราว์เซอร์ที่สอดคล้องกับ EcmaScript 6 (ไม่ใช่ Chrome ไม่ใช่ MSIE โดยเฉพาะฉันทดสอบบน Firefox, Safari 9 แล้ว)

I=s=>
  (i=>{
    for(m=r=0,[a,o,b]=s.split` `;i>0;i<<=1) // loop until bit 31 of i is set
      o>'~'?r+=(b&i)*i+(a&i)*2*i:b&i?r+=(a&i)>>m:++m
  })(1)||r


// TEST
out=x=>O.innerHTML+=x+'\n\n';

[ ['234 ¢ 4321', 16841865], ['2345 ~ 7245', 37]
, ['5 ¢ 6', 54], ['5 ~ 6', 2]
, ['51234 ¢ 60003',4106492941], ['51234 ~ 60003', 422]]
.forEach(([i,o,r=I(i)])=>{
  out('Test '+ (o==r?'OK':'Fail')+'\nInput:    '+ i+'\nResult:   '+r+'\nExpected: '+o)})
<pre id=O></pre>


5

Matlab, 119 113 ไบต์

function f(s)
t=dec2bin(str2double(strsplit(s,{'¢' '~'}))');u=any(s>'~');[~u u]*bin2dec({t(1,t(2,:)==49) t(:)'})

Ungolfed:

function f(s)                                     % input s is a string
t = dec2bin(str2double(strsplit(s,{'¢' '~'}))');  % get the two numbers and convert to
                                                  % two-row char array of zeros of ones
u = any(s>'~');                                   % 1 indicates '¢'; 0 indicates '~'
[~u u]*bin2dec({t(1,t(2,:)==49) t(:)'})           % compute both results and display
                                                  % that indicated by u

ตัวอย่าง:

>> f('234 ¢ 4321')
ans =
    16841865

>> f('2345 ~ 7245')
ans =
    37

5

R, 145 ไบต์

s=scan(,"");a=as.double(c(s[1],s[3]));i=intToBits;cat(packBits(if(s[2]=="~")c(i(a[1])[i(a[2])>0],i(0))[1:32] else c(rbind(i(a[2]),i(a[1]))),"i"))

คำอธิบาย Ungolfed +:

# Read a string from STDIN and split it on spaces
s <- scan(, "")

# Convert the operands to numeric
a <- as.double(c(s[1], s[3]))

o <- if (s[2] == "~") {
    # Get the bits of the first operand corresponding to ones in
    # the second, right pad with zeros, and truncate to 32 bits
    c(intToBits(a[1])[intToBits(a[2]) == 1], intToBits(0))[1:32]
} else {
    # Interleave the arrays of bits of the operands
    c(rbind(intToBits(a[2]), intToBits(a[1])))
}

# Make an integer from the raw bits and print  it to STDOUT
cat(packBits(o, "integer"))

5

Python 3, 174 166 148 126

การดำเนินงานสตริงตรงไปตรงมาสวยแล้วแปลงกลับเป็นจำนวนเต็ม

จำกัด ตัวเลขที่เป็นเลขฐานสองมี 99 หลัก (สูงสุด 2 ^ 99-1 = 633825300114114700748351602687)

ขอบคุณ Sp3000 และ Vioz!

a,o,b=input().split()
print(int(''.join([(i+j,i[:j>'0'])[o>'~']for i,j in zip(*[bin(int(j))[2:].zfill(99)for j in(a,b)])]),2))

หรือ 165 ตัวอักษรโดยไม่ จำกัด :

a,o,b=input().split()
a,b=[bin(int(j))[2:]for j in(a,b)]
print(int(''.join([(i if j=='1'else'')if o=='~'else i+j for i,j in zip(a.zfill(len(b)),b.zfill(len(a)))]),2))

Ungolfed:

a, op, b = input().split()
a, b = [bin(int(j))[2:] for j in(a,b)] #convert to int (base 10), then to binary, remove leading '0b'
m = max(len(a), len(b))
a = a.zfill(m) #fill with leading zeroes
b = b.zfill(m)
if op == '~':
    ret = [i if j=='1' else'' for i, j in zip(a, b)]
else:
    ret = [i + j for i, j in zip(a, b)]
ret = ''.join(ret) #convert to string
ret = int(ret, 2) #convert to integer from base 2
print(ret)

2
คุณสามารถใช้zfillแทนการrjust
แพ็ดดิง

อินพุตสูงสุดออกที่ 16 บิตและเอาต์พุตที่ 32 บิต 99 บิตนั้นมากเกินพอ
isaacg

ฉันรู้ แต่เนื่องจาก '99' ใช้ตัวละครมากเท่ากับ '16' จึงไม่มีประโยชน์ในการ จำกัด
ตรัง Oul

1
อีกไม่กี่: 1) คุณไม่จำเป็นต้องบันทึก a,bเพียงแค่ใส่ไว้ในzipที่มี*เครื่องหมาย 2) (i if j=='1'else'') -> i[:j>'0']3) คุณสามารถใช้เคล็ดลับนี้จะบันทึกในที่อื่น ๆif/else
SP3000

1
โซลูชันของฉันใกล้เคียงกับคุณมากเกินไปดังนั้นนี่จะสั้นที่สุดเท่าที่ฉันจะได้รับ (126 ไบต์)
Kade

4

Pyth, 43 ไบต์

ส่วนหนึ่งของฉันรู้สึกประหม่าโพสต์คำตอบ Pyth แบบยาวสำหรับคำถามของ isaacg ... : oP

J.(Kczd1Am.BvdKiu?qJ\~u+G?qeH\1hHk+VGHk.iGH2

ชี้แจง:

                                               Implicit: z=input(), k='', d=' '
   Kczd                                        Split z on spaces, store in K
J.(    1                                       Remove centre element from K, store in J
         m    K                                For each d in K
          .Bvd                                 Evaluate as int, convert to binary string
        A                                      Store pair in G and H
                                               ~ processing:
                                 +VGH          Create vectorised pairs ([101, 110] -> [11, 01, 10])
                     u               k         Reduce this series, starting with empty string
                        ?qeH\1                 If 2nd digit == 1...
                              hHk              ... take the 1st digit, otherwise take ''
                      +G                       Concatenate
                                      .iGH     ¢ processing: interleave G with H
                ?qJ\~                          If J == ~, take ~ processing, otherwise take ¢
               i                          2    Convert from binary to decimal

4
ฉันรักรูปโปรไฟล์ของคุณ! :)
kirbyfan64sos

2
@ kirbyfan64sos Blue Kirby ดีที่สุดคือ Kirby: o)
Sok

3

C, 127 123 ไบต์ + 5 การลงโทษ = 128

scanf นับสัญลักษณ์ยูนิโค้ดว่าเป็นตัวละครมากกว่าหนึ่งตัวที่ทำให้สิ่งต่าง ๆ มีความซับซ้อนดังนั้นฉันจึงใช้บทลงโทษ 5 ไบต์เพื่อใช้งาน $ไบต์สำหรับการใช้

a,b,q,x,i;main(){scanf("%d %c %d",&a,&q,&b);for(i=65536;i/=2;)q%7?x=x*4|a/i*2&2|b/i&1:b/i&1&&(x=x*2|a/i&1);printf("%u",x);}

การเปลี่ยนแปลงจากเวอร์ชั่นดั้งเดิมคือ:

- การทดสอบสำหรับ $ หรือ ~ ได้รับการแก้ไขจาก q&2q%7การ นี่เป็นการย้อนกลับค่าจริง / เท็จทำให้โค้ดสำหรับ $ โอเปอเรเตอร์ไปข้างหน้า :ซึ่งหมายความว่าชุดของวงเล็บจะถูกกำจัด

- iวงวนนั้นนับเป็นพลังของ 2 ซึ่งยาวกว่า แต่อนุญาต>>ให้แทนที่ได้/และบันทึกวงเล็บบางส่วน

รุ่นดั้งเดิม 127 ไบต์

a,b,q,x,i;
main(){
  scanf("%d %c %d",&a,&q,&b);
  for(i=16;i--;)
    q&2?
      b>>i&1&&(x=x*2|a>>i&1):    // ~ operator. && used as conditional: code after it is executed only if code before returns truthy.
      (x=x*4|(a>>i&1)*2|b>>i&1); // $ operator
  printf("%u",x);
}

ฉันไปกับลูปเดียวโดยมีเงื่อนไขอยู่ข้างในเพื่อหลีกเลี่ยงโอเวอร์เฮดของสองลูป ในทั้งสองกรณีฉันเลื่อนบิตของตัวถูกดำเนินการลงไปที่บิตของ 1 และสร้างผลลัพธ์จากบิตที่มีความสำคัญที่สุดไปจนถึงบิตที่สำคัญน้อยที่สุดยกระดับผลลัพธ์ (คูณด้วย 2 หรือ 4) ตามที่ฉันไป


ฉันเล่นเพื่อคุณ: main (a, b, q, x, i) {scanf ("% d% c% d", & a, & q, & b); สำหรับ (i = 16; i -;) q & 2? ข >> ฉัน & 1 && (x = x * 2 | >> I & 1) :( x = x * 4 | (ก >> I & 1) * 2 | ข >> ฉัน & 1); printf ( "u%" x);} ฉันพยายามตีกอล์ฟ >> ชิ้นส่วน i & 1 แต่หาวิธีลดค่าใช้จ่ายไม่ได้ ฉันสามารถบันทึกได้ 1 ตัว แต่โดยการกำหนดนิยามตัวแปรไว้ในหลัก หมายเหตุ: ยังไม่ทดลอง
LambdaBeta

@ LamdaBeta ขอบคุณฉันไม่สามารถหามาโครสำหรับ >> i & 1 ได้ แต่ฉันสามารถเล่นกอล์ฟได้อีกทางหนึ่ง การวางตัวแปรเป็นอาร์กิวเมนต์ของmainสาเหตุqที่จะเกิดความเสียหายบนเครื่องของฉันซึ่งแปลก ฉันคาดหวังว่าปัญหาที่แท้จริงจะเกิดขึ้นด้วยscanfแต่เนื่องจากการที่ฉันได้ปล่อยให้พวกเขาเป็นประกาศปกติ
เลเวลริเวอร์เซนต์

ฉันไม่ได้คิดอย่างนั้น คุณพูดถูก q จะเสียหาย เหตุผลก็คือในขณะที่เราเรียนรู้ว่าหลักรับอาร์กิวเมนต์สองตัวจำนวนอาร์กิวเมนต์บรรทัดคำสั่งและอาร์เรย์ของอาร์กิวเมนต์เองระบบส่วนใหญ่จะให้อาร์กิวเมนต์ที่สาม (โดยทั่วไปเรียกว่าถ่าน * envp []) ซึ่งอธิบายสภาพแวดล้อมของรหัส ทำงานใน (ให้สิทธิ์การเข้าถึง EG: ตัวแปรสภาพแวดล้อม) ดังนั้นค่าที่สามใน main อาจถูกกำหนดค่าโดยระบบ scanf เป็นผู้บริสุทธิ์ในครั้งนี้
LambdaBeta

@ สตีฟเวอร์ฉันคิดว่าคุณสามารถลบโทษ 5 ไบต์ได้เช่นกัน ฉันเพิ่งทดสอบรหัสของคุณ (โดยใช้ ALT + 155 เพื่อสร้าง¢) และดูเหมือนว่าจะทำงานได้ดี :)
LambdaBeta

@ แลมบ์เบต้าจริง ๆ แล้วการทดลองแสดงให้เห็นว่าเป็นการรวมกันของทั้งคู่ ด้วยการประกาศปกติqรับประกันว่าจะเป็นศูนย์ แต่ด้วยการประกาศเป็นพารามิเตอร์ฟังก์ชั่นqมีขยะ 32 บิต นั่นจะไม่เป็นปัญหาหากฉันกำหนดค่าให้qแต่scanfด้วยการ"%c"เขียนทับขยะ 8 บิตที่สำคัญน้อยที่สุด ฉันอาจจะโชคดีในคอมไพเลอร์อื่น!
เลเวลริเวอร์เซนต์

3

K5, 53 52 ไบต์

{b/({,/x,'y};{x@&y})[*"~"=y][b\.x;(b:20#2)\.z]}." "\

รุ่น 53 ไบต์:

{b/({,/x,'y};{x@&y})[*"¢~"?y][b\.x;(b:20#2)\.z]}." "\

ยังต้องการเล่นกอล์ฟเพิ่มขึ้นอีกเล็กน้อย


3

CJam, 61 50 46 41 34 ไบต์

ขอบคุณ @Dennis ที่ชี้ให้เห็นถึงกอล์ฟขนาด 4 ไบต์

rrc'~=:X;r]{i2bF0e[}/.{X{{;}|}&}2b

ลองมันออนไลน์


1
]{}/คือ noop
เดนนิส

1
@ เดนนิสขอบคุณ ฉันน่าจะนอนบ้าง ...
Andrea Biondo

3

Haskell, 77

g=(`mod`2)
h=(`div`2)
0¢0=0
a¢b=g a+2*b¢h a
a?0=0
a?b=g a*g b+(1+g b)*h a?h b

อินพุตถูกกำหนดโดยใช้อินพุตกับฟังก์ชัน / โอเปอเรเตอร์?และ¢กำหนดไว้ในโค้ด (Haskell ไม่สามารถกำหนดโอเปอเรเตอร์ได้~การด้วยเหตุผลทางเทคนิค)

ใช้วิธีเรียกซ้ำแบบเดิมโดยทั่วไป


2

J, 173

f=:|."1@(>@(|.&.>)@(#:@{:;#:@{.))
m=:2&#.@:,@:|:@:|.@:f
s=:2&#.@#/@:f
a=:{&a.@-.
(1!:2)&2(s@".@:a&126)^:(126 e.i)((m@".@:a&194 162)^:(1 e.194 162 E.i)i=._1}.(a.i.((1!:1)3)))

คาดว่าอินพุตหนึ่งบรรทัด

อินพุตที่คาดว่าจะยุติหลังจากบรรทัดใหม่ด้วย EOF


2

Javascript ES6 (3 อาร์กิวเมนต์) 141 138 136 121 119 ไบต์

b=x=>(65536|x).toString`2`
f=(x,o,y)=>+eval(`'0b'+(b(y)+b(x)).replace(/^1|${o=='~'?1:'(.)'}(?=.{16}(.)())|./g,'$2$1')`)

ทดสอบ:

;[f(234,'¢',4321),f(2345,'~',7245)]=="16841865,37"

Javascript ES6 (1 อาร์กิวเมนต์) 135 133 ไบต์

b=x=>(65536|x).toString`2`
f=s=>([x,o,y]=s.split` `)|eval(`'0b'+(b(y)+b(x)).replace(/^1|${o=='~'?1:'(.)'}(?=.{16}(.)())|./g,'$2$1')`)

ทดสอบ:

;[f('234 ¢ 4321'),f('2345 ~ 7245')]=="16841865,37"

PS: บรรทัดใหม่นับเป็น 1 ไบต์เนื่องจากสามารถแทนที่;ได้


1
0x10000 == 65536 (บันทึก 2 ตัวอักษร)
edc65

@ edc65 ฉันได้อัปเดตคำตอบแล้ว
Qwertiy

2
65536 | x เพื่อหลีกเลี่ยง ~~
edc65

อนุญาตเฉพาะรุ่นที่สองเท่านั้น - อินพุตต้องอยู่ในรูปแบบของสตริงคั่นด้วยช่องว่าง
isaacg

@isaacg, ตกลง แต่ฉันไม่ต้องการลบรายการแรกด้วยเหตุผลทางประวัติศาสตร์
Qwertiy

2

Python 3, 157 ไบต์

a,x,y=input().split()
i=int
b=bin
print(i(''.join(([c for c,d in zip(b(i(a)),b(i(y)))if d=='1'],[c+d for c,d in zip(b(i(a))[2:],b(i(y))[2:])])['¢'==x]),2))

เต็มรูปแบบและรุ่นอธิบายสามารถพบได้บนของฉันPastebin


คุณสามารถเดียวกันสองสามตัวอักษรโดยการลบช่องว่างรอบตัวดำเนินการ '==' ก่อนหน้า 'ถ้า' และโดยผ่าน 'ฐาน' เป็นอาร์กิวเมนต์ตำแหน่ง
ตรัง Oul

ขอบคุณนั้นและคนอื่น ๆ ได้บันทึก 15 ตัวอักษร! แต่วิธีการจัดรูปแบบเป็นสองเท่าของการส่งคืนยังคงมีอยู่มาก
โอลิเวอร์ฟรีดริช

นอกจากนี้คุณใช้ช่องว่าง 4 รายการต่อการเยื้องหรือไม่ หนึ่ง (หรือแท็บ) ก็เพียงพอแล้ว
ตรัง Oul

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

1
คุณดูเหมือนจะใช้eเพียงครั้งเดียวคุณไม่สามารถแทรกมันได้หรือไม่
เควินบราวน์

0

Mathematica, 155 ไบต์

f=IntegerDigits[#,2,16]&;
g=#~FromDigits~2&;
¢=g[f@#~Riffle~f@#2]&;
s=g@Cases[Thread@{f@#,f@#2},{x_,1}->x]&;
ToExpression@StringReplace[#,{" "->"~","~"->"s"}]&

หาค่าเป็นฟังก์ชันที่ไม่ระบุชื่อโดยรับสตริงเป็นอินพุต เพิ่มตัวแบ่งบรรทัดเพื่อความชัดเจน

fและgแปลงเป็น / จากฐาน 2 Riffleทำในสิ่งที่ควรจะสอดแทรก ฉันต้องการใช้Selectเพื่อเลือกแต่Casesน่าเสียดายที่ดีกว่า บรรทัดสุดท้ายเป็นบิตของเล่ห์เหลี่ยม; ช่องว่างถูกเปลี่ยน~เป็นโอเปอเรเตอร์ของ Mathematica จากนั้นสตริงจะถูก eval'd

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