Khi nào ông già Noel vào tầng hầm? (Ngày AOC 1)


20

Tôi đang sao chép phần thứ hai của ngày đầu tiên của Mùa Vọng, với sự cho phép của người tạo.

Santa đang cố gắng giao quà trong một tòa nhà chung cư lớn, nhưng anh ta không thể tìm đúng tầng - những hướng đi anh ta có một chút khó hiểu. Anh ta bắt đầu ở tầng trệt (tầng 0) và sau đó làm theo hướng dẫn từng nhân vật một.

Dấu ngoặc đơn mở (, có nghĩa là anh ta nên đi lên một tầng, và dấu ngoặc đơn đóng ), có nghĩa là anh ta nên đi xuống một tầng.

Tòa nhà chung cư rất cao, và tầng hầm rất sâu; anh ta sẽ không bao giờ tìm thấy các tầng trên cùng hoặc dưới cùng.

Đưa ra một bộ hướng dẫn, tìm vị trí của nhân vật đầu tiên khiến anh ta vào tầng hầm (tầng -1).

Ví dụ:

đầu vào )khiến anh ta vào tầng hầm ở vị trí nhân vật 1.

đầu vào ()())khiến anh ta vào tầng hầm ở vị trí nhân vật 5.

Một đầu vào dài được đưa ra ở đây sẽ mang lại giải pháp 1797.

Đây là mã golf, vì vậy giải pháp ngắn nhất sẽ thắng!


Chúng ta có phải sử dụng những ký tự chính xác không?
Màu xanh

1
@muddyfish Trong các thử thách ban đầu, các đầu vào được đưa ra dưới một hình thức cụ thể và do đó, một phần quan trọng của thử thách là phân tích cú pháp đầu vào; trong khi tôi không muốn điều này trở thành một "vấn đề tắc kè hoa", tôi nghĩ rằng tinh thần của bản gốc là đầu vào phải là một chuỗi dấu ngoặc. Tôi nhận ra rằng điều này đặc quyền một số ngôn ngữ hơn các ngôn ngữ khác nhưng tôi sẽ kêu gọi cử tri xem xét điều này khi trao giải thưởng cho các giải pháp.
Một Simmons

Liên quan rất chặt chẽ đến các số nhị phân có thể liệt kê được ... Tôi không cảm thấy đủ mạnh mẽ rằng đó là một bản sao, vì vậy tôi sẽ chỉ để lại nhận xét.
admBorkBork 17/2/2016

@TimmyD Tôi hiểu ý của bạn nhưng tôi cảm thấy câu hỏi này đủ khác biệt để câu trả lời cạnh tranh sẽ không thể rút ra quá nhiều từ câu hỏi đó!
Một Simmons

1
Tôi đang cố gắng giải quyết vấn đề này trong SMBF (về cơ bản là BF) và ngôn ngữ này THÀNH CÔNG để gỡ lỗi ... ugh.
mbomb007

Câu trả lời:


17

Thạch, 8 7 byte

O-*+\i-

Cảm ơn @ Sp3000 vì đã chơi golf 1 byte!

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

Làm thế nào nó hoạt động

O-*+\i-    Main link. Input: s (string)

O          Ordinal; replace each character with its code point.
           This maps "()" to [48, 49].
 -*        Apply x -> (-1) ** x.
           This maps [48, 49] to [1, -1].
   +\      Compute the cumulative sum, i.e., the list of partial sums.
     i-    Find the first index of -1.

16

Python 2, 44 byte

try:input()
except Exception,e:print e[1][2]

Giải pháp thông minh này đã được tìm thấy bởi hallvabo, xsot, mitchs và whatisgolf trên vấn đề này trên sân golf Anarchy . Nếu bất kỳ ai trong số bạn muốn đăng nó thay vào đó, tôi sẽ xóa cái này.

Mẹo nhỏ là để cho trình phân tích cú pháp của Python thực hiện công việc. Chức nănginput() cố gắng đánh giá một chuỗi đầu vào và đưa ra một lỗi trên paren chưa từng có đầu tiên. Lỗi này, khi bị bắt, có hình thức

SyntaxError('unexpected EOF while parsing', ('<string>', 1, 1, ')'))

trong đó bao gồm số ký tự nơi xảy ra lỗi.


7

Python, 79 77 byte

lambda m:[sum([2*(z<')')-1for z in m][:g])for g in range(len(m)+1)].index(-1)

Có lẽ có một cách tốt hơn để làm điều này, nhưng tôi không có ý tưởng. Ngoài ra đây là bài viết đầu tiên của tôi về codegolf.

Cảm ơn @Erwan. để chơi golf tắt 2 byte.


Chào mừng đến với trang web! Đây là một bài viết đầu tiên rất tốt đẹp. :)
Alex A.

bạn có thể thay thế [0:g]bằng[:g]
Erwan

và sự thay thế này tiết kiệm 1 byte tôi nghĩ -2*ord(z)+81bởi2*(z<')')-1
Erwan

5

Con trăn 3, 59

Đã lưu 3 byte nhờ grc.

Tôi thực sự không thích thực hiện lập chỉ mục chuỗi thủ công trong Python. Nó cảm thấy rất sai.

def f(x):
 c=q=0
 while-~c:c+=1-(x[q]>'(')*2;q+=1
 return q

5

C, 55 byte

g;main(f){for(;f;g++)f+=81-getchar()*2;printf("%d",g);}

Thử nó ở đây .

Chỉnh sửa: Không chắc tại sao tôi lại để một biến không sử dụng trong đó ...


5

CJam, 10 byte

0l'_*:~1#)

hoặc là

0l'_*~]1#)

hoặc (tín dụng cho Dennis)

Wl+'_*:~1#

Kiểm tra nó ở đây.

Giải trình

Như A Simmons đã lưu ý, ()là một lựa chọn may mắn cho CJam vì đó là các toán tử tăng / giảm tương ứng. Điều đó có nghĩa là nếu chúng ta bắt đầu từ con số 0, chúng ta đang tìm kiếm bước mà ông già Noel lên tầng 1.

0   e# Push 0, the initial floor.
l   e# Read input.
'_* e# Riffle the input string with underscores, which duplicate the top of the stack.
:~  e# Evaluate each character, using a map which wraps the result in an array.
1#  e# Find the position of the first 1.
)   e# Increment because we're looking for a one-based index.

4

Mê cung , 18 byte

+(+"#(!@
:  :
%2_,

Hãy thử trực tuyến! Câu trả lời này là kết quả của việc hợp tác với @ MartinBüttner.

Giải trình

Primer Labyrinth thông thường (tôi nói "thông thường", nhưng tôi thực sự viết lại điều này mỗi lần):

  • Labyrinth là một ngôn ngữ 2D dựa trên ngăn xếp, với việc thực hiện bắt đầu từ char hợp lệ đầu tiên (ở đây trên cùng bên trái). Tại mỗi ngã ba, nơi có hai hoặc nhiều đường dẫn có thể cho con trỏ lệnh thực hiện, đỉnh của ngăn xếp được kiểm tra để xác định nơi tiếp theo. Tiêu cực là rẽ trái, không là đi tiếp và tích cực là rẽ phải.
  • Ngăn xếp không có đáy và chứa đầy các số 0, do đó, xuất hiện từ một ngăn xếp trống không phải là một lỗi.
  • Các chữ số trong mã nguồn không đẩy số tương ứng - thay vào đó, chúng bật đầu ngăn xếp và đẩy n*10 + <digit>. Điều này cho phép dễ dàng xây dựng số lượng lớn. Để bắt đầu một số mới, sử dụng _, đẩy số không.

Mã này hơi lạ vì đối với mục đích chơi gôn, vòng lặp chính kết hợp hai nhiệm vụ thành một. Trong nửa đầu của lượt đi đầu tiên, đây là những gì xảy ra:

+(+             Add two zeroes, decrement, add with zero
                This leaves -1 on the stack
"               NOP at a junction. -1 is negative so we try to turn left, fail, and
                turn right instead.
:               Duplicate -1

Bây giờ, ngăn xếp đã được khởi tạo với -1 trên cùng, quá trình xử lý thực tế có thể bắt đầu. Đây là những gì vòng lặp chính làm.

,               Read a byte of input
_2%             Take modulo 2.
:+              Duplicate and add, i.e. double
(               Decrement
                This maps "(" -> -1, ")" -> 1
+               Add to running total
"               NOP at a junction. Go forward if zero, otherwise turn right.
:               Duplicate the top of the stack

Bản sao cuối cùng thêm một phần tử vào ngăn xếp cho mỗi lần lặp mà chúng ta thực hiện. Điều này rất quan trọng bởi vì, khi chúng tôi đạt 0 và đi tiếp tại NOP, chúng tôi sẽ:

#               Push stack depth
(               Decrement
!               Output as num
@               Terminate

3

Oracle SQL 11.2, 160 159 byte

SELECT MIN(l)FROM(SELECT l,SUM(m)OVER(ORDER BY l)p FROM(SELECT LEVEL l,DECODE(SUBSTR(:1,LEVEL,1),'(',1,-1)m FROM DUAL CONNECT BY LEVEL<=LENGTH(:1)))WHERE p=-1;

Không chơi gôn

SELECT MIN(l) -- Keep the min level
FROM(
  SELECT l,SUM(m)OVER(ORDER BY l)p -- Sum the () up to the current row
  FROM(
    SELECT LEVEL l,DECODE(SUBSTR(:1,LEVEL,1),'(',1,-1)m -- ( equal 1 and ) equal -1 
    FROM DUAL 
    CONNECT BY LEVEL<= LENGTH(:1)
  )
)
WHERE p=-1 -- Keep the rows where the () sum is equal to -1

3

Võng mạc ,22 21

! M` ^ ((\ () | (? <- 2>.)) +

Hãy thử trực tuyến hoặc thử trường hợp thử nghiệm lớn.(URL lớn đối với trường hợp thử nghiệm lớn, hãy cho tôi biết nếu nó bị hỏng đối với bạn, có vẻ ổn trong chrome.)

Lưu 1 byte nhờ Martin!

Chúng tôi khớp với tập hợp dấu ngoặc đơn cân bằng đầu tiên và trích xuất nó, sau đó chúng tôi đếm số lần chuỗi trống sẽ khớp với kết quả đó. Tôi không chắc đây có phải là cách tốt nhất để làm điều này trong Retina hay không, đặc biệt nếu chế độ PCRE làm cho nó ngắn hơn, nhưng sử dụng$#_ thay thế dường như dài hơn do một lỗi và vấn đề có nhiều hơn một trận đấu.

Thuật toán này gây ra hành vi kỳ quặc cho đầu vào không hợp lệ, về cơ bản, nó giả định rằng nếu ông già Noel không xuống tầng hầm, ông đã dịch chuyển tức thời đến đó sau các chuyển động khác.



3

Grep + AWK, 51 byte

grep -o .|awk '/\(/{s++}/)/{s--}s<0{print NR;exit}'

Các greplệnh đặt mỗi ký tự trên một dòng mới.


3

Bình thường, 13 byte

f!hsm^_1Cd<zT

Giải trình

              - autoassign z = input()
f             - First where V returns Truthy.
          <zT -     z[:T]
    m         -    [V for d in ^]
        Cd    -     ord(d)
     ^_1      -      -1**^
   s          -   sum(^)
 !h           -  not (^+1)

Hãy thử nó ở đây

Thuật toán cũ, 15 byte

f!h-/J<zT\(/J\)

Giải trình:

                - autoassign z = input()
f               - First where V returns Truthy.
      <zT       -      z[:T]
     J          -     autoassign J = ^
    /    \(     -    ^.count("(")
           /J\) -    J.count(")")
   -            -   ^-^
 !h             -  not (^+1)

Hãy thử nó ở đây

Hoặc nếu được phép sử dụng ký tự khác ngoài (), 9 byte (di chuyển trước khi chế biến phải nhập)

f!.v+<zT1

Giải trình

          - autoassign z = input()
f         - First where V returns Truthy.
     <zT  -     z[:T]
    +   1 -    ^+"1"
  .v      -   eval(^)
 !        -  not ^

Hãy thử nó ở đây


3

JavaScript (ES6), 58 byte

f=(s,t=s)=>s<')'?f(s.replace('()',''),t):t.length-s.length+1

Hoạt động bằng cách loại bỏ đệ quy một cặp ()s cho đến khi ký tự đầu tiên là a ). Cảnh báo: Đừng thử điều này trên các chuỗi không có đủ )s. Thí dụ:

((()())()))
((())()))
(()()))
(()))
())
)

Tại thời điểm này, nó thấy rằng 12 ký tự đã bị xóa tổng cộng để câu trả lời là 13.


Bạn có thể đặt bình luận đó vào câu trả lời của bạn thay vào đó.
mbomb007

3

MATL , 12 11 byte

Lưu 1 byte bằng ý tưởng tính toán -1 của Dennis được nâng lên chuỗi đầu vào

1_j^Ys0<f1)

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

1_         % number -1
j          % take string input
^          % element-wise power. This transforms '('  to 1 and ')' to -1
Ys         % cumulative sum
0<         % true for negative values
f          % find all such values 
1)         % pick first. Implicit display

2

CJam, 12 10 byte

0q{~_}%1#)

Hãy thử nó ở đây.

Hai byte được lưu nhờ Martin.

Giải trình:

0              Load 0 onto the stack
 q             Load input onto the stack without evaluating
  {  }       Code block
   ~_          Evaluate the next command and duplicate the top stack element. The format of the question is good for CJam and Golfscript since ) and ( are increment and decrement operators (though the wrong way round).
        %      Map this code block over the string. This yields an array of Santa's floor positions
         1#   Find the first instance of a 1, since decrement and increment are swapped
           )  Fix the off-by-1 error caused by zero-indexing

2

Javascript, 117 byte

o=f=0;i=prompt().split('');for(c in i){switch (i[c]){case '(':f++;break;case ')':f--;if(f<0){alert(o+1);i=[];}}o++;}

Bỏ qua các nhân vật khác. Sử dụng promptalert.


2

Perl, 34 + 1 = 35 byte

$.+=s+.+++s+\)++while")"gt$_;$_=$.

Cảm ơn Dennis cho một số lời khuyên.

Chạy với -pcờ. Nó hoạt động trong Perl 5.10, nhưng các phiên bản sau cần một khoảng trống ở đây:++ while

Phiên bản cũ hơn, chưa được chỉnh sửa:

$_ = <>;                # get a line of input
while ($_ lt ')') {     # while it begins with a (
    s/.//;              # remove the first (
    s/\)//;             # remove the first )
    $i += 2;            # increase index by 2
}
print $i + 1;           # print the position

2

Python, 44 byte

f=lambda s,i=1:i and-~f(s[1:],i-1+2*(s<')'))

Sàn ibắt đầu từ 1đó để chúng tôi chấm dứt ilà giá trị falsey 0. Nếu không được chấm dứt, hãy thêm đệ quy một kết quả với ký tự đầu tiên bị xóa và số sàn được cập nhật dựa trên ký tự đó.


2

Javascript, 57 byte

p=>{c=0;for(i in p){c+=p[i]==')'?-1:1;if(c<0)return+i+1}}

Khá đơn giản, chỉ cần lặp lại trên đầu vào, incs if '(' decs if ')'. Trả về âm đầu tiên.



1

C, 73 byte

main(f,c){f=c=0;for(;f!=-1;c++){f+=1-((getchar()&1)<<1);}printf("%d",c);}

Mong đợi đầu vào trên STDIN; không có ký tự nào khác ()có thể xuất hiện trong đầu vào (ít nhất là cho đến khi chúng tôi đạt được câu trả lời). Đầu vào phải là ASCII.

Phát ra câu trả lời trên STDOUT.

Sử dụng chênh lệch 1 bit giữa ASCII cho ().

/* old-style arguments, implicitly int */
main(x, f)
{
    /* c is our character counter, f is the floor*/
    c = f = 0;
    /* increase c while f is not -1 */
    for (;f != -1; c++) {
        /* use difference in LSB to add one for (, subtract one for ) */
        f += 1-((getchar()&1)<<1);
    }
    /* answer */
    printf("%d", c);
}

Phiên bản có định dạng độc đáo:


Bạn có thể di chuyển f=c=0vào việc khởi tạo vòng lặp for(f=c=0;f!=...để lưu một byte không?
AdmBorkBork

@TimmyD tốt hơn để biến chúng thành toàn cầu để chúng tự động được khởi tạo.
Cole Cameron

1

PowerShell, 75 65 62 byte

[char[]]$args[0]|%{$c+=(1,-1)[$_%40];$d++;if($c-lt0){$d;exit}}

Sử dụng một kỹ thuật tương tự như trên các số nhị phân có thể liệt kê để lặp qua tất cả các ký tự đầu vào, giữ một bộ $cđếm chạy +1cho mỗi (-1 cho từng loại ), sau đó kiểm tra xem chúng tôi có bị âm hay không (ví dụ: chúng tôi đang ở dưới tầng hầm).

Chỉnh sửa - đã lưu 10 byte bằng cách lặp qua các ký tự thực tế thay vì chỉ mục của chúng
Chỉnh sửa 2 - đã lưu 3 byte bổ sung bằng cách hoán đổi kiểm tra đẳng thức cho modulo để truyền là ẩn


1

Toán học, 62 55 byte

Position[Accumulate[(-1)^ToCharacterCode@#],-1][[1,1]]&

Tất cả các tên hàm dài! Hoạt động tương tự như câu trả lời CJam của Simmons.


1

Befunge 25 byte

Đầu ra trong unary. Điều này bắt đầu bạn ở tầng một, và sẽ đi đến 0.

1<\1_v#:+-*2%2~
:#._@>$1>

1

Vợt (102)

(λ(s)(let l((c 0)(b 0)(s(string->list s)))(if(> 0 b)c(l(+ 1 c)((if(eqv?(car s)#\()+ -)b 1)(cdr s)))))

Ung dung

(λ (input)
  (let loop ((count 0) (balance 0) (chars (string->list input)))
    (if (> 0 balance)
        count
        (loop (+ 1 count)
              ((if (eqv? (car chars) #\() + -) balance 1)
              (cdr chars)))))

1

APL, 18 ký tự

{1⍳⍨¯1=+\¯1*')'=⍵}

Bằng tiếng Anh:

  • ¯1*')'=⍵: -1 trong đó input = ")", 1 nếu không;
  • +\: tổng chạy;
  • 1⍳⍨¯1=: tìm chỉ số của -1 đầu tiên.

1

Lua, 92 89 87 byte

Nó có trong một đối số dòng lệnh.

Chỉnh sửa: Đã lưu 3 byte

Chỉnh sửa: Đã lưu 2 byte và sửa một lỗi có thể xảy ra trên các trường hợp cạnh, giờ đây nó xuất ra thông qua mã thoát của nó

r=0i=0(...):gsub(".",function(c)i=i+1r=r+(c==")"and-1or 1)if r<0then os.exit(i)end end)

Ung dung

r,i=0,0                     -- set r (the actual floor), and i(the character count)
(...):gsub(".",function(c) -- apply an anonymous functions on each character of the input
  i,r=i+1,                  -- increment i
      r+(c==")"and -1 or 1) -- decrement r if c==")", increment it otherwise
  if r<0 then os.exit(i)end -- if r==-1, exit and output the current index
end)

1

k / kona , 23 21 byte

2 byte được lưu bằng cách loại bỏ các dấu ngoặc đơn không cần thiết.

{1+(+\1 -1"()"?x)?-1}

Sử dụng:

k){1+(+\1 -1"()"?x)?-1} "())"
3

0

Perl, 40 + 1 = 41 byte

$y++,($i+=/\(/*2-1)<0&&last for/./g;$_=$y

Yêu cầu -pcờ:

$ perl -pe'$y++,($i+=/\(/*2-1)<0&&last for/./g;$_=$y' <<< '()())'
5
$ perl -pe'$y++,($i+=/\(/*2-1)<0&&last for/./g;$_=$y' 1797.txt
1797

Giả sử đầu vào hợp lệ.

Làm thế nào nó hoạt động:

                                           # -p read line by line into $_ and auto prints at the end
        $y++,                              # Counter for steps taken
             ($i+=/\(/*2-1) < 0            # The match /\(/ will give 1 or 0 in a numeric context 1 for `(` and 0 for anything else
                                           # times it by 2 and subtracting -1 will yield 1 or -1
                               && last     # End the iteration if $i < 0
for/./g;                                   # Iterate over each items in the input
                                      $_=$y# Print the output

0

Javascript (ES6), 68 67 byte

(s,r,f=0)=>s.split``.map((l,i)=>(f+=l=='('?1:-1,f<0?r=r||++i:0))&&r

Lấy đầu vào làm đối số đầu tiên

Giải trình

(s, r, f=0)                                  //Gets string, declares r and f to equal undefined and 0
         =>
            s.split``                        //Splits string into character array
            .map(                            //Loops over array
                 (l, i)=>(
                         f +=                //Increment f
                         l=='(' ? 1 : -1,    //By either 1 or -1 depending on character
                         f<0 ?               //If the floor is less than 0
                         r=r||++i            //And is first time below, r equals index (+1 to make it '1 indexed not 0')
                         : 0)
                         &&r                   //Return index

0

Python (3.5), 78 71 62 byte

một giải pháp đệ quy

f=lambda s,p=0,v=0:p if v<0else f(s[1:],p+1,v+2*(s[0]<')')-1) 

Nó tương tự như giải pháp này cho sân golf mini

chúng ta có thể cho rằng santa luôn đến tầng hầm

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.