Lớn hơn ít hơn lớn hơn một cái gì đó tanh


45

Cho một chuỗi N có độ dài nhỏ hơn và lớn hơn dấu ( <, >), chèn các số nguyên từ 0 đến N ở đầu và cuối và ở giữa mỗi cặp dấu sao cho tất cả các bất đẳng thức đều được thỏa mãn. Xuất chuỗi kết quả. Nếu có nhiều đầu ra hợp lệ, hãy xuất bất kỳ một (và chỉ một) trong số chúng.

Ví dụ

<<><><<

có 7 ký tự, vì vậy tất cả các số từ 0 đến 7 đã bao gồm phải được chèn. Một đầu ra hợp lệ là

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

bởi vì tất cả các bất đẳng thức thực hiện cùng một lúc

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

là sự thật

Nếu muốn, đầu ra có thể có khoảng trắng xung quanh các dấu hiệu, ví dụ 2 < 3 < 4 > 1 < 5 > 0 < 6 < 7.

Mã ngắn nhất tính bằng byte thắng.

Các trường hợp thử nghiệm

Dòng đầu tiên sau một dòng trống là đầu vào và (các) dòng tiếp theo là mỗi ví dụ đầu ra hợp lệ.

[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
Sẽ luôn có một đầu ra hợp lệ?
mbomb007

3
@ mbomb007 Có. Luôn luôn có ít nhất một.
Sở thích của Calvin

23
Tôi muốn thấy ai đó lập trình điều này trong> <>! Điều đó thật tuyệt vời (và tôi mỉa mai tôi đoán vậy?)
Soren

Đây thực sự là một thử thách thú vị nhưng đơn giản, cảm ơn op
Shaun Wild

Câu trả lời:


29

Võng mạc , 20 byte

Số lượng byte giả định mã hóa ISO 8859-1.


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

Hãy thử trực tuyến! (Dòng đầu tiên cho phép bộ thử nghiệm được phân tách bằng nguồn cấp dữ liệu.)

Giải trình

Một cách đơn giản để tìm một hoán vị hợp lệ là bắt đầu bằng cách chèn các số từ 0để Ntheo thứ tự, và sau đó để đảo ngược những con số xung quanh mỗi chuỗi con của >s. Lấy <><<>>><<một ví dụ:

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

Cả hai nhiệm vụ này đều khá đơn giản trong Retina, mặc dù tất cả những gì chúng ta thực sự có thể làm việc là chuỗi. Chúng ta có thể lưu một byte bổ sung bằng cách chèn các số từ Nxuống 0và đảo ngược các phần xung quanh <thay vào đó, nhưng nguyên tắc là như nhau.

Giai đoạn 1: Thay thế


$.'

Chúng tôi bắt đầu bằng cách chèn độ dài của $'(hậu tố, tức là mọi thứ sau trận đấu) vào mọi vị trí có thể có trong đầu vào. Điều này chèn các số từ Nxuống đến 0.

Giai đoạn 2: Chia nhỏ

S`>

Chúng tôi chia đầu vào xung quanh >thành các dòng riêng biệt, vì vậy mỗi dòng là một số riêng lẻ hoặc một danh sách các số được nối với <.

Giai đoạn 3: Sắp xếp

%O#`\d+

Trong mỗi dòng ( %) chúng tôi sắp xếp ( O) các số ( \d#) theo giá trị số ( #) của chúng. Vì chúng tôi đã chèn số theo thứ tự số ngược, điều này đảo ngược chúng.

Giai đoạn 4: Thay thế

¶
>

Chúng tôi biến các nguồn cấp dữ liệu thành >một lần nữa để nối mọi thứ lại thành một dòng duy nhất. Đó là nó.

Là một lưu ý phụ, tôi đã có ý định thêm một cách để áp dụng %cho các dấu phân cách khác ngoài các dòng. Nếu tôi đã thực hiện điều đó, bài nộp này sẽ là 14 byte, vì sau đó ba giai đoạn cuối sẽ bị giảm xuống còn một giai đoạn:

%'>O#`\d+

Làm thế nào mà giống như một kích thước của tôi? Công việc tốt đẹp.
ThreeFx

@ThreeFx Vì tôi không dùng vũ phu. ;) Giải thích đến trong một phút.
Martin Ender

22

> <> , 46 43 35 + 4 cho  -s== 39 byte

0&l?!v:3%?\&:n1+$o!
+nf0.>&n; >l&:@

Đây là một triển khai thuật toán của xnor trong> <>.

Nó nhận chuỗi đầu vào trên ngăn xếp ( -sgắn cờ với trình thông dịch chuẩn).

Bạn có thể dùng thử trên trình thông dịch trực tuyến .


2
> <> có vẻ như là một ngôn ngữ phù hợp cho thử thách này.
anaximander

21

> <> , 26 + 4 = 30 byte

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

Hãy thử trực tuyến! +4 byte cho -s=cờ - nếu chỉ -sổn (điều đó có nghĩa là cờ sẽ cần được loại bỏ hoàn toàn cho đầu vào trống), thì đó sẽ là +3 thay vào đó.

Giả sử rằng đầu vào STDIN trống để itạo ra -1 (giống như trên EOF). Các chương trình lỗi khi cố gắng in -1 này dưới dạng char.

Sử dụng phương pháp max-of-nums-far-for- >, min-of-nums-so-for-for-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)

Một chương trình thoát hoàn toàn và không đưa ra giả định về STDIN là 4 byte bổ sung:

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


11

Perl, 29 byte

Bao gồm +2 cho -lp

Chạy với đầu vào trên STDIN, ví dụ:

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

Đầu ra:

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

order.pl:

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

Giải trình

Có hai bộ đếm, bắt đầu tối đa với độ dài chuỗi, tối thiểu bắt đầu bằng 0. Sau đó tại mỗi ranh giới (bao gồm cả bắt đầu và kết thúc chuỗi) nếu chỉ trước một <mức tối thiểu ở đó và tăng thêm 1, nếu không hãy đặt tối đa ở đó và giảm tối đa bằng 1 (ở cuối chuỗi, bạn không nhận được bộ đếm nào vì cả hai đều giống nhau)


s{}{/\G/...}Tôi chưa bao giờ thấy điều đó trước đây, nó thật tuyệt vời.
primo

10

Python 2, 67 byte

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

Một hàm đệ quy. Đáp ứng mỗi nhà khai thác lần lượt bằng cách đặt giá trị không sử dụng nhỏ nhất xcho x<và lớn nhất cho x>. Giá trị không sử dụng nhỏ nhất được lưu trữ ivà cập nhật và giá trị không sử dụng lớn nhất được suy ra từ ivà độ dài còn lại.


1
Tôi nghĩ bạn có thể làm (s>'=')thay vì (s>='>')để tiết kiệm một byte?
mathmandan

@mathmandan Cảm ơn! Thật kỳ lạ <>không phải là mật mã liên tiếp.
xnor

Đã đồng ý! Nhưng tôi đoán tôi có thể thấy nó có ý nghĩa như thế nào =giữa <>.
mathmandan

8

Python 2, 163 137 byte

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)

Xáo trộn các con số cho đến khi tuyên bố tránh True.

Thử nó.


Đây rõ ràng là hợp lý nhất trong tất cả các câu trả lời.
moopet

7

APL, 33 byte

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

⍋⍋ là hữu ích khác thường.

Giải trình

⍞←(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
Cây Giáng sinh ( ⍋⍋) làm gì?
Conor O'Brien

được xếp loại, trong đó trả về các chỉ dẫn theo thứ tự được sắp xếp. Bằng cách thực hiện hai lần, bạn sẽ có được 1số nhỏ nhất, 2trong đó số nhỏ nhất tiếp theo, ect.
Zwei

@ ConorO'Brien chỉnh sửa với một lời giải thích ngắn.
Oberon

Vâng, rất ngắn ._.
Conor O'Brien

7

JavaScript (ES6), 74 56 byte

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

Bắt đầu với bộ số 0...N. Ở mỗi giai đoạn chỉ cần lấy số lớn nhất ( l) hoặc ít nhất ( j) của các số còn lại; số tiếp theo phải theo định nghĩa nhỏ hơn hoặc lớn hơn số đó. Chỉnh sửa: Đã lưu 18 byte lớn nhờ @Arnauld.


3
Bạn có thể sử dụng replace? Có lẽs=>s.replace(/./g,c=>(c<'>'?j++:l--)+c,j=0,l=s.length)+j
Arnauld

@Arnauld ... và tôi nghĩ rằng tôi đã làm tốt đến sân nỗ lực đầu tiên của tôi (mà không phải tuân theo sự thay thế bởi replace) xuống 74 byte ...
Neil

5

Pyth - 19 byte

Hoan hô cho chuỗi so sánh!

!QZhv#ms.idQ.p`Mhl

Không hoạt động vì an toàn trực tuyến.


4

2sable , 20 byte

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

Giải trình

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

Hãy thử trực tuyến!

Đối với N <10, điều này có thể là 14 byte:

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

4

C #, 102 99 byte

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;}

Ung dung:

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.
}

Tôi mệt mỏi, vì vậy tôi có thể thiếu một cái gì đó, nhưng sẽ không thay đổi r = r +phần thành một phép gán tổng hợp tiết kiệm một vài byte?
Carcigenicate

2
Không - r+phần bên phải cho trình biên dịch biết toàn bộ nội dung là một chuỗi, vì vậy biểu diễn chuỗi cđược sử dụng. Nếu tôi sử dụng r+=, ?:phần sẽ đánh giá thành một int, giá trị thứ tự của csẽ được thêm vào đó và chỉ sau đó nó sẽ được chuyển đổi thành biểu diễn chuỗi của nó.
Scepheo

4

Java 8, 126 125 byte

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;};

Tôi không nghĩ rằng điều này thậm chí hoạt động hehe

Chương trình thử nghiệm

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(">><><>>"));
}

Bạn có thể thay đổi .replaceAllthành .replacevà xóa dấu ngoặc đơn xung quanh (c+"")để lưu 5 byte.
Kevin Cruijssen

@KevinCruijssen Không có khoảng 5 byte hahah.
Shaun Wild

Khi sử dụng ngôn ngữ chơi gôn thích hợp, 5 byte là sự khác biệt giữa vị trí thứ 5 và thứ 2. Với java, đó là sự khác biệt giữa nơi cuối cùng và nơi cuối cùng.
Shaun Wild

Java hầu như sẽ luôn là cuối cùng với các thách thức chơi gôn mã, nhưng lý do chúng tôi đăng các câu trả lời Java để bắt đầu là vì niềm vui của việc viết nó càng ngắn càng tốt. Cá nhân tôi đã rất vui nếu mã Java của tôi tăng từ 500 đến 499 về mặt byte. ; P
Kevin Cruijssen

Về cơ bản, chúng tôi bỏ qua tất cả các đối thủ cạnh tranh và chỉ cạnh tranh với hoặc đệ trình Java / C #, v.v.
Shaun Wild

4

Thạch , 27 14 12 byte

Cổng của @Martin Kết thúc giải pháp CJam
-2 byte nhờ @Dennis

żJ0;µFṣ”<Uj”<

Kiểm tra nó tại TryItOnline

Làm sao?

ż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"

Phương pháp trước đây rất thú vị về mặt toán học, nhưng không quá ...

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

Điều này sử dụng hệ thống cơ sở giai thừa để tìm một chỉ số hoán vị của [0, N] sẽ thỏa mãn phương trình.


1
Uvector hóa, vì vậy bạn không cần . żJ0;lưu một byte khác.
Dennis

4

Clojure, 152 132 126 byte

(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))))

Đã lưu một số lượng byte hợp lý bằng cách loại bỏ càng nhiều khoảng trắng càng tốt. Tôi nhận ra khoảng trắng không cần thiết để tách dấu ngoặc đơn khỏi ký tự khác.

Về cơ bản là một cổng Clojure trong câu trả lời của @ Scepheo. Hoạt động giống hệt nhau.

Những recurcuộc gọi đó là kẻ giết người! Tôi cho rằng tôi có thể đã sử dụng các nguyên tử để làm sạch nó. Các swap!cuộc gọi cần thiết để sử dụng các nguyên tử được thêm vào số đếm: /

Cảm ơn @amalloy đã tiết kiệm cho tôi một vài byte.

Ung dung:

(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

Chào mừng đến với trang web!
DJMcMayhem

@DJMcMayhem Cảm ơn. Hy vọng lần tới tôi sẽ có thể đưa ra giải pháp của riêng mình thay vì chỉ đưa ra một câu trả lời khác.
Carcigenicate

Bạn có thể lưu thêm hai khoảng trắng trong loopliên kết, trước svà sau a. Bạn cũng có thể cạo một chút bằng cách thay thế ifcây bằng case: (case c \< (recur ...) nil (str ...) (recur ...)). Và tất nhiên crcó thể là một tên ngắn hơn.
amalloy

@amalloy Điểm tốt, cảm ơn bạn. Tôi sẽ cập nhật khi tôi nhận được trên máy tính xách tay của tôi.
Carcigenicate

3

Haskell, 162 byte

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

Cái này dài quá.


3

Perl (107 + 1 cho -p) 108

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

Thuật toán bị đánh cắp từ câu trả lời của Martin Ender ♦


2

Ruby, 135 byte

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

Lưu ý: Độ phức tạp thời gian lớn (O (n!)).


2

Python 2, 176 172 byte

Nó không quá ngắn so với những người khác, nhưng tôi rất vui vì tôi đã giải quyết nó rất nhanh.

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

Dùng thử trực tuyến

Ung dung:

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

Dùng thử trực tuyến


phần xen kẽ có thể hoàn thành ngắn hơn nhiềuzip
Maltysen

@Maltysen Không phải là một tấn ngắn hơn, bởi vì các danh sách không có cùng độ dài (tôi vẫn phải pop), nhưng nó ngắn hơn một chút. Nếu N<10, tôi có thể làm cho chuỗi ngắn hơn.
mbomb007

1

PHP, 190 byte

ngẫu nhiên ngẫu nhiên cho đến khi một giải pháp hợp lệ tồn tại

$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 Byte nhận được tất cả các giải pháp và chọn một giải pháp

<?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)];
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.