多かれ少なかれ出力数


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

>and 以外の記号を使用できます<か?
エリックアウトゴルファー

@JonathanAllan間違っているのは例だと思うので、答えるときは仕様が間違っているとではなく、仮定する必要があります。編集:まあ、それはテストケースではなくチャレンジを定義する仕様であるため、無効だと思います。
エリックアウトゴルファー

4
<> <で答えを待つだけです。
クルドラエセスナバルヤ

1
例をごちゃごちゃにしたことを皆に大謝罪します!他のキャラクターについては、あなたの言語で同じ意味を持っていることを条件としてはい
-simonalexander2005

3
@Scroobleスペルが間違っています。それは><>
ジョーキング

回答:


3

ゼリー、19バイト

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

オンラインでお試しください!

各数値の値であるMAX(>それのすぐ右に多数の<それのすぐ左に)+ 1


または...

オンラインでお試しください!


私は、Staxのようなプログラムをトランスパイルする必要のある言語が好きではありません...まあ、Jellyは境界線です。(文字列を圧縮するプログラムが必要です)少なくとも、Jellyが勝ちます。
user202729


審美的には、私もそれが好きではありません。しかし、私がゴルフ言語で最も気に入っているのは、プログラムを最小化できるものです。私はまだこれについてスタックスのいくつかのアイデアを持っています
再帰的

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しなかっただろう。)
ケビンクルーイッセン

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

オンラインでお試しください!

スクランブル解除:

# 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
これは私の最初のゴルフです!
フォンズ

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それが関数そのものです。これは無点関数なので、基本的に最初の引数としてcall %with 2を言います。
ポストロックガーフハンター

これは、完全なmain実装を追加する代わりに、最後の行に最後の関数呼び出しを置くだけの一般的な慣習ですか?
シラキュース

1
@siracusaはい。提出は、名前付き関数、匿名関数、または完全なプログラムとして許可されます。これは匿名関数です。最短だからという理由だけで匿名を選びます。
ポストロックガーフハンター

@siracusa Haskellのゴルフ規則ガイドをご覧ください。
ライコニ

4

Retina 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

整数を合計し、10進数に変換します。


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

スタックス、21 バイト

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

実行してデバッグする

入力をランレングスでエンコードし、生成された範囲を連結することで機能します。開梱されていない、コメントされていない、これはこのように見えます。

|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

これを実行する



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.