Ternary thứ n


17

Tôi định nghĩa ternary thứ n là một ternary trả về n và có dạng:

1 ? 2 ? 3 ? n - 1 ? n : 0 : 0 : 0  # n - 1 zeroes

Viết một hàm hoặc chương trình hoàn chỉnh có đầu vào n sẽ xuất hoặc trả về ternary thứ n. Mã-Golf.

Tủ thử

0 #=> undefined behaviour
1 #=> 1
2 #=> 1 ? 2 : 0
3 #=> 1 ? 2 ? 3 : 0 : 0
10 #=> 1 ? 2 ? 3 ? 4 ? 5 ? 6 ? 7 ? 8 ? 9 ? 10 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0

Ternary thứ 1000 tôi nghĩ rằng có một số loại zen hài hòa với nó.


1
Là khoảng trắng dấu vết được phép?
rink.attguard.6

@ không, không có không gian đào tạo
Caridorc

1
Vì "ternary" có nghĩa là 3, bạn không nên đặt tên nó là "n-ary", đó là những gì nó được đề cập trong toán học?
mbomb007

4
Cách để "chỉnh sửa" một bình luận là: xóa nó và thêm một bình luận mới.
Reto Koradi

1
@RetoKoradi Bạn có thể chỉnh sửa nhận xét nếu trong vòng năm phút sau khi đăng.
mbomb007

Câu trả lời:


8

Pyth - 19 18 17 byte

Các không gian đang giết chết tôi, nghĩ ra một cách tốt hơn để xử lý chúng.

+j" ? "SQ*tQ" : 0

Nó chỉ tham gia các số bằng a " ? "và sau đó ghép phần thứ hai vào.

+              String concatenation
 j" ? "        Join by the string
  SQ           1-indexed inclusive range to input
 *             String repetition
  tQ           Input - 1
  " : 0        String implicitly closed by end of program

Hãy thử trực tuyến tại đây .


10

CJam, 18 18 byte

ri,:)":?0"*2/ze_S*

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

Giải trình

ri,:)          e# Generate the list 1..n.
":?0"*         e# Insert ":?0" between every two numbers.
2/             e# Split into pairs, e.g. 1:, ?0, 2:, ?0, ..., ?0, n.
z              e# First items in every pair before second items in every pair.
e_             e# Concatenate the two parts.
S*             e# Insert spaces.

12
Tôi yêu :).
Alex A.

9

Ruby, 31 byte

f=->n{[*1..n]*' ? '+' : 0'*~-n}

Kiểm tra:

> f[1]
=> "1"
> f[7]
=> "1 ? 2 ? 3 ? 4 ? 5 ? 6 ? 7 : 0 : 0 : 0 : 0 : 0 : 0"

2
Vì vậy, array * string== array.join string... thú vị
Caridorc

Điều này thực sự mát mẻ. Vì tò mò, điều gì xảy ra khi bạn làm gì f[0]?
Alex A.

1
@AlexA. irb(main):007:0> f[0] ArgumentError: negative argument from (irb):6:in * from (irb):6:in block in irb_binding from (irb):7:in [] from (irb):7 from /usr/bin/irb:11:in <main>
Caridorc

4
@Caridorc Cả to và khó hiểu. Đẹp.
Alex A.

2
@daniero Cảnh báo: có thể tạo chuỗi chống
Caridorc

8

CJam, 19 byte

Chỉ là một sự khởi đầu ...

ri_,:)'?*\(":0"*+S*

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

ri_                       e# Read the number as integer and make a copy of it on stack
   ,:)                    e# Convert the copy to array [1 .. n]
      '?*                 e# Join the numbers with a '?'. So we have [1 '? 2 '? ... '? n]
         \(               e# Swap the stack to get original integer on top. Decrement it by 1
           ":0"*          e# Get n-1 repeated ":0" string
                +S*       e# Join the two strings and fill it with spaces. 

Dùng thử trực tuyến tại đây


Heck, 1 phút quá muộn.
Dennis

3
wow bạn khá nhanh trong việc viết mã trong Cjam: O
Caridorc

@Dennis Tôi nghĩ rằng giải pháp ban đầu của bạn, giống hệt với giải pháp đầu tiên của Tối ưu hóa, thực sự là đầu tiên. Ít nhất tôi khá chắc chắn rằng tôi đã thấy nó bật lên đầu tiên. Nhưng thời gian đăng bài của bạn đã được cập nhật khi bạn chỉnh sửa nó trong thời gian ân hạn.
Reto Koradi

1
@RetoKoradi id bài đăng của anh ấy là 52870. Của tôi là 52869 :)
Trình tối ưu hóa

À, ok, tôi không được phép xem những bài viết đã bị xóa trên trang này. Cả hai phải bật lên cùng một lúc cho tôi và tôi chỉ chú ý đến cái trên cùng. Tôi dường như nhớ rằng SE có thể làm một số thứ thú vị để đăng thời gian khi chỉnh sửa trong thời gian ân hạn. Nếu không, bạn có thể đăng một người giữ chỗ trống và điền nội dung trong thời gian ân hạn, để làm cho nó giống như bạn đã có câu trả lời đầu tiên và nó thực sự chứa nội dung hữu ích ngay từ đầu vì các chỉnh sửa trong thời gian ân hạn không được theo dõi.
Reto Koradi

6

Brainfuck, 305

(Không có số đầu vào từ STDIN, xem chỉnh sửa ở phía dưới)

-[->+>+<<]>>>++++[>++++++++<-]>[<+>-]+++++++[>+++++++++<-]>[<+>-]++++++[>++++++++
<-]>[<+>-]++<<<<>>>+.-<<<[>.>.<.>>>>>++++++++++<<[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<
]>>[-]>>>++++++++++<[->-[>+>>]>[+[-<+>]>+>>]<<<<<]>[-]>>[>++++++[-<++++++++>]<.<<
+>+>[-]]<[<[->-<]++++++[->++++++++<]>.[-]]<<++++++[-<++++++++>]<.[-]<<[-<+>]<+<<<
<-]>>-----<<<[->>.>.<.>>.<<<<]

Tôi đã sử dụng thuật toán đáng yêu này để in một số, chiếm tới 155 byte của toàn bộ chương trình.

Nó hoạt động cho các đầu vào lên tới 32768 (giới hạn 16 bit của thuật toán). Nó cũng không tạo ra các dấu cách và cũng hoạt động cho đầu vào 1:

input    output
0        [infinite loop (til underflow)]
1        "1"
2        "1 ? 2 : 0"
4        "1 ? 2 ? 3 ? 4 : 0 : 0 : 0"
etc.

Đi bộ nhanh:

Thiết lập (97 byte)

-                                 Decrease input (position 0)
[->+>+<<]  >>>                    Copy input twice to the right and 
                                      shift 3 positions to the right
++++[>++++++++<-]>   [<+>-]       Precalculate number 32 (=" ") at position 3
+++++++[>+++++++++<-]>  [<+>-]    Precalculate number 63 (="?") at position 4
++++++[>++++++++<-]>    [<+>-]    Precalculate number 48 (="0") at position 5
++<<<<                            Precalculate number 2 for later use. This number
                                      will be printed in each iteration. (position 6)

Phần đầu tiên (181 byte)

>>>+.-<<<                Go to the char "0" we saved, increase it, print it,
                             decrease it and go back (this prints "1" everytime)
[                        While our second copy of the number isn't zero
    >.>.<.>>>                Move to " ", print, move to "?", print,
                                 move to " " again, print, move to our
                                 number at the end which is initially 2

    [>>+>+<<<-]>>>[<<<+>>>-]<<+>[<->[>++++++++++<[->-[>+>>]>[+[-<+>]>+>>]<<<<<]>[-]
        ++++++++[<++++++>-]>[<<+>>-]>[<<+>>-]<<]>]<[->>++++++++[<++++++>-]]<
        [.[-]<]<             Algorithm to print the number at current position

    +<<<<                    Increase our number at the end and return to the beginning
-]                       Decrease the loop variable

Phần thứ hai (27 byte)

>>-----<<<        Move to our "?" char and decrease it by 5 to get ":"
[-                While our first copy of the number isn't zero decrease it
   >>.>.<.>>.<<<<     Print " ", print ":", print " ", print "0"
]

Nếu nó được phép ánh xạ 8 lệnh Brainfuck thành 3 bit, thì chương trình này sẽ chiếm 114 byte và 3 bit khác

Unary, ~ 4.08 * 10 ^ 275 byte

Nó sẽ là quá dài đối với ở đây, nhưng nó chỉ là 408452257862560239329948606295286361112603208650130608525040044700379331457759667646985586658469601803889628246410788572492437928714867190270708935427798983714797786123292750743771225096145575210320040188155473030775033228313350778616384531426430459309802833775612506568528463 số không và hoạt động giống như các chương trình Brainfuck.

EDIT : Tôi đã nhầm lẫn, chương trình này không thực sự lấy đầu vào của người dùng, nó chỉ sử dụng giá trị con trỏ hiện tại làm đầu vào. Để có thể phân tích một số nhiều hơn nữa sẽ được yêu cầu và tôi không thể bận tâm để làm điều đó.

Vì vậy, nó hoạt động với một giá trị được nhập trực tiếp vào chương trình (bằng cách nối thêm n lần "+" trước chương trình) nhưng không hoạt động với STDIN


5

JavaScript (ES6), 42 39 byte

f=m=>(g=k=>k-m?k+` ? ${g(k+1)} : 0`:m)(1)

Hàm ngoài flấy giá trị đầu vào và sau đó gọi hàm bên trong một gcách đệ quy để xây dựng chuỗi từ giữa ra, sử dụng giá trị đầu vào làm mức tối đa để kiểm tra trường hợp cơ sở.

Ung dung:

function f(max) {
    function g(count) {
        if(count==max) {
            // base case: return max for the center
            return max;
        } else {
            // recursive case: build outer shell around center
            return count + " ? " + g(count+1) + " : 0";
        }
    }

    return g(1);
}

4

Con trăn 56 55

t=lambda n:' ? '.join(map(str,range(1,n+1)))+' : 0'*~-n

4

C # - 76

Func<int,string>F=k=>{var r="";for(;k>1;)r=" ? "+k--+r+" : 0";return"1"+r;};

3

Haskell, 53 byte

g n='1':foldr(\x s->" ? "++show x++s++" : 0")""[2..n]

Cách thức hoạt động: xây dựng chuỗi từ trong ra ngoài bằng cách bắt đầu với một chuỗi trống và lặp từ nxuống đến 2trước khi thêm số hiện tại và a ?và nối thêm a : 0. Cuối cùng đặt một 1trước mặt tất cả.

Một cách tiếp cận khác (nhờ @Mauris hiện ngắn hơn 9 byte):

Haskell, 60 51 byte

 f n='1':((=<<[2..n])=<<[(" ? "++).show,\x->" : 0"])

Làm thế nào nó hoạt động: một nghĩa đen 1theo sau ? <x>cho mỗi <x>trong [2..n]theo sau là một hằng số : 0cho mỗi <x>trong [2..n].


Một cách tiếp cận dựa trên 60 byte của bạn giảm xuống 51:g n='1':((=<<[2..n])=<<[(" ? "++).show,\x->" : 0"])
Lynn

Trên thực tế, bạn có thể giảm xuống còn 51 trực tiếp bằng cách thay thế (\_->" : 0")=<<[2..n]bằng[2..n]>>" : 0"
Lynn


3

Julia, 44 31 byte

n->join(1:n," ? ")*" : 0"^(n-1)

Điều này tạo ra một hàm không tên chấp nhận một số nguyên làm đầu vào và trả về một chuỗi. Để gọi nó, đặt tên cho nó, vd f=n->....

Đầu tiên chúng ta kết hợp các số nguyên từ 1 đến n , tách từng phần ?và khoảng trắng thành một chuỗi. Sau đó, chúng tôi nối vào chuỗi này " : 0"lặp lại n -1 lần.

Ví dụ:

julia> f(1)
"1"

julia> f(3)
"1 ? 2 ? 3 : 0 : 0"

julia> f(0)
can't repeat a string -1 times

2

JavaScript ES7, 62 byte

n=>[for(i of Array(n).keys())i+1].join` ? `+' : 0'.repeat(n-1)

Tôi không biết nếu tôi có thể chơi gôn này nhiều hơn. Nhưng đó là một giải pháp khá đơn giản

Chỉ dành cho Firefox:

var f=n=>[for(i of Array(n).keys())i+1].join` ? `+' : 0'.repeat(n-1)

alert(f(+prompt('Input: ')));

Tương đương ES5:

// Most browsers now support .repeat
String.prototype.repeat = String.prototype.repeat || function(n){var _n = '', i = 0; for (;i < n; i += 1){_n+=this};return _n}
                                                             //Function                         
function f(n){a=[];for(i of Array(n).keys()){a.push(i+1)};return a.join(' ? ')+' : 0'.repeat(n-1)}

alert(f(+prompt('Input: ')))


2

CoffeeScript, 52 byte

f=(n)->s='';s=' ? '+n--+s+' : 0'while n;s.slice 3,-4

Giải trình

f=(n)->
 s = ''                                # initialize string
 s = ' ? ' + n-- + s + ' : 0' while n  # prepend and append in decrementing loop
 s.slice 3,-4                          # chop off leading ?, trailing 0 and whitespace

2

SWI-Prolog, 90 byte

a(X):-Y is X-1,\+ (between(1,Y,L),\+writef('%w ? ',[L])),write(X),writef('%r',[' : 0',Y]).

Chắc chắn sẽ không giành chiến thắng, nhưng việc \+ (between(1,TopBound,N),\+do_something(N))xây dựng là khá thú vị để lặp lại một cái gì đó trên một chuỗi các số nguyên.


2

Swift 145 (khoảng trắng 135 w / o)

func t(n:Int) -> String {
    let a = (1..<n).reverse().reduce("") {" ? \($1)\($0) : 0"}
    return a.substringFromIndex(advance(a.startIndex, 3))
}

Bạn có thể tin rằng phần của chuỗi con thực sự dài hơn phần để tạo biểu thức.


1
Tôi phải yêu Swift <3 Tôi thực sự mong muốn mặc dù họ làm điều đó để bạn có thể truy cập Chuỗi với các chỉ số Integer như str[1]hoặc str[0...5]. Tất nhiên bạn có thể tạo một tiện ích mở rộng nhỏ, nhưng tôi ước thư viện chuẩn đã kích hoạt tính năng này
Kametrixom

@Kametrixom apple đã cho phép điều này trong phiên bản beta đầu tiên, nhưng các mã hóa unicode khác nhau ngăn bạn làm như vậy. Điều đó chủ yếu là vì một số ký hiệu dài hơn hai byte và một số thì không. Vì vậy, nó không được đảm bảo để tìm nạp cùng một ký tự trong các bảng mã khác nhau với cùng một chỉ mục. Mô tả của tôi có thể không chính xác, nhưng về cơ bản, tại sao apple lại đưa ra cú pháp chỉ mục chuỗi xấu xí.
Ben Lu

Gần đây tôi đã thực sự quen với việc sử dụng Swift cho Code Golfing, hãy xem câu trả lời Swift của tôi
Kametrixom

2

Perl, 36 byte

say join(" ? ",1..$_)." : 0"x($_-1)

35nhân vật +1cho -n.

Chạy với:

echo 10 | perl -nE'say join(" ? ",1..$_)." : 0"x($_-1)'

2

Java, 71

Tôi không thể tự giúp mình sau khi bình luận về câu trả lời của RCB . Vì vậy, đây là một Java khác (71 như wow khi Java không phải là dài nhất!)

String t(int n){String s=""+n;for(;--n>0;)s=n+" ? "+s+" : 0";return s;}

2

Java, 125 88 byte

Nguyên

String f(int n){if(n==1)return"1";String s="",e="";for(int i=1;i<n;i++){s+=i+" ? ";e+=i==n-1?": 0":": 0 ";}return s+n+" "+e;}

Với định dạng đẹp hơn và tên biến:

String nAry(int n) {
    if (n == 1) {
        return "1";
    }
    String start = "", end = "";
    for (int i = 1; i < n; i++) {
        start += i + " ? ";
        end += (i == n - 1) ? ": 0" : ": 0 ";
    }
    return start + n + " " + end;
}

Cải thiện - Nhờ những bình luận của Jack Ammo bên dưới:

String f(int n){String s="",e=s;for(int i=1;i<n;){s+=i+++" ? ";e+=" : 0";}return s+n+e;}

1
bạn không cần toán tử bộ ba đó để nối thêm vào e chỉ để chiếm chỗ, chỉ cần giả sử bạn luôn cần khoảng trống phía trước dấu hai chấm e+=" : 0";. Sau đó, bạn có thể lưu 1 byte bằng cách tăng sau i khi nó được sử dụng thay vì trên dòng forloop for(int i=1;i<n;){s+=i+++" ? ";Câu lệnh trả về của bạn sẽ không còn cần thêm khoảng trắng sau n return s+n+e;. Bạn cũng có thể tiết kiệm 1 byte bằng cách sử dụng e=s. Ngoài ra, câu lệnh if ở đầu là không cần thiết vì logic vòng lặp for sẽ đảm bảo kết quả đó.
Jack Ammo

@JackAmmo Lời khuyên tuyệt vời, cảm ơn! Câu lệnh if là cần thiết để tránh khoảng trắng theo sau, nhưng không còn sau khi bạn cải thiện logic vòng lặp for. Tôi đã kết hợp các thay đổi và nâng cao câu trả lời của bạn.
RCB

1

JavaScript (ES6), 59 byte

Cách tiếp cận tương tự như câu trả lời CoffeeScript của tôi, sử dụng chuỗi mẫu trợ giúp. String.prototype.repeatChi phí quá nhiều nhân vật.

f=n=>{for(s=``;n;)s=` ? ${n--+s} : 0`;return s.slice(3,-4)}

Bản giới thiệu

Firefox chỉ bây giờ, vì nó là ES6.

f=n=>{for(s=``;n;)s=` ? ${n--+s} : 0`;return s.slice(3,-4)}

// DEMO
console.log = x => document.body.innerHTML += '<p>' + x

console.log(f(1));
console.log(f(3));
console.log(f(10));



1

Con trăn 2, 63 60 58 56

Hãy thử nó ở đây

Giải pháp dễ dàng: (63)

n=input()
for i in range(n-1):print-~i,'?',
print`n`+' : 0'*~-n

Chỉnh sửa : Tôi thực sự muốn thử một hàm đệ quy. Đây là: (56)

f=lambda n,c=1:`c`+(' ? '+f(n,c+1)if c<n else~-n*' : 0')

Chỉnh sửa : Bất cứ ai biết tại sao điều này không hoạt động? Tôi đã thử một danh sách với chỉ mục là c<n, nhưng nó không hoạt động vì lỗi tràn ngăn xếp. Tương tự với điều này:

f=lambda n,c=1:`c`+((c<n)*(' ? '+f(n,c+1))or~-n*' : 0')

Chỉ mục không hoạt động vì nó phải tạo một danh sách chứa hàm được đánh giá (rõ ràng sẽ chạy mãi mãi). Điều tương tự xảy ra với phép nhân của bạn, nó vẫn cần đánh giá hàm mặc dù nó đang thực hiện 0*nó.
FryAmTheEggman

@FryAmTheEggman Được rồi, cảm ơn. Tôi chưa bao giờ có một tình huống như thế này xảy ra trước đây.
mbomb007

1

rs , 77 byte

(\d+)/(_)^^(\1)
+^_(_+)/\1 _\1
_(_+)$/_\1( : 0)^^((^^\1))
(__+)/? (^^\1)
^./1

Bản demo và trường hợp thử nghiệm trực tiếp.

Giải trình:

(\d+)/(_)^^(\1)

Mở rộng số lượng thành một chuỗi N dấu gạch dưới.

+^_(_+)/\1 _\1

Liên tục tạo ra một loạt các dấu gạch dưới, cách nhau bởi khoảng trắng. vd: Điều này sẽ biến ___thành _ __ ___.

_(_+)$/_\1( : 0)^^((^^\1))

Nối vào tập hợp dấu gạch dưới (có độ dài N) N-1 của : 0.

(__+)/? (^^\1)

Thay thế từng nhóm dấu gạch dưới bằng chiều dài của nó, trước đó ?, NGOẠI TRỪ cho nhóm đầu tiên.

^./1

Thay cái đầu tiên bằng số 1.

Do định dạng, cái này cũng xử lý 0tốt: nó chỉ in chuỗi rỗng.


1

Swift, 79 75 byte

let f={{$0+$1}((1..<$0).reduce(("1","")){($0.0+" ? \($1+1)",$0.1+" : 0")})}

fđược khai báo ngầm định là một hàm với một Inttham số trả về mộtString

Hoạt động với n >= 1và gặp sự cố khi chạy n == 0. Không có khoảng trắng dấu

Chỉnh sửa: Được quản lý để xóa 2 * 2 ký tự, vì nội suy chuỗi không phải lúc nào cũng ngắn nhất

Lưu ý để chỉnh sửa: Mã này sẽ mất mãi mãi (nó không dừng) để biên dịch, nhưng chắc chắn sẽ có nếu trình biên dịch có thể xử lý nó. Hãy xem phiên bản trước khi chỉnh sửa này để có được một bản biên dịch


1

> <> , 32 + 3 = 35 byte

:l(?vln" ? "ooo0$
"ooo>nl?!;" : 

Lưu ý rằng có một dấu cách trên dòng thứ hai. +3 dành cho -vcờ, ví dụ: chạy như

$ py -3 fish.py ternary.py -v 2
1 ? 2 : 0

Lấy đầu vào làm điểm mã như

i:l(?vln" ? "ooo0$!
 "ooo>nl?!;" :

là 34 byte, nhưng tôi thích phiên bản trên hơn vì nó dễ kiểm tra hơn và dù sao nó cũng sẽ không thắng.

Giải trình

Có khá nhiều đệ quy giả và lạm dụng đang diễn ra, vì vậy hãy xem xét.

Dòng đầu tiên in "1 ? 2 ? ... n-1 ? " một phần. Ngăn xếp bắt đầu chỉ với đầu vào n, nhờ -vcờ và chúng tôi thực hiện như sau:

:l(?v           If (length of stack + 1 > n), go to the second line
ln              Print the length of the stack
" ? "ooo        Print the reverse of " ? " (but hey, palindromes)
0$              Push 0 and swap, keeping n on top and increasing the 
                length of the stack by 1

> <> là hình xuyến, do đó, ở trên thực hiện trong một vòng lặp cho đến khi ngăn xếp bao gồm nở trên cùng với các n-1số 0 bên dưới, tại đó nó di chuyển đến dòng thứ hai.

Lần đầu tiên dòng thứ hai được thực thi, nlệnh được chạy, in nở đầu ngăn xếp. Điều này chỉ để lại các n-1số 0 và chúng tôi thực hiện như sau, cũng trong một vòng lặp:

l?!;            If the stack is empty, terminate
" : "ooo        Print the reverse of " : " (but hey, palin...)
n               Print one of the 0s, decreasing the stack's length by 1
                This reuses the same n instruction from before

" ? "ooo In ngược lại "?" (Nhưng hey, palindromes) đang in ngược lại ngắn hơn in chuỗi thực tế?
Caridorc

@Caridorc Có, bởi vì> <> chỉ có thể in char-by-char bằng cách bật ra một ngăn xếp :)
Sp3000

sp3000 tốt đẹp để biết.
Caridorc


1

Mục tiêu-C, 346 byte

-(void)printTernaryOfInt:(int)ternary{NSMutableString *outString=@"".mutableCopy; for (int i=1;i<=ternary;i++) {[outString appendString:[NSString stringWithFormat:@" ? %i",i]];}[outString deleteCharactersInRange:NSMakeRange(0, 2)];for (int i=1;i<ternary;i++) {[outString appendString:[NSString stringWithFormat:@" : 0"]];}NSLog(@"%@",outString);}

Đặt vào trong 0 cho inthoặc bất cứ điều gì tiêu cực tăng lên NSRangeExceptiondo outStringcó chứa nil. Điều này sẽ chạy trên iOS 2.0 trở lên và nhiều phiên bản mới nhất của Mac OS X.

Phân tích mã:

-(void)printTernaryOfInt:(int)ternary{ ... }

Khai báo hàm tiêu chuẩn trong Objective-C.

NSMutableString *outString=@"".mutableCopy;

Tạo một chuỗi cho đầu ra để đi đến, outString , và làm cho nó có thể thay đổi. (Nói cách khác, nó có thể được đọc và viết.

for (int i=1;i<=ternary;i++) {[outString appendString:[NSString stringWithFormat:@" ? %i",i]];}

Thêm phần đầu tiên của chuỗi vào đầu ra.

[outString deleteCharactersInRange:NSMakeRange(0, 2)];

Dọn dẹp phần đầu của chuỗi để đảm bảo ? 1được thay thế bằng 1. Lưu ý: nếu 0được đưa ra, đây là nơi NSRangeExceptionsẽ xảy ra, do không có chỉ mục1 .

for (int i=1;i<ternary;i++) {[outString appendString:[NSString stringWithFormat:@" : 0"]];}

Thêm phần thứ hai của chuỗi vào chuỗi.

NSLog(@"%@",outString);}

Nhổ chuỗi ra ngoài bằng cách sử dụng NSLogvà đóng chức năng.

Đầu ra:

Nhập vào 0cung cấp nhật ký sự cố này:

    2015-07-11 05:15:28.036 Example App[41665:2134488] *** Terminating app due to uncaught exception 'NSRangeException', reason: '-[__NSCFString deleteCharactersInRange:]: Range or index out of bounds'
*** First throw call stack:
(
    0   CoreFoundation                      0x009b5746 __exceptionPreprocess + 182
    1   libobjc.A.dylib                     0x0063ea97 objc_exception_throw + 44
    2   CoreFoundation                      0x009b566d +[NSException raise:format:] + 141
    3   CoreFoundation                      0x00981813 mutateError + 259
    4   CoreFoundation                      0x009818c1 -[__NSCFString deleteCharactersInRange:] + 65
    5   Example App                         0x000e3785 -[ViewController printTernaryOfInt:] + 277
    6   Example App                         0x000e3645 -[ViewController placeOrder:] + 133
    7   libobjc.A.dylib                     0x006547cd -[NSObject performSelector:withObject:withObject:] + 84
    8   UIKit                               0x00d75a40 -[UIApplication sendAction:to:from:forEvent:] + 99
    9   UIKit                               0x00d759d2 -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 64
    10  UIKit                               0x00eb613a -[UIControl sendAction:to:forEvent:] + 69
    11  UIKit                               0x00eb6557 -[UIControl _sendActionsForEvents:withEvent:] + 598
    12  UIKit                               0x00eb57c1 -[UIControl touchesEnded:withEvent:] + 660
    13  UIKit                               0x00dcdcaa -[UIWindow _sendTouchesForEvent:] + 874
    14  UIKit                               0x00dce786 -[UIWindow sendEvent:] + 792
    15  UIKit                               0x00d8c681 -[UIApplication sendEvent:] + 242
    16  UIKit                               0x00d9cab8 _UIApplicationHandleEventFromQueueEvent + 21484
    17  UIKit                               0x00d702e7 _UIApplicationHandleEventQueue + 2300
    18  CoreFoundation                      0x008d706f __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
    19  CoreFoundation                      0x008ccb7d __CFRunLoopDoSources0 + 253
    20  CoreFoundation                      0x008cc0d8 __CFRunLoopRun + 952
    21  CoreFoundation                      0x008cba5b CFRunLoopRunSpecific + 443
    22  CoreFoundation                      0x008cb88b CFRunLoopRunInMode + 123
    23  GraphicsServices                    0x029e42c9 GSEventRunModal + 192
    24  GraphicsServices                    0x029e4106 GSEventRun + 104
    25  UIKit                               0x00d740b6 UIApplicationMain + 1526
    26  Example App                         0x000e3cfa main + 138
    27  libdyld.dylib                       0x02d76ac9 start + 1
    28  ???                                 0x00000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

1 đưa ra điều này:

2015-07-11 05:06:02.360 Example App[41665:2134488]  1

2 đưa ra điều này:

2015-07-11 05:06:07.613 Example App[41665:2134488]  1 ? 2 : 0

7 đưa ra điều này:

2015-07-11 05:06:12.147 Example App[41665:2134488]  1 ? 2 ? 3 ? 4 ? 5 ? 6 ? 7 : 0 : 0 : 0 : 0 : 0 : 0

200 đưa ra điều này:

2015-07-11 05:06:35.552 Example App[41665:2134488]  1 ? 2 ? 3 ? 4 ? 5 ? 6 ? 7 ? 8 ? 9 ? 10 ? 11 ? 12 ? 13 ? 14 ? 15 ? 16 ? 17 ? 18 ? 19 ? 20 ? 21 ? 22 ? 23 ? 24 ? 25 ? 26 ? 27 ? 28 ? 29 ? 30 ? 31 ? 32 ? 33 ? 34 ? 35 ? 36 ? 37 ? 38 ? 39 ? 40 ? 41 ? 42 ? 43 ? 44 ? 45 ? 46 ? 47 ? 48 ? 49 ? 50 ? 51 ? 52 ? 53 ? 54 ? 55 ? 56 ? 57 ? 58 ? 59 ? 60 ? 61 ? 62 ? 63 ? 64 ? 65 ? 66 ? 67 ? 68 ? 69 ? 70 ? 71 ? 72 ? 73 ? 74 ? 75 ? 76 ? 77 ? 78 ? 79 ? 80 ? 81 ? 82 ? 83 ? 84 ? 85 ? 86 ? 87 ? 88 ? 89 ? 90 ? 91 ? 92 ? 93 ? 94 ? 95 ? 96 ? 97 ? 98 ? 99 ? 100 ? 101 ? 102 ? 103 ? 104 ? 105 ? 106 ? 107 ? 108 ? 109 ? 110 ? 111 ? 112 ? 113 ? 114 ? 115 ? 116 ? 117 ? 118 ? 119 ? 120 ? 121 ? 122 ? 123 ? 124 ? 125 ? 126 ? 127 ? 128 ? 129 ? 130 ? 131 ? 132 ? 133 ? 134 ? 135 ? 136 ? 137 ? 138 ? 139 ? 140 ? 141 ? 142 ? 143 ? 144 ? 145 ? 146 ? 147 ? 148 ? 149 ? 150 ? 151 ? 152 ? 153 ? 154 ? 155 ? 156 ? 157 ? 158 ? 159 ? 160 ? 161 ? 162 ? 163 ? 164 ? 165 ? 166 ? 167 ? 168 ? 169 ? 170 ? 171 ? 172 ? 173 ? 174 ? 175 ? 176 ? 177 ? 178 ? 179 ? 180 ? 181 ? 182 ? 183 ? 184 ? 185 ? 186 ? 187 ? 188 ? 189 ? 190 ? 191 ? 192 ? 193 ? 194 ? 195 ? 196 ? 197 ? 198 ? 199 ? 200 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 0

1

C, 84 78 byte

C, mặc dù nó không phải là ngắn nhất, như là một hàm:

i;f(n){while(++i<n)printf("%i ? ",i);printf("%i",n);while(--i)printf(" : 0");}

Trong tên của chơi golf, các intBộ xác định kiểu gì còn lại tắt của i, fnbởi vì nó là mặc định. icó thể không được khởi tạo bởi vì nó là biến toàn cục và mặc định là 0. fkhông trả về giá trị, nhưng điều đó chỉ gây ra cảnh báo. printfkhông phải là #include'd. Để chạy, đây là phiên bản chương trình đầy đủ:

#include <stdio.h>

i;f(n){while(++i<n)printf("%i ? ",i);printf("%i",n);while(--i)printf(" : 0");}

int main(int argc, char *argv[]){
    if(argc != 2){
        return 1;
    }
    f(atoi(argv[1]));
    puts("");
}

Bạn có thể rút ngắn điều này bằng cách sử dụng for(printf(...);--i;).
lirtosiast

1

C, 63 byte

Hàm tái sử dụng, lấy n làm đối số.

i;f(n){for(i=1;i<2*n;i++)printf(i-1?n/i?" ? %d":" : 0":"1",i);}

Ungolfed và nhận xét (khá đơn giản):

int f(int n) {
    int i;

    // 1 ... n, n+1 ... 2n-1
    for(i = 1; i < 2*n; i++) {
        // If i == 1, prints "1"
        // If i <= n, prints " ? %d", i (i = 2 ... n)
        // Else, prints " : 0" (i = n+1 ... 2n-1)
        printf(
            i-1 ?
                n/i ?
                    " ? %d" :
                    " : 0" :
                "1",
        i);
    }
}

1

Lisp thường gặp, 84

(format t "~{~A ? ~}~@*~{~[~;~:;0~^ ? ~]~}" (loop for i from 1 to (read) collect i))

Đầu tiên, (loop for i from 1 to (read) collect i)tạo một danh sách các số nguyên từ 1 đến bất cứ thứ gì được đưa vào, được sử dụng làm đối số duy nhất cho hàm. Nhưng ma thuật thực sự của nó nằm ở chuỗi điều khiển trông giống như nhiễu đường truyền. "~{~A ? ~}"Lặp lại toàn bộ danh sách được lưu trữ trong đối số đầu tiên, xuất ra mỗi số với ?nửa đầu. ~@*Đặt lại danh sách đối số thành đối số đầu tiên. ~{~[~;~:;0~^ ? ~]~}nhắc lại trong danh sách, xuất ra 0 ?cho mỗi đối số được tiêu thụ, nhưng không xuất ra gì nếu đối số là 0 hoặc 1.

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.