เปลี่ยน Array ให้เป็นปัญหาทางคณิตศาสตร์


35

รับรายการที่ไม่มีข้อยกเว้นของจำนวนเต็มไม่ใช่ค่าลบพิจารณาการเขียนใหม่เป็นปัญหาทางคณิตศาสตร์โดยที่:

  • เครื่องหมายบวก ( +) ถูกแทรกระหว่างคู่ของตัวเลขที่เพิ่มจากซ้ายไปขวา (aka จากจุดเริ่มต้นของรายการจนถึงสิ้นสุด)
  • เครื่องหมายลบ ( -) ถูกแทรกระหว่างคู่ของตัวเลขที่ลดลงจากซ้ายไปขวา
  • เครื่องหมายการคูณ ( *) ถูกแทรกระหว่างคู่ของตัวเลขที่เท่ากัน

กล่าวว่าวิธีอื่น: รายการย่อย ๆa,bจะกลายเป็นa+bถ้าa<b, a-bถ้า a>bและถ้าa*ba==b

ตัวอย่างเช่นรายการ

[12, 0, 7, 7, 29, 10, 2, 2, 1]

จะกลายเป็นการแสดงออก

12 - 0 + 7*7 + 29 - 10 - 2*2 - 1

ซึ่งประเมิน 75ว่า

เขียนโปรแกรมหรือฟังก์ชั่นที่ใช้ในรายการดังกล่าวและประเมินผลการพิมพ์หรือส่งคืนผลลัพธ์

  • ลำดับการปฏิบัติงานมีความสำคัญ การคูณจะต้องทำก่อนการเพิ่มหรือการลบ
  • หากรายการอินพุตมีหนึ่งหมายเลขนั่นคือสิ่งที่ควรประเมิน เช่นควรจะให้[64]64
  • การใช้evalหรือexecหรือคล้ายกันสร้างที่ได้รับอนุญาต

นี่คือตัวอย่างเพิ่มเติม:

[list]
expression
value

[0]
0
0

[1]
1
1

[78557] 
78557
78557

[0,0]
0*0
0

[1,1]
1*1
1

[2,2]
2*2
4

[0,1]
0+1
1

[1,0]
1-0
1

[1,2]
1+2
3

[2,1]
2-1
1

[15,4,4]
15-4*4
-1

[9,8,1]
9-8-1
0

[4,2,2,4]
4-2*2+4
4

[10,9,9,12]
10-9*9+12
-59

[1,1,2,2,3,3]
1*1+2*2+3*3
14

[5,5,4,4,3,3]
5*5-4*4-3*3
0

[3,1,4,1,5,9,2,6,5,3,5,9]
3-1+4-1+5+9-2+6-5-3+5+9
29

[7637,388,389,388,387,12,0,0,34,35,35,27,27,2]
7637-388+389-388-387-12-0*0+34+35*35-27*27-2
7379

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ Tiebreaker เป็นคำตอบก่อนหน้า


5
เกี่ยวกับ "คำสั่งของการดำเนินงานมีความสำคัญ" มันเป็นการดีที่จะระบุอย่างชัดเจนว่าการเพิ่มและการลบนั้นสัมพันธ์กันทางซ้ายและมีความสำคัญเหมือนกัน
Martin Ender

คำตอบ:


15

Python 2, 63 ไบต์

p=s='print-'
for x in input():s+='*+-'[cmp(x,p)]+`x`;p=x
exec s

สร้างและevalสตริงการแสดงออก สัญลักษณ์ทางคณิตศาสตร์ที่ถูกเลือกโดยการเปรียบเทียบจำนวนก่อนหน้าไปอีกทางหนึ่งในปัจจุบันp xสัญลักษณ์จะถูกต่อท้ายด้วยหมายเลขปัจจุบัน

หมายเลขแรกถูกจัดการด้วยเคล็ดลับที่ชาญฉลาดจาก Sp3000 ค่าเริ่มต้นของpถูกตั้งค่าเป็นสตริงซึ่งมีขนาดใหญ่กว่าจำนวนใด ๆ และทำให้เกิด-ก่อนหน้าหมายเลขแรก แต่sถูกเตรียมใช้งานprint-ในเวลาเดียวกันที่ทำให้ผลลัพธ์เริ่มต้นด้วยprint--(ขอบคุณ xsot สำหรับการบันทึก 2 ไบต์โดยเริ่มต้นด้วยprint)


ฉันคิดว่าคุณสามารถย้ายprintเป็นสตริงและใช้แทนexec eval
xsot

13

Pyth, 31 26 19 17 16 15 ไบต์

นิพจน์ที่มี*จะไม่ประเมินผลออนไลน์ แต่จะใช้งานได้ในทางทฤษฎี

2 ไบต์ขอบคุณ Maltysen

vsm+@"*-+"._-~k

ชุดทดสอบ (พร้อมการประเมินผล)

กรณีอื่น ๆ (ไม่มีการประเมินผล)

ประวัติศาสตร์

  • 31 ไบต์: M+G@"*-+"->GH<GHv+sgMC,JsMQtJ\x60e
  • 26 ไบต์: M+G@"*-+"->GH<GHv+sgVQtQ\x60e
  • 19 ไบต์: vtssVm@"*-+"->Zd<~Z
  • 17 ไบต์: vtssVm@"*-+"._-~Z
  • 16 ไบต์: vssVm@"*-+"._-~k
  • 15 ไบต์: vsm+@"*-+"._-~k

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

เพราะสิ่งที่การรักษาความปลอดภัย (การประเมินผลการทำงานเฉพาะสำหรับ+และ-ออนไลน์)
รั่วนูน

@HelkaHomba ฉันยังไม่มีโอกาสลองออฟไลน์ แต่ควรใช้งานได้ ล่ามออนไลน์ใช้--safeสวิทช์ซึ่งแทนที่ด้วยeval ast.literal_eval
Dennis

ตกลงยุติธรรมพอ
งานอดิเรกของ Calvin

ยืนยันทำงานได้กับล่ามออฟไลน์
เดนนิส

12

เยลลี่ , 18 16 15 14 ไบต์

I0;ð1g×⁹⁸œṗP€S

ไม่ใช้ eval ในตัว ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

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

I0;ð1g×⁹⁸œṗP€S  Main link. Input: A (list)

I               Increments; compute the deltas of all adjacent items of A.
 0;             Prepend a 0.
   ð            Begin a new, dyadic chain.
                Left argument: D (0 plus deltas). Right argument: A
    1g          Compute the GCD of 1 and each item in D.
                This yields 1 for non-negative items, -1 for negative ones.
      ×⁹        Multiply each 1 or -1 with the corresponding item of A.
                This negates every item in A that follows a - sign.
        ⁸œṗ     Partition the result by D. This splits at occurrences of non-zero
                values of D, grouping items with identical absolute value.
           P€   Take the product of each group.
             S  Sum; add the results.


1
ทำได้ดีมาก ฉันควรจะเพิ่ม Python evalเป็นอะตอม ...
Dennis

9
ฉันออกไปเล่นกอล์ฟกับคุณ : P
Dennis

ทำได้ดีมากตาคุณ!
Leun Nun

9

MATLขนาด 12 ไบต์

Y'^l6MdZSh*s

สิ่งนี้ใช้ความคิดที่ดีมากของ @ aditsu ในการเข้ารหัสแบบรันไทม์

ลองออนไลน์!

คำอธิบาย

       % Take input vector implicitly
Y'     % RLE. Produces two vectors: values and lengths
^      % Rise each value to the number of consecutive times it appears. This
       % realizes the product of consecutive equal values
l      % Push 1
6M     % Push vector of values again
d      % Consecutive differences
ZS     % Sign function. Gives 1 or -1 (no 0 in this case)
h      % Concatenate horizontally with previous 1
*      % Multiply. This gives plus or minus depending on increasing character
s      % Sum of vector. This realizes the additions or subtractions
       % Display implicitly

ฮ่าฮ่าเพิ่งเขียนสิ่งที่คล้ายกันขึ้นมา RLE ทำงานได้ดีสำหรับเรื่องนี้
Suever

@ ในที่สุดฉันเห็น :-D
Luis Mendo

7

CJam, 20

q~e`{~_W-g\:W@#*}%:+

ลองออนไลน์

คำอธิบาย:

q~       read and evaluate the input (array of numbers)
e`       RLE encode, obtaining [count number] pairs
{…}%     map each pair
  ~_     dump the count and number on the stack, and duplicate the number
  W-     subtract the previous number (W is initially -1 by default)
  g      get the sign of the result
  \      swap with the other copy of the number
  :W     store it in W (for next iteration)
  @#     bring the count to the top, and raise the number to that power
  *      multiply with the sign
:+       add all the results together

7

JavaScript (ES6), 54

p=>eval(0+p.map(v=>x+='*-+'[(p>v)+2*(p<v)]+(p=v),x=1))

eval รับรายการนิพจน์คั่นด้วยเครื่องหมายจุลภาคและส่งคืนค่าของรายการสุดท้าย

ทดสอบ

f=p=>eval(0+p.map(v=>x+='*-+'[(p>v)+2*(p<v)]+(p=v),x=1))

t=p=>(0+p.map(v=>x+='*-+'[(p>v)+2*(p<v)]+(p=v),x=1))

function Test() {
  var a=I.value.match(/\d+/g).map(x=>+x) // convert input to a numeric array
  
  var x=f(a),y=t(a)
  O.textContent='Value '+x+'\n(no eval '+y+')'
}  

Test()
#I { width:80%}
<input value='12, 0, 7, 7, 29, 10, 2, 2, 1' id=I>
<button onclick='Test()'>Test</button>
<pre id=O></pre>


4
นั่นเป็นการละเมิดที่เลวร้ายที่สุดของโอเปอเรเตอร์คอมม่าที่ฉันจำได้ว่าเห็นในเว็บไซต์นี้ ...
Neil

5

Julia, 76 57 ไบต์

!x=[[" ""-*+"[2+sign(diff(x))]...] x]'|>join|>parse|>eval

ครั้งแรกที่ฉันเล่นกอล์ฟ Julia ดังนั้นอาจมีการปรับปรุงที่ชัดเจน ลองออนไลน์!

เดนนิสบันทึกข้อมูลเป็นตัน


งานที่ดี. ฉันไม่ทราบว่าคุณสามารถกำหนดฟังก์ชั่นที่กำหนดเอง!ได้
Rɪᴋᴇʀ


4

Pyth - 23 22 20 ไบต์

การคูณทวีคูณไม่ได้ทำงานออนไลน์

vs.i+\+@L"*+-"._M-Vt

Test Suite โดยไม่ต้องทำ EVAL


เควินคืออะไร
Leun Nun

@LeakyNun ฉันลืมชื่อของคุณหลังจากนั้นไม่นาน> _>
Maltysen

@Maltysen Haha คุณกำลังคิดถึงเควิน - นอ - เคนนี่เลา
DJMcMayhem

ขออภัยฉันรับประทานอาหารดังนั้นฉันไม่สามารถตีกอล์ฟวิธีแก้ปัญหาของฉันได้ ตาคุณ.
Leun Nun

@LeakyNun เกือบจะถึงแล้ว
Maltysen

3

R, 92 ไบต์

ยังคงมีสนามกอล์ฟที่ดีที่สามารถทำได้ที่นี่

eval(parse(t=paste(i<-scan(),c(ifelse(d<-diff(i),ifelse(d>0,"+","-"),"*"),""),collapse="")))

Ungolfed:

i = scan()                # Read list from stdin
d = diff(i)               # Calculate difference between each element of list
s = ifelse(d,             # If d!=0
             ifelse(d>0,  # And if d>1
                    "+",  # Return plus
                    "-"), # Else return minus
             "*")         # Else (i.e. d==0) return multiply.
s = c(s,"")               # Pad the list s with an empty string, so it's the same
                          # length as i
p = paste(i,s,collapse="")# Paste the elements of i and s into one long string.
eval(parse(t=p))          # Evaluate the string as a language object.

ฉันจัดการเพื่อบันทึกเพียงหนึ่งไบต์โดยใช้วิธีการจัดทำดัชนี
JayCe


2

TI-BASIC, 146 ไบต์

ฉันจะจัดรูปแบบเป็นอย่างดีเมื่อไม่ได้ใช้มือถือ การนอนหลับจะหนีฉันไปดังนั้นคุณจะได้รับสิ่งนี้ สนุก.

Prompt L₁
"(→Str1
For(A,1,dim(L₁
{0,1→L₂
{0,L₁(A→L₃
LinReg(ax+b) L₁,L₃,Y₁
Equ►String(Y₁,Str2
sub(Str2,1,-1+inString(Str2,"X→Str2
If A>1
Then
L₁(A-1
2+(Ans>L₁(A))-(Ans<L₁(A
Str1+sub("+*-",Ans,1→Str1
End
Str1+Str2→Str2
End
expr(Str1

2

Javascript ES6, 64 62 ตัวอักษร

a=>eval(a.map((x,i)=>x+('*+-'[x<a[++i]|(x>a[i])*2])).join``+1)

3
ไม่ควรเป็นฟังก์ชันและaพารามิเตอร์ใช่หรือไม่
edc65

สิ่งนี้ไม่ถูกต้องตามที่เป็น
Rɪᴋᴇʀ

@ edc65 ใช่มันควรจะเป็น แต่ในความเป็นจริงมันถูกนับ (ระบุ 61 แต่ความยาวรหัสจริงคือ 59) ฉันเพิ่งคัดลอกรหัสใหม่ไม่ดี (การแก้ไขควรเป็นa[i+1]...a[i+1]=> a[++i]...a[i]- 2 ตัวอักษรสั้นลง แต่ฉันเปลี่ยนรหัสทั้งหมดทิ้งa=>โดยไม่ตั้งใจ)
Qwertiy

@ ใช่ฉันเป็นเพียงการวางผิด ดูความคิดเห็นด้านบนและแก้ไขประวัติเพื่อดูรายละเอียดเพิ่มเติม
Qwertiy

@Qwertiy โอเคเจ๋ง คำตอบที่ดี btw ..
Rɪᴋᴇʀ

1

Java, 384 ไบต์

int s(int[]l){int n=l[0],m;for(int i=0;i<l.length-1;i++)if(l[i]<l[i+1])if(i<l.length-2&&l[i+1]!=l[i+2])n+=l[i+1];else{m=l[i+1];while(i<l.length-2&&l[i+1]==l[i+2])m*=l[(i++)+1];n+=m;}else if(l[i]>l[i+1])if(i<l.length-2&&l[i+1]!=l[i+2])n-=l[i+1];else{m=l[i+1];while(i<l.length-2&&l[i+1]==l[i+2])m*=l[(i++)+1];n-=m;}else{m=l[i];while(i<l.length-1&&l[i]==l[i+1])m*=l[i++];n+=m;}return n;}

Ungolfed ลองออนไลน์

int s(int[] l)
{
    int n=l[0], m;

    for(int i=0; i<l.length-1; i++)
    {
        if(l[i] < l[i+1])
        {
            if (i<l.length-2 && l[i+1]!=l[i+2])
            {
                n += l[i+1];
            }
            else
            {
                m = l[i+1];
                while(i<l.length-2 && l[i+1]==l[i+2]) m *= l[(i++)+1];
                n += m;
            }
        }
        else if(l[i] > l[i+1])
        {
            if (i<l.length-2 && l[i+1]!=l[i+2])
            {
                n -= l[i+1];
            }
            else
            {
                m = l[i+1];
                while(i<l.length-2 && l[i+1]==l[i+2]) m *= l[(i++)+1];
                n -= m;
            }
        }
        else
        {
            m = l[i];
            while(i<l.length-1 && l[i]==l[i+1]) m *= l[i++];
            n += m;
        }
    }

    return n;
}

1
บางโรงแรมพร้อมสนามกอล์ฟอย่างรวดเร็ว: int a=l.length, &&=> &ใส่int i=0ใน "สาย" int n=l[0],mเช่นเดียวกับ
Leun Nun

ในif(i<l.length-2&&l[i+1]!=l[i+2])n+=l[i+1];else{m=l[i+1];while(i<l.length-2&&l[i+1]==l[i+2])m*=l[(i++)+1];n+=m;คุณสามารถแทนที่สิ่งนี้ด้วยเนื้อหาภายในelseบล็อก
Leun Nun


1

Perl, 49 ไบต์

48 ไบต์รหัส + 1 สำหรับ -p

s/\d+ (?=(\d+))/$&.qw(* - +)[$&<=>$1]/ge;$_=eval

การใช้

perl -pe 's/\d+ (?=(\d+))/$&.qw(* - +)[$&<=>$1]/ge;$_=eval' <<< '12 0 7 7 29 10 2 2 1'
75

หมายเหตุ

ฉันเรียนรู้ที่นี่ว่าคุณสามารถจับ lookahead ใน PCRE ได้แม้ว่ามันจะไม่ได้ใช้งานได้ง่าย ( (?=(\d+))แทนที่จะเป็น((?=\d+))) มันสมเหตุสมผลแล้วหลังจากอ่านเพราะคุณจะจับคู่การแข่งขันที่มีความยาวเป็นศูนย์ (lookahead) กับหลังและแทนที่จะจับคู่กับอดีต)

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


@LeakyNun ฉันไม่เคยรู้แน่ชัดว่าจะทำอย่างไรฉันไม่สามารถหาเมตาโพสต์ที่เกี่ยวข้องได้ฉันยินดีที่จะนับจำนวนครั้ง แต่ฉันคิดว่าเนื่องจากคุณสามารถใช้-eงานได้ฟรีเพิ่มสิ่งที่pทำให้-pe+1 ? จะอัปเดตในตอนนี้ แต่หากคุณสามารถหาแหล่งข้อมูลที่ฉันสามารถอ้างอิง / ลิงก์เพื่อดำเนินการต่อไปได้นั่นจะยอดเยี่ยมมาก!
Dom Hastings

3
@DomHastings 1 ถูกต้องตามเหตุผลที่คุณพูด + เมตาโพสต์นี้
Sp3000

ขอบคุณ @ Sp3000! ฉันไม่พบโพสต์นั้นสำหรับชีวิตของฉัน! @LeakyNun meta โพสต์สำหรับ +1ตามความคิดเห็นจาก Sp3000
Dom Hastings

แทนที่จะใช้โอเปอเรเตอร์ที่มีเงื่อนไขคุณสามารถใช้โอเปอเรเตอร์ยานอวกาศเพื่อเลือกจากรายการ: $&.qw(* - +)[$&<=>$1]ในส่วนทดแทนของs///โอเปอเรเตอร์
ninjalj

@ninjalj แน่นอน! น่าอัศจรรย์ขอบคุณ! -8 ด้วย!
Dom Hastings

1

ที่จริงแล้ว 30 ไบต์

;2@VpXdX`i-su"+*-"E`M' @o♀+εj≡

น่าเสียดายเนื่องจากคำสั่งeval ( ) ประเมินค่าตัวอักษรบน TIO เท่านั้นโปรแกรมนี้ไม่สามารถใช้งานได้กับ TIO

คำอธิบาย:

;2@VpXdX`i-su"+*-"E`M' @o♀+εj≡
;                               duplicate input
 2@V                            overlapping sublists of length <= 2
    pXdX                        discard first and last element (length-1 sublists)
        `i-su"+*-"E`M           map: for each pair of elements
         i-su                     flatten, subtract, sign, increment (results in a 0 if b < a, 1 if b == a, and 2 if b > a)
             "+*-"E               select the correct operation
                     ' @o       put a space at the beginning of the list to pad it properly
                         ♀+     pairwise addition (since addition is not defined for strings and integers, this just zips the lists and flattens the result into a single flat list)
                           εj   join with empty string
                             ≡  eval

1

R , 120 44 ไบต์

r=rle(scan());c(1,sign(diff(r$v)))%*%r$v^r$l

ลองออนไลน์!

อัลกอริทึมนั้นคล้ายกับคำตอบนี้แต่ฉันรู้ได้หลังจากเข้ารหัสโค้ดคำตอบของฉันเท่านั้น eval(parse)ดีกว่าคำตอบเดิมของฉันที่ถูกใช้

ยกระดับการปฏิบัติงานเวกเตอร์ของ R อย่างเต็มที่ - *ดำเนินการครั้งแรกโดยใช้rle(x)$values ^ rle(x)$lenghtsและจุดผลิตภัณฑ์เวกเตอร์นี้ด้วยsign( diff( rle(x)$values ) )(อิงกับ1)


1

05AB1E (ดั้งเดิม) , 17 16 15 ไบต์

ü.S…*-+sè‚ζJJ.E

-2 ไบต์ขอบคุณที่@Emigna

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

ü                  # Pair-wise loop over the (implicit) input-list
                   #  i.e. [12,0,7,7] → [[12,0],[0,7],[7,7]]
 .S                # Calculate the signum of the pair (-1 for a<b; 0 for a==b; 1 for a>b)
                   #  i.e. [[12,0],[0,7],[7,7]] → [1,-1,0]
   …*-+sè          # Index over "*-+" (with wrap-around)
                   #  i.e. [1,-1,0] → ['-','+','*']
         ‚ζ        # Zip the two lists together (appending the operands to the numbers)
                   #  i.e. [12,0,7,7] and ['-','+','*','+']
                   #   → [[12,'-'],[0,'+'],[7,'*'],[7,' ']]
           JJ      # Join them together
                   #  [[12,'-'],[0,'+'],[7,'*'],[7,' ']] → '12-0+7*7 '
             .E    # Evaluate as Python code
                   #  i.e. '12-0+7*7' → 61

1
เนื่องจากการทำดัชนีแบบแยกส่วนคุณสามารถลบได้>โดยเลื่อน+ไปยังจุดสิ้นสุดของสตริง
Emigna

@Emigna ไม่แน่ใจว่าฉันพลาดไป .. ขอบคุณ!
Kevin Cruijssen

1
คุณสามารถบันทึกไบต์อื่นได้โดยการลบĆและ¨ถ้าคุณใช้‚ζแทนø
Emigna

@Emigna โอ้ตอนนี้ฉลาดแล้ว! ขอบคุณ ฉันรู้ว่าสิ่งที่แนบมาเป็นบิตของการทำงานแปลก ๆ แต่ไม่ทราบวิธีการแก้ไข ‚ζเป็นทางเลือกที่สมบูรณ์แบบในการทำงานเนื่องจากพื้นที่ไม่ได้ถูกมองข้าม ขอบคุณอีกครั้ง. :)
Kevin Cruijssen

0

PHP, 103 ไบต์

ความท้าทายที่เรียบร้อย สิ่งนี้ยาวเกินคาด ฉันคิดว่าการใช้array_mapหรือคล้ายกันจะไม่เพิ่มจำนวนไบต์เนื่องจากฟังก์ชั่นที่ไม่ระบุชื่อยังมีราคาแพงใน PHP

foreach(fgetcsv(STDIN)as$v)(0<=$p?$o.=$p.('*-+'[($p>$v)+2*($p<$v)]):_)&&$p=$v;echo eval("return$o$v;");

เรียกใช้จากบรรทัดคำสั่งจะแจ้งให้มีรายการคั่นด้วยเครื่องหมายจุลภาคเช่น:

php array_to_math.php
12, 0, 7, 7, 29, 10, 2, 2, 1

0

PowerShell v2 +, 62 ไบต์

-join($args|%{"$o"+'*+-'[($o-lt$_)+2*($o-gt$_)];$o=$_})+$o|iex

จะเข้าเป็นอาร์กิวเมนต์บรรทัดคำสั่งพื้นที่ที่แยกออกจากกันซึ่งได้รับการแปลงเป็น $argsarray เราวนซ้ำแต่ละองค์ประกอบโดยใช้ตัวแปรตัวช่วย$oแต่ละการวนซ้ำเพื่อจดจำสิ่งที่รายการก่อนหน้าของเราคือ เราใช้สตริงที่จัดทำดัชนีเพื่อดึงตัวดำเนินการที่เหมาะสมออกมาโดยดำเนินการทางคณิตศาสตร์กับค่าบูลีนที่แปลงโดยปริยาย (เช่นหากรายการก่อนหน้านี้มีขนาดเล็กลงการ[]ประเมิน1+2*0จึง'*+-'[1]หมายถึงการ+เลือก)

สตริงที่ต่อกันถูกปล่อยไว้บนไพพ์ไลน์ เราเก็บรวบรวมทั้งหมดของตัวอย่างเหล่านั้นเข้าด้วยกัน (เช่น3-, 1+, 4-ฯลฯ ) มี-joinการดำเนินงาน concatenate กับจำนวนสุดท้าย (แปลงโดยปริยายสตริง) และท่อมันiex(นามแฝงสำหรับInvoke-Expressionและคล้ายกับeval)


ข้อกังวลคือถ้าผู้เรียกได้รับค่า $ oa (พูด $ o = 999) ดังนั้นนิพจน์ในรายการนี้จะไม่คำนวณค่าที่ถูกต้อง จำเป็นต้องเพิ่มการกำหนดค่าเริ่มต้นของ $ o ให้กับโซลูชันนี้
Bevo

@Bevo นี่มีวัตถุประสงค์เพื่อให้เป็นสคริปต์แบบเต็มเรียกใช้ผ่านบรรทัดคำสั่งไม่ใช่ฟังก์ชันหรือผ่านเชลล์แบบโต้ตอบ ส่วนใหญ่ของการส่งของฉันเป็นเช่นนี้เนื่องจากในสถานการณ์ดังกล่าวไม่มีตัวแปรที่กำหนดไว้ล่วงหน้าที่ต้องกังวลเกี่ยวกับและทำให้รหัสสามารถสั้นลงเล็กน้อย
AdmBorkBork

0

Japt 25 ไบต์

ต้องการตัดให้สั้นกว่านี้ แต่ฉันไม่สามารถทำให้รุ่นที่ใช้งานได้น้อยลง

S+Uä!- ®"*+-"gZÎì)íU
OxU

ลองออนไลน์!


รับลงไปที่22 ไบต์แต่ก็ยังคิดว่ามันสามารถปรับปรุงได้
ปุย

0

Japt -x , 21 19 ไบต์

änJ f mÎí*Uò¦ ®ÎpZÊ

ลองมัน


คำอธิบาย

                        :Implicit input of array U
  J                     :Prepend -1
än                      :Get deltas
    f                   :Filter (remove 0s)
      m                 :Map
       Î                : Signs
        í               :Interleave
          U             :  Original input
           ò            :  Partition on
            ¦           :   Inequality
              ®         :  Map each sub-array Z
               Î        :    Get first element
                p       :    Raise to the power of
                 ZÊ     :     Length of Z
         *              :Reduce each pair of elements by multiplcation
                        :Implicitly reduce by addition and output
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.