怪しいものよりも大きい


45

小なり記号と大なり記号(<>)の長さNの文字列を指定して、すべての不等式が満たされるように、記号の各ペアの開始と終了、および各ペアの間に整数0〜Nを挿入します。結果の文字列を出力します。有効な出力が複数ある場合は、いずれか(および1つだけ)を出力します。

例えば

<<><><<

は7文字なので、0から7までのすべての数字を挿入する必要があります。有効な出力は

2<3<4>1<5>0<6<7

なぜなら、すべての不等式が一度に一つずつとられたからです

2<3
3<4
4>1
1<5
5>0
0<6
6<7

本当です。

必要に応じて、出力に記号を囲むスペースを含めることができます2 < 3 < 4 > 1 < 5 > 0 < 6 < 7

バイト単位の最短コードが優先されます。

テストケース

空の行の後の最初の行は入力であり、次の行はそれぞれ有効な出力例です。

[empty string]
0

<
0<1

>
1>0

<<
0<1<2

<>
1<2>0

><
1>0<2
2>0<1

>>
2>1>0

<<<
0<1<2<3

><>
1>0<3>2

>><
3>2>0<1
3>1>0<2
2>1>0<3

>>>
3>2>1>0

>>><<<
3>2>1>0<4<5<6
6>3>1>0<2<4<5
4>2>1>0<3<5<6
4>3>1>0<2<5<6

<<><><<
2<3<4>1<5>0<6<7

>><><>>
7>6>0<5>1<4>3>2

<<<<<<<<<<<<<<
0<1<2<3<4<5<6<7<8<9<10<11<12<13<14

>><<<<><>><><<
6>5>4<7<8<9<10>3<11>2>1<12>0<13<14
14>5>4<7<8<9<10>3<11>2>1<12>0<13<6

4
常に有効な出力がありますか?
mbomb007

3
@ mbomb007はい。常に少なくとも1つあります。
カルビンの趣味

23
誰かがこのプログラムを> <>で見たいです!それは素晴らしいでしょう(そして皮肉なことでしょうか?)
Soren

これは本当に楽しい単に挑戦、感謝のOPだった
ショーン・ワイルド

回答:


29

網膜、20バイト

バイトカウントはISO 8859-1エンコードを前提としています。


$.'
S`>
%O#`\d+
¶
>

オンラインでお試しください!(最初の行は、改行で区切られたテストスイートを有効にします。)

説明

有効な順列を見つける簡単な方法は、toから0toまでの数字Nを順番に挿入してから、>sの各部分文字列を囲む数字を逆にすることです。<><<>>><<例として考えてみましょう:

0<1>2<3<4>5>6>7<8<9
  ---   -------      these sections are wrong, so we reverse them
0<2>1<3<7>6>5>4<8<9

Retinaでは、これらのタスクはどちらも非常に単純ですが、実際に作業できるのは文字列だけです。代わりに数字をN下から下に挿入し、0周囲のセクションを逆にすることで追加のバイトを節約できます<が、原理は同じです。

ステージ1:置換


$.'

入力のすべての可能な位置に$'(サフィックス、つまり一致のすべて)の長さを挿入することから始めます。これにより、数字がからに挿入Nされ0ます。

ステージ2:分割

S`>

入力>を別々の行に分割します。そのため、各行は個々の数字またはで結合され<た数字のリストのいずれかです。

ステージ3:並べ替え

%O#`\d+

各行(%)内でO、数値(\d#)を数値()でソートします(#)。番号を逆の番号順に挿入したため、これはそれらを逆にします。

ステージ4:置換

¶
>

>すべてを単一の行に戻すために、ラインフィードを再び変換します。それでおしまい。

補足として、私は%改行以外の区切り文字に適用する方法を追加することを意味してきました。すでにそれを行っていた場合、最後の3つのステージが1つのステージに縮小されていたため、この送信は14バイトでした。

%'>O#`\d+

それは私のサイズの8分の1のようにどうですか?よくやった。
ThreeFx

@ThreeFx私はブルートフォースを使用しないため。;)説明はすぐに来ます。
マーティンエンダー


21

> <>、26 + 4 = 30バイト

l22pirv
1+$2po>:3%::2g:n$-

オンラインでお試しください!-s=フラグに+4バイト- -s大丈夫な場合(空の入力のためにフラグを完全に削除する必要があることを意味します)、代わりに+3になります。

STDIN入力が空でありi、-1 が生成されると想定します(EOF で生成されます)。プログラムは、この-1を文字として印刷しようとしてエラーになります。

max-of-nums-so-far-for- >、min-of-nums-so-far-for-の<アプローチを使用します。

[Setup]
l22p         Place (length of stack) = (length of input) into position (2, 2) of
             the codebox. Codebox values are initialised to 0, so (0, 2) will
             contain the other value we need.
i            Push -1 due to EOF so that we error out later
r            Reverse the stack
v            Move down to the next line
>            Change IP direction to rightward

[Loop]
:3%          Take code point of '<' or '>' mod 3, giving 0 or 2 respectively
             (call this value c)
:            Duplicate
:2g          Fetch the value v at (c, 2)
:n           Output it as a number
$-1+         Calculate v-c+1 to update v
$2p          Place the updated value into (c, 2)
o            Output the '<' or '>' as a char (or error out here outputting -1)

正常に終了し、STDINを想定していないプログラムは、4バイト余分です:

l22p0rv
p:?!;o>:3%::2g:n$-1+$2


11

Perl、29バイト

+2を含む -lp

STDINで入力して実行します。例えば

order.pl <<< "<<><><<"

出力:

0<1<7>2<6>3<4<5

order.pl

#!/usr/bin/perl -lp
s%%/\G</?$a++:y///c-$b++%eg

説明

文字列の長さで始まる最大値、0で始まる最小値の2つのカウンタがあります。その後、各境界(文字列の開始と終了を含む)で<最小値を置く直前に1を増やし、そうでない場合は最大値を入れて減らす1ずつ


s{}{/\G/...}私は前に見たことがない、それは素晴らしいです。
プリモ

10

Python 2、67バイト

f=lambda s,i=0:s and`i+len(s)*(s>'=')`+s[0]+f(s[1:],i+(s<'>'))or`i`

再帰関数。xに対して最小の未使用値をx<最大に使用することにより、各演算子を順番に満たしますx>。最小の未使用値はに格納iおよび更新され、最大の未使用値はi残りの長さから推測されます。


1
バイトを保存する(s>'=')代わりにできると思います(s>='>')か?
mathmandan

@mathmandanありがとう!それは奇妙で<>連続したコードポイントではありません。
xnor

同意した!しかし=<との間にあることがどのように理にかなっているのかがわかると思い>ます。
mathmandan

8

Python 2、163 137バイト

from random import*
def f(v):l=len(v)+1;N=''.join(sum(zip(sample(map(str,range(l)),l),v+' '),()));return N if eval(N)or len(v)<1else f(v)

ステートメントがに評価されるまで、数字をシャッフルしますTrue

それを試してみてください。


これは明らかに、すべての答えの中で最も賢明です。
moopet

7

APL、33バイト

⍞←(S,⊂''),.,⍨-1-⍋⍋+\0,1-2×'>'=S←⍞

⍋⍋ 異常に便利です。

説明

⍞←(S,⊂''),.,⍨-1-⍋⍋+\0,1-2×'>'=S←⍞
                                   ⍞ read a string from stdin      '<<><><<'
                                 S←   store it in variable S
                             '>'=     test each character for eq.   0 0 1 0 1 0 0
                         1-2×         1-2×0 = 1, 1-2×1 = ¯1         1 1 ¯1 1 ¯1 1 1
                                      (thus, 1 if < else ¯1)
                       0,             concatenate 0 to the vector   0 1 1 ¯1 1 ¯1 1 1
                     +\               calculate its running sum     0 1 2 1 2 1 2 3
                   ⍋                 create a vector of indices    1 2 4 6 3 5 7 8
                                      that sort the vector in
                                      ascending order
                 ⍋                   do it again: the compound ⍋⍋ 1 2 5 3 6 4 7 8
                                      maps a vector V to another
                                      vector V', one permutation of
                                      the set of the indices of V,
                                      such that
                                            V > V  => V' > V'.
                                             i   j     i    j
                                      due to this property, V and V'
                                      get sorted in the same way:
                                          ⍋V = ⍋V' = ⍋⍋⍋V.
              -1-                     decrement by one              0 1 4 2 5 3 6 7
      ⊂''                            void character vector         ⊂''
    S,                                concatenate input string     '<<><><<' ⊂''
   (     ),.,⍨                       first concatenate each        0 '<' 1 '<' 4 '>' 2 \
                                     element of the result vector  '<' 5 '>' 3 '<' 6 '<' \
                                     with the cordisponding        7 ⊂''
                                     element in the input string,
                                     then concatenate each result
⍞←                                  write to stdout

3
クリスマスツリー(⍋⍋)は何をしますか?
コナーオブライエン

グレードアップで、ソートされた順序でインデックスを返します。2回実行すること1で、最も小さい数字が2どこにあるか、次に小さい数字がどこにあるかなどを知ることができます。
ツヴァイ

@ ConorO'Brienは簡単な説明で編集しました。
オベロン

はい、非常に短い._。
コナーオブライエン

7

JavaScript(ES6)、74 56バイト

s=>s.replace(/./g,c=>(c<'>'?j++:l--)+c,j=0,l=s.length)+j

数字のセットで始まります0...N。各段階で、残りの数の最大(l)または最小(j)を単純に取得します。定義により、次の数はそれよりも小さいか大きい必要があります。編集:@Arnauldのおかげで、18バイトを大幅に節約しました。


3
使用できますreplaceか?たぶんs=>s.replace(/./g,c=>(c<'>'?j++:l--)+c,j=0,l=s.length)+j
アーナルド

@Arnauld ...と私はゴルフにも(で交換に従順ではなかった私の最初の試みをしていたと思ったreplace... 74バイトまで)ダウン
ニール・

5

Pyth-19バイト

比較連鎖のための万歳!

!QZhv#ms.idQ.p`Mhl

eval安全性のオンラインcuz動作しません。


4

2sable、20 バイト

gUvy'<Qi¾¼ëXD<U}y}XJ

説明

gU                     # store input length in variable X
  v              }     # for each char in input
   y'<Qi               # if current char is "<"
        ¾¼             # push counter (initialized as 0), increase counter
          ëXD<U}       # else, push X and decrease value in variable X
                y      # push current char
                  XJ   # push the final number and join the stack

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

以下のためにN <10これは14のバイトだったかもしれません。

ÎvyN>}J'<¡í'<ý

4

C#、102 99バイト

string f(string s){int i=0,j=s.Length;var r="";foreach(var c in s)r=r+(c<61?i++:j--)+c;return r+i;}

ゴルフをしていない:

string f(string s)
{
    int i = 0, j = s.Length;    // Used to track the lowest and highest unused number.
    var r = "";                 // Start with the empty string.

    foreach (var c in s)        // For each character in the input string:
        r = r +                 // Append to the result:
            (c < 61             // If the current character is '<':
                ? i++           // Insert the lowest unused number,
                : j--)          // otherwise, insert the highest unused number.
            + c;                // And append the current character.

    return r + i;               // Return the result with the last unused number appended.
}

私は疲れているので、何かが足りないかもしれませんが、r = r +部品を複合割り当てに変更して数バイト節約しませんか?
発がん性物質

2
いいえ- r+右側の部分はコンパイラーに全体が文字列であることを伝えるため、文字列表現cが使用されます。を使用したr+=場合、?:パーツはに評価されint、の序数値cがそれに追加され、その後でのみ文字列表現に変換されます。
Scepheo

4

Java 8、126 125バイト

s->{int t=s.replaceAll("<","").length(),y=t-1;String r=t+++"";for(char c:s.toCharArray())r+=(c+"")+(c<61?t++:y--);return r;};

これでもうまくいくとは思わない

ゴルフをしていないテストプログラム

public static void main(String[] args) {
    Function<String, String> function = s -> {
        int t = s.replaceAll("<", "").length(), y = t - 1;
        String r = t++ + "";
        for (char c : s.toCharArray()) {
            r += (c + "") + (c < 61 ? t++ : y--);
        }
        return r;
    };

    System.out.println(function.apply("<<><><<"));
    System.out.println(function.apply(">>><<<"));
    System.out.println(function.apply(">>>"));
    System.out.println(function.apply("<<<"));
    System.out.println(function.apply(">><><>>"));
}

toを変更し.replaceAll.replace括弧を削除すると、(c+"")5バイト節約できます。
ケビンCruijssen 16

@KevinCruijssen約5バイトの笑いはありません。
ショーンワイルド

適切なゴルフ言語を使用する場合、5バイトは5位と2位の差です。javaでは、最後の場所と最後の場所との違いになります。
ショーンワイルド

Javaは、ほとんどの場合、コードゴルフの課題で最後になりますが、最初にJavaの回答を投稿する理由は、できる限り短く記述する楽しみのためです。Javaコードがバイト単位で500から499になれば、個人的にはすでに満足しています。; P
ケビンクルイッセン

私たちは、基本的には競合他社の上にすべてを無視して、単にと競合またはJava / C#の提出など。
ショーン・ワイルド

4

ゼリー27 14 12 バイト

@Martin Enders CJamソリューションのポート
-@Dennisのおかげで2バイト

żJ0;µFṣ”<Uj”<

TryItOnlineでテストする

どうやって?

żJ0;Fṣ”<Uj”< - main link takes an argument, the string, e.g. ><>
 J           - range(length(input)), e.g. [1,2,3]
  0          - literal 0
   ;         - concatenate, e.g. [0,1,2,3]
ż            - zip with input, e.g. [[0],">1","<2",">3"]
    F        - flatten, list, e.g. "0>1<2>3"
      ”<  ”< - the character '<'
     ṣ       - split, e.g. ["0>1","2>3"]
        U    - upend (reverse) (implicit vectorization), e.g. ["1>0","3>2"]
         j   - join, e.g. "1>0<3>2"

以前の方法は数学的には興味深いものでしたが、それほどゴルフではありませんでした...

=”>U
LR!×ÇĖP€S‘
L‘ḶŒ!ị@ÇðżF

これは、階乗ベースシステムを使用して、方程式を満たす[0、N]の順列のインデックスを見つけます。


1
Uベクトル化するので、必要ありませんżJ0;別のバイトを保存します。
デニス

4

Clojureは、152の 132 126バイト

(defn f[s](loop[l 0 h(count s)[c & r]s a""](if c(case c\<(recur(inc l)h r(str a l c))(recur l(dec h)r(str a h c)))(str a l))))

できるだけ多くの空白を削除することで、かなりのバイト数を節約しました。括弧を別の文字から分離するのに空白は必要ないことに気付きました。

基本的に@Scepheoの答えのClojureポートです。同じように動作します。

それらのrecur呼び出しはキラーです!私は原子を使ってそれをきれいにすることができたと思います。swap!呼び出しは、カウントに追加の原子を使用するために必要:/

数バイト節約してくれた@amalloyに感謝します。

ゴルフをしていない:

(defn comp-chain [chain-str]
  (loop [l 0 ; Lowest number
         h (count chain-str) ; Highest number
         [c & cr] chain-str ; Deconstruct the remaining list
         a ""] ; Accumulator
    (if c ; If there's any <>'s left
      (if (= c \<) ; If current char is a <...
        (recur (inc l) h cr (str a l c)) ; Add l to a, and inc l
        (recur l (dec h) cr (str a h c))) ; Add h to a, and dec h
      (str a l)))) ; Add on the remaining lowest number, and return

サイトへようこそ!
DJMcMayhem

@DJMcMayhemありがとう。うまくいけば、次回は別の答えを移植するのではなく、自分の解決策を考え出すことができます。
発がん物質

あなたには、さらに2つのスペースを節約することができますloop前に、結合sして後aifツリーをcase:に置き換えることで少し剃ることもできます(case c \< (recur ...) nil (str ...) (recur ...))。そして、もちろんcr短い名前にすることもできます。
アマロイ16

@amalloy良い点、ありがとう。ラップトップに乗ったら更新します。
発がん性物質16

3

Haskell、162バイト

import Data.List
(a:b)%(c:d)=show c++a:b%d
_%[x]=show x
f l=map(l%).filter(l#)$permutations[0..length l]
(e:f)#(x:y:z)=(e!x)y&&f#(y:z)
_#_=0<1
'>'!x=(>)x
_!x=(<)x

これは長く続く。


3

Perl(107 + 1で-p)108

for$c(split''){$s.=$i++.$c;}
for$b(split'<',$s.$i){$h[$j]=join'>',reverse split'>',$b;$j++;}
$_=join'<',@h;

マーティン・エンダー♦の答えから盗まれたアルゴリズム


2

ルビー、135バイト

g=gets
puts g.nil?? 0:[*0..s=g.size].permutation.map{|a|a.zip(g.chars)*""if s.times.map{|i|eval"%s"*3%[a[i],g[i],a[i+1]]}.all?}.compact

注:時間の複雑さは大きい(O(n!))。


2

Python 2、176 172バイト

他に比べてそれほど短いものではありませんが、すぐに解決できてうれしいです。

from itertools import*
def f(s):
 for p in permutations(range(len(s)+1)):
    n=list(s);p=list(p);t=[p.pop()]+list(chain(*zip(n,p)));r="".join(map(str,t))
    if eval(r):return r

オンラインで試す

ゴルフをしていない:

from itertools import*
def f(s):
    n=list(s);R=range(len(s)+1)
    for p in permutations(R):
        p=list(p)
        r=[p.pop()]
        t=n+p
        t[::2]=n
        t[1::2]=p
        r="".join(map(str,r+t))
        if eval(r):return r

オンラインで試す


インターレース部分をより短くすることができますzip
Maltysen

@Maltysen短いリストではありません。リストの長さは同じではありません(まだ必要ですpop)が、少し短くなっています。の場合N<10、文字列を短くすることができます。
mbomb007

1

PHP、190バイト

有効な解が存在するまでランダムシャッフル

$x=range(0,$l=strlen($q=$argv[1]));while(!$b){$b=1;$t="";shuffle($x);for($i=0;$i<$l;){$t.=$x[$i].$q[$i];if(($q[$i]==">"&$x[$i]<$x[$i+1])|($q[$i]=="<"&$x[$i]>$x[1+$i++]))$b=0;}}echo$t.$x[$i];

381バイトですべてのソリューションを取得し、1つを選択

<?php $d=range(0,strlen($q=$argv[1]));echo $q."\n";$e=[];function f($t=""){global$e,$d,$q;foreach($d as$z){preg_match_all("#\d+#",$t,$y);if(in_array($z,$y[0]))continue;$p=preg_match_all("#[<>]#",$t);$g="";if(preg_match("#\d+$#",$t,$x)){if(($q[$p]==">"&$x[0]<$z)|($q[$p]=="<"&$x[0]>$z))continue;$g=$q[$p];}strlen($q)==$p+1|!$q?$e[]=$t.$g.$z:f($t.$g.$z);}}f();echo$e[array_rand($e)];
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.