จำนวนเอาต์พุตไม่มากก็น้อย


15

ความท้าทาย

รับสายป้อนข้อมูล (หรืออาร์เรย์) ประกอบด้วย<และ>ส่งออกลำดับ (อาร์เรย์หรือสตริง) ของจำนวนเต็มเช่นนั้น:

  • ผู้ประกอบการทั้งหมดถูกต้องเมื่อนำมาใช้ในการสั่งซื้อระหว่างหมายเลขติดต่อกันในการส่งออก
  • จำนวนเต็มทั้งหมดเป็นค่าบวก (1 หรือมากกว่า)
  • ผลรวมของจำนวนเต็มมีขนาดเล็กเท่าที่เป็นไปได้ทางคณิตศาสตร์

ข้อมูลที่ป้อนอาจแตกต่างกันเพื่อให้ตรงกับ "มากกว่า" และ "น้อยกว่า" ในภาษาที่คุณเลือก

ในฐานะที่เป็นทางเลือกเอาท์พุทเพียงแค่ระบุผลรวมของตัวเลขในการส่งออก ระบุเวอร์ชันที่คุณกำลังแก้ไขในชื่อคำตอบของคุณ

ใช้การยกเว้นและกฎตามปกติไบต์ที่เล็กที่สุดชนะ

คุณสามารถสันนิษฐานได้ว่าสตริงอินพุตจะไม่นำไปสู่การล้นจำนวนเต็มในภาษาของคุณหากเป็นเช่นนั้น

ตัวอย่าง

  • >ให้2 1ผลรวมที่3
  • >>>ให้4 3 2 1ผลรวมที่10
  • ><ให้2 1 2ผลรวมที่5
  • ให้1ผลรวมที่1
  • >>>>>>>>>ให้10 9 8 7 6 5 4 3 2 1ผลรวมที่55
  • >><<>><>>>ให้3 2 1 2 3 2 1 4 3 2 1ผลรวมที่24
  • ><>><>><>ให้2 1 3 2 1 3 2 1 2 1ผลรวมที่18
  • <<<<>ให้1 2 3 4 5 1ผลรวมที่16
  • <<<<><<>ให้1 2 3 4 5 1 2 3 1ผลรวมที่22
  • >><<ให้3 2 1 2 3ผลรวมที่11

เราสามารถใช้สัญลักษณ์อื่น ๆ กว่า>และ<?
Erik the Outgolfer

@JanathanAllan ฉันคิดว่ามันเป็นตัวอย่างที่ผิดและคุณควรถือว่าเมื่อตอบไม่ใช่ว่า spec นั้นผิด แก้ไข: ดีแล้วฉันกลัวว่าพวกเขาจะไม่ถูกต้องเนื่องจากเป็นข้อมูลจำเพาะที่กำหนดความท้าทายไม่ใช่กรณีทดสอบ
Erik the Outgolfer

4
แค่รอคำตอบใน <> <
Khuldraeseth na'Barya

1
ขอโทษอย่างมากสำหรับทุกคนที่ทำตัวอย่างให้วุ่นวาย! สำหรับตัวละครอื่น ๆ ใช่หากพวกเขามีความหมายเหมือนกันในภาษาของคุณ
simonalexander2005

3
@Scoboble คุณสะกดผิด มันคือ><>
Jo King

คำตอบ:


3

เยลลี่ขนาด 19 ไบต์

0;+×¥@\
=”<µCṚÇṚ»Ç‘

ลองออนไลน์!

ค่าของแต่ละหมายเลขคือmax (จำนวน>ทันทีไปทางขวาของมัน,จำนวน<ทันทีที่ด้านซ้ายของมัน) + 1


หรืออีกทางหนึ่ง ...

ลองออนไลน์!


ฉันไม่ชอบภาษาที่ต้องการให้โปรแกรม transpile เช่น Stax ... ก็ดี Jelly เป็นแนวเขต (ต้องใช้โปรแกรมในการบีบอัดสตริง) อย่างน้อยที่สุด Jelly ยังคงชนะอยู่
user202729


ฉันไม่ชอบมันมาก แต่สิ่งที่ฉันชอบที่สุดในภาษากอล์ฟคืออะไรก็ตามที่ทำให้โปรแกรมเล็กที่สุด ฉันยังคงมีความคิดไม่กี่สำหรับสแตกซ์เกี่ยวกับเรื่องนี้ ...
recursive

8

> <> , 40 38 ไบต์

1v!rnr~<oa
?\i:0(?^3%\+$
{/?:-{:}-1/1:

ลองออนไลน์!

ภาษาที่เหมาะสม สำหรับการอ้างอิง><>ตัวเองผลผลิต 2,1,2,1

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

1v   Initialise the stack as 1 and enter loop
 \i:0(?^  If we're out of input, go to the first line
        3%\ Otherwise mod the input by 3, yielding 0 for < and 2 for >
        -1/Subtract 1 to get -1 and 1 respectively
    -{:}   Copy the previous number and subtract the above from it

 /?:    If the number is not 0, repeat the loop

?\        \+$  Otherwise:
                Increment each number until we reach the original 0
{/        /1:   And enter the first loop again

      ~<    When we're out of input, pop the extra -1 from EOF
   rnr      Output the first number
1v!         Push a 1 
        oa  Print a newline and repeat, popping the extra 1 each time

+1 สำหรับระบุว่าภาษานั้นมีคุณค่ามากน้อยเพียงใด :) (และเพราะมันเป็นเพียงคำตอบที่ดีเช่นกันมิฉะนั้นฉันจะไม่มี +1 เลย)
Kevin Cruijssen

5

Python 3, 93 ไบต์

k=0
for r in input().split('<'):p=len(r);print(max(k,p)+1,*range(p,0,-1),end=' ');k=1+(p<1)*k

ลองออนไลน์!

unscrambled:

# offset, will be explained later
k = 0 
for run in input().split('<'):
    # p = length of sequence of '>'s, which will produce p+1 decreasing integers
    p = len(run)
    # will print:
    # p+1 p p-1 ... 1    or    k+1 p p-1 ... 1
    print(max(k, p) + 1, *range(p, 0, -1), end=' ')
    # offset of the next sequence: (i.e. -1 + the minimal value of the first integer)
    k = 1 + (k if p > 0 else 0)

1
นี่คือสนามกอล์ฟครั้งแรกของฉัน!
Fons

5

Haskell , 119 ไบต์

n%">"=r[1..n]
n%"<"=[1..n]
n%(c:b)|c==b!!0=(n+1)%b|a:s<-2%b,e:z<-r$n%[c]=r z++last(max:[min|c>'<'])a e:s
r=reverse
(2%)

ลองออนไลน์!

คำอธิบาย

ความคิดที่นี่คือว่าเรามี>s หรือ<s ซึ่งแต่ละแผนที่จะขึ้นและลงจากช่วง ดังนั้นเราจึงใช้groupในการแบ่งสตริงออกเป็นกลุ่มของตัวละครที่ต่อเนื่องกัน งานของเราคือการต่อสิ่งเหล่านี้เข้าด้วยกันอย่างเหมาะสม

เมื่อเรามี<>เราต้องการที่จะต่อสองรายการเข้าด้วยกันโดยใช้ค่าสิ้นสุดที่ใหญ่ขึ้น

<<<<<<>>

ถูกแยก

<<<<<<  >>

แมปกับช่วง

[1,2,3,4,5,6,7] [3,2,1]

จากนั้นเมื่อเราต่อตะเข็บเราจะตกลง3เพราะมันมีขนาดเล็กกว่า ( 3ไม่ใหญ่กว่า7)

 [1,2,3,4,5,6,7,2,1]

เมื่อเรามี ><ทำสิ่งที่ตรงกันข้ามเราจะทิ้งค่าที่มากขึ้น

%รหัสจริงบรรลุนี้โดยการดำเนินการ คำจำกัดความของ%ค่อนข้างซับซ้อน แต่โดยทั่วไปแล้วจะอ่านจากซ้ายไปขวาคอยติดตามจำนวนตัวอักษรที่ต่อเนื่องกันเท่ากัน ในด้านซ้ายมีค่าของตัวดำเนินการ เมื่อเราไปถึงสถานที่ซึ่งตัวละครเปลี่ยนไปเราก็ทำการเย็บตามที่อธิบายไว้


จุดประสงค์ของบรรทัดสุดท้าย(2%)คืออะไร
siracusa

@siracusa นั่นคือฟังก์ชั่นของตัวเอง มันเป็นฟังก์ชั่นที่ไร้จุดหมายดังนั้นโดยพื้นฐานแล้วมันบอกว่าการโทร%ด้วย2เป็นอาร์กิวเมนต์แรก
โพสต์ร็อคกา

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

1
@siracusa ใช่ อนุญาตให้ส่งเป็นชื่อฟังก์ชั่นฟังก์ชั่นที่ไม่ระบุชื่อหรือเป็นโปรแกรมที่สมบูรณ์ นี่คือฟังก์ชั่นที่ไม่ระบุชื่อ ฉันเลือกนิรนามเพราะมันสั้นที่สุด
โพสต์ร็อคกา

@siracusa ดูของเราคู่มือกฎกอล์ฟใน Haskell
Laikoni

4

เรติน่า 0.8.2 , 36 ไบต์


1
{`\b(1+)>\1
1$&
}`(1+)<\1\b
$&1
1

ลองออนไลน์! ลิงก์มีกรณีทดสอบ คำอธิบาย:


1

แทรก1s ก่อนระหว่างและหลัง<s และ>s

{`\b(1+)>\1
1$&
}`(1+)<\1\b
$&1

เพิ่มจำนวนเต็มซ้ำหลาย ๆ ครั้งจนกว่าการเปรียบเทียบทั้งหมดจะเป็นที่พอใจ

1

รวมจำนวนเต็มและแปลงเป็นทศนิยม


3

Java 10, 198 181 ไบต์

s->{var p=s.split("(?<=(.))(?!\\1)");int l=p.length,L[]=new int[l],i=l,r=0,a,b;for(;i-->0;r+=a*-~a/2-(i<l-1?p[i].charAt(0)<61?a<(b=L[i+1])?a:b:1:0))a=L[i]=p[i].length()+1;return r;}

ลองออนไลน์

คำอธิบาย:

s->{                      // Method with String parameter and integer return-type
  var p=s.split("(?<=(.))(?!\\1)");
                          //  Split the String into parts
                          //  (i.e. ">><<>><>>>" becomes [>>, <<, >>, <, >>>])
  int l=p.length,         //  Get the amount of parts
      L[]=new int[l],     //  Create an integer-array of the same size
      i=l,                //  Index-integer, starting at this size
      r=0,                //  Result-integer, starting at 0
      a,b;                //  Two temp integers to reduce the byte-count
  for(;i-->0;             //  Loop downwards over the array; range: (`l`,0]
      ;r+=                //    After every iteration: increase the result with:
          a*-~a/2         //     The triangle number of the current item
        -(i<l-1?          //     If it's not the last item:
           p[i].charAt(0)<61?
                          //      And the order of the current and previous is "<>":
            a<(b=L[i+1])? //       If the current item in `L` is smaller than the previous:
             a            //        Subtract the current item
            :             //       Else (the current is equal or larger than the previous):
             b            //        Subtract the previous item
           :              //      Else (the order of the two parts is "><" instead):
            1             //       Subtract 1
          :               //     Else (it's the last item in `L`):
           0))            //      Leave the result `r` unchanged
    a=L[i]=               //   Set both `a` and the current item in `L` to:
     p[i].length()+1;     //    The length of the part + 1
  return r;}              //  Return the result


2

Stax , 21 ไบต์

éda╓~/└↨☺∟╒←║ç Γφ5←9h

เรียกใช้และแก้ไขข้อบกพร่อง

มันทำงานได้โดยการเข้ารหัสความยาวของการป้อนข้อมูลจากนั้นทำการเชื่อมต่อช่วงที่สร้างขึ้นพร้อมกัน คลายกล่อง ungolfed และแสดงความคิดเห็นมันมีลักษณะเช่นนี้

|R      run-length encode
{       begin block
  H^R   range from [1 .. run length]
  _hh|1 -1 ** (character code / 2)
  *     multiply run; this will reverse it iff character is '>'
m       map runs using preceding block
O       push a 1 under the top of stack
{       begin block
  h|M   get the start of the generated range, and take max of it and top of stack
  _DE   push the rest (tail) of the generated range to the stack
F       foreach generated range
L|+     sum of all values on the stack

เรียกใช้อันนี้


2

Perl 5 -p , 53 ไบต์

#!/usr/bin/perl -p
s//1/g;1while s/(?=\b(1+)>\1)|(1+)<\2\b\K/1/;$_=y/1//

ลองออนไลน์!


1
ดูเหมือนว่าคำตอบนี้จะถูกนำไปใช้โดยอ้างอิงจากกรณีทดสอบแทนที่จะเป็นข้อมูลจำเพาะของความท้าทาย แต่น่าเสียดายที่พวกเขาได้รับการระบุว่าไม่ถูกต้อง
Erik the Outgolfer

1
@EriktheOutgolfer แก้ไข
Ton Hospel

1

สีแดง 185 ไบต์

func[s][repeat n 1 + length? s[l: 0 i: n - 1 while[i > 0 and(s/(i) = #"<")][i:  i - 1 l: l + 1]r: 0 i: n while[(i <= length? s)and(s/(i) = #">")][i: i + 1 r:
r + 1]prin[1 + max l r""]]]

หลังจากคำอธิบายของ user202729 ...

ลองออนไลน์!

f: func[s][
   repeat n 1 + length? s[
       l: 0
       i: n - 1
       while [i > 0 and (s/(i) = #"<")][ 
           i: i - 1
           l: l + 1
        ]
        r: 0
        i: n
        while [(i <= length? s) and (s/(i) = #">")][
            i: i + 1
            r: r + 1
        ]
        prin[1 + max l r ""]
    ]
]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.