Ternary ที่ n


17

ฉันกำหนด ternary n-th เป็น ternary ที่ส่งคืน n และมีรูปแบบ:

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

เขียนฟังก์ชั่นหรือโปรแกรมที่สมบูรณ์ที่ได้รับอินพุต n จะส่งออกหรือส่งกลับ ternary n- รหัสกอล์ฟ

Testcases

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

ยุคที่สามที่ฉันคิดว่ามีความกลมกลืนกับเซนบ้าง


1
อนุญาตให้ใช้ช่องว่างต่อท้ายได้หรือไม่
rink.attendant.6

@ ลิงก์ไม่ไม่มีพื้นที่ฝึกอบรม
Caridorc

1
เนื่องจาก "ternary" หมายถึง 3 คุณไม่ควรตั้งชื่อมันว่า "n-ary" ซึ่งเป็นสิ่งที่ถูกอ้างถึงในวิชาคณิตศาสตร์?
mbomb007

4
วิธีในการ "แก้ไข" ความคิดเห็นคือ: ลบออกและเพิ่มใหม่
Reto Koradi

1
@RetoKoradi คุณสามารถแก้ไขความคิดเห็นหากมีการโพสต์ภายในห้านาที
mbomb007

คำตอบ:


8

Pyth - 19 18 17 ไบต์

ช่องว่างกำลังฆ่าฉันโดยคิดถึงวิธีที่ดีกว่าในการจัดการกับมัน

+j" ? "SQ*tQ" : 0

มันแค่รวมตัวเลขโดย " ? "แล้วต่อส่วนที่สองเข้าด้วยกัน

+              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

ลองมันออนไลน์ได้ที่นี่


10

CJam, 18 18 ไบต์

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

ลองออนไลน์ลองมันออนไลน์

คำอธิบาย

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
:)ฉันรัก
Alex A.

9

Ruby, 31 ไบต์

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

ทดสอบ:

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

2
ดังนั้นarray * string== array.join string... น่าสนใจ
Caridorc

นี่มันเจ๋งจริงๆ จากความอยากรู้ว่าเกิดอะไรขึ้นเมื่อคุณทำ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 ทั้งที่ดังและไม่เข้าใจ ดี
Alex A.

2
@daniero คำเตือน: อาจสร้าง anti-string ได้
Caridorc

8

CJam, 19 ไบต์

เพิ่งเริ่มต้น ...

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

มันทำงานอย่างไร

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. 

ลองออนไลน์ได้ที่นี่


เฮค 1 นาทีสายเกินไป
Dennis

3
คุณเป็นคนค่อนข้างเร็วในการเขียนโค้ดใน Cjam: O
Caridorc

@Dennis ฉันคิดว่าโซลูชันเริ่มต้นของคุณซึ่งเหมือนกับโซลูชันแรกของเครื่องมือเพิ่มประสิทธิภาพคือจริง ๆ ก่อน อย่างน้อยฉันก็ค่อนข้างแน่ใจว่าฉันเห็นมันปรากฏขึ้นก่อน แต่เวลาโพสต์ของคุณอัปเดตเมื่อคุณแก้ไขภายในระยะเวลาผ่อนผัน
Reto Koradi

1
@RetoKoradi id โพสต์ของเขาคือ 52870 Mine คือ 52869 :)
เครื่องมือเพิ่มประสิทธิภาพ

อ่าฉันไม่ได้รับอนุญาตให้ดูโพสต์ที่ถูกลบในเว็บไซต์นี้ ทั้งคู่จะต้องโผล่ขึ้นมาในเวลาเดียวกันสำหรับฉันแล้วและฉันก็สังเกตเห็นแค่อันดับหนึ่ง ฉันดูเหมือนจะจำได้ว่า SE อาจทำสิ่งที่ขี้ขลาดเพื่อโพสต์เวลาเมื่อแก้ไขภายในระยะเวลาผ่อนผัน มิฉะนั้นคุณสามารถโพสต์เจ้าของที่ว่างและเติมเนื้อหาภายในระยะเวลาผ่อนผันเพื่อทำให้ดูเหมือนว่าคุณมีคำตอบแรกและจริง ๆ แล้วมีเนื้อหาที่มีประโยชน์ตั้งแต่เริ่มต้นเพราะการแก้ไขภายในระยะเวลาผ่อนผันจะไม่ถูกติดตาม
Reto Koradi

6

Brainfuck, 305

(ไม่มีหมายเลขอินพุตจาก STDIN ให้ดูการแก้ไขที่ด้านล่าง)

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

ฉันใช้อัลกอริทึมที่น่ารักนี้เพื่อพิมพ์ตัวเลขซึ่งใช้เวลาทั้งหมด 155 ไบต์ของโปรแกรมทั้งหมด

ใช้งานได้กับอินพุตสูงสุด 32768 (ข้อ จำกัด ของอัลกอริทึมแบบ 16 บิต) มันไม่สร้างช่องว่างต่อท้ายและใช้สำหรับอินพุต1เช่นกัน:

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

เดินผ่านอย่างรวดเร็ว:

ตั้งค่า (97 ไบต์)

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

ส่วนแรก (181 ไบต์)

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

ส่วนที่สอง (27 ไบต์)

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

หากอนุญาตให้แมปคำสั่ง 8 Brainfuck เป็น 3 บิตโปรแกรมนี้จะใช้เวลาถึง114ไบต์และอีก 3 บิต

เอกภาพ, ~ 4.08 * 10 ^ 275 ไบต์

มันจะยาวเกินไปสำหรับที่นี่ แต่มันเป็นเพียงแค่ 408452257862560239329948606295286361112603208650130608525040044700379331457759667646985586658469601803889628246410788572492437928714867190270708935427798983714797786123292750743771225096145575210320040188155473030775033228313350778616384531426430459309802833775612506568528463 ศูนย์และการทำงานเช่นเดียวกับโปรแกรม brainfuck

แก้ไข : ฉันสับสนโปรแกรมนี้ไม่ได้ป้อนข้อมูลผู้ใช้จริง ๆ เพียงแค่ใช้ค่าตัวชี้ปัจจุบันเป็นอินพุต สำหรับความสามารถในการแยกตัวเลขจำนวนมากขึ้นจะต้องและฉันไม่สามารถรำคาญที่จะทำ

ดังนั้นจึงใช้งานได้กับค่าที่ป้อนลงในโปรแกรมโดยตรง (โดยเพิ่ม n ครั้ง "+" ก่อนโปรแกรม) แต่ไม่ใช่กับ STDIN


5

JavaScript (ES6), 42 39 ไบต์

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

ฟังก์ชั่นด้านนอกfรับค่าอินพุตจากนั้นเรียกใช้ฟังก์ชั่นด้านในgแบบซ้ำ ๆ เพื่อสร้างสตริงจากกึ่งกลางโดยใช้ค่าอินพุตเป็นค่าสูงสุดในการทดสอบสำหรับเคสพื้นฐาน

Ungolfed:

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



3

Haskell, 53 ไบต์

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

วิธีการทำงาน: สร้างสตริงจากภายในสู่ภายนอกโดยเริ่มต้นด้วยสตริงที่ว่างเปล่าและวนลูปจากnลงไป2กับ prepending หมายเลขปัจจุบันและและท้าย? : 0ในที่สุดก็ใส่1ต่อหน้าทุกคน

วิธีการอื่น (ด้วย @Mauris ตอนนี้สั้นลง 9 ไบต์):

Haskell, 60 51 ไบต์

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

วิธีการทำงาน: ตัวอักษร1ตามด้วย? <x>สำหรับแต่ละ<x>ใน[2..n]ตามอย่างต่อเนื่อง: 0สำหรับแต่ละใน<x>[2..n]


วิธีการตาม 60 ไบต์ของคุณที่ลดลงถึง 51:g n='1':((=<<[2..n])=<<[(" ? "++).show,\x->" : 0"])
Lynn

ที่จริงแล้วคุณสามารถลดได้ถึง 51 โดยตรงเพียงแค่แทนที่(\_->" : 0")=<<[2..n]ด้วย[2..n]>>" : 0"
Lynn


3

จูเลียอายุ44 ปี 31 ไบต์

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

สิ่งนี้จะสร้างฟังก์ชั่นที่ไม่มีชื่อที่รับจำนวนเต็มเป็นอินพุตและส่งคืนสตริง หากต้องการเรียกใช้ให้ตั้งชื่อเช่นf=n->...เรียกว่าให้มันชื่อเช่น

ก่อนอื่นเราจะรวมจำนวนเต็ม 1 ถึงnโดยแยกแต่ละส่วนด้วย?และช่องว่างเป็นสตริงเดียว จากนั้นเราต่อท้ายสตริงนี้" : 0"ซ้ำn -1 ครั้ง

ตัวอย่าง:

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 ไบต์

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

ฉันไม่รู้ว่าจะเล่นกอล์ฟนี้มากกว่านี้ได้ไหม แต่มันเป็นทางออกที่ตรงไปตรงมา

Firefox เท่านั้น:

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

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

เทียบเท่า 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 ไบต์

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

คำอธิบาย

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 ไบต์

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

แน่นอนว่าจะไม่ชนะ แต่การ\+ (between(1,TopBound,N),\+do_something(N))ก่อสร้างค่อนข้างน่าสนใจที่จะทำซ้ำบางสิ่งบางอย่างตามลำดับจำนวนเต็ม


2

Swift 145 (135 w / o whitespace)

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

คุณเชื่อไหมว่าส่วนที่ต่อซับสตริงนั้นยาวกว่าส่วนที่สร้างนิพจน์


1
ต้องรักสวิฟท์ <3 ผมหวังจริงๆว่าที่พวกเขาทำให้มันเพื่อให้คุณสามารถเข้าถึง Strings กับดัชนีจำนวนเต็มเหมือนหรือstr[1] str[0...5]แน่นอนว่าคุณสามารถสร้างส่วนขยายเล็ก ๆ ได้ แต่ฉันหวังว่าห้องสมุดมาตรฐานจะเปิดใช้งานสิ่งนี้
Kametrixom

@ Kametrixom แอปเปิ้ลอนุญาตให้ใช้สิ่งนี้ในเบต้าครั้งแรก แต่การเข้ารหัส Unicode ต่าง ๆ ทำให้คุณไม่สามารถทำเช่นนั้นได้ นั่นเป็นเพราะสัญลักษณ์บางอย่างมีความยาวสองไบต์หรือมากกว่าและบางตัวก็ไม่ได้ ดังนั้นจึงไม่รับประกันว่าจะได้อักขระที่เหมือนกันในการเข้ารหัสที่แตกต่างกันด้วยดัชนีเดียวกัน คำอธิบายของฉันอาจไม่ถูกต้อง แต่นั่นเป็นเหตุผลว่าทำไมแอปเปิลจึงแนะนำไวยากรณ์ดัชนีสตริงที่น่าเกลียด
Ben Lu

เมื่อเร็ว ๆ นี้ฉันเคยชินกับการใช้ Swift สำหรับ Code Golfing ลองดูคำตอบ Swift ของฉัน
Kametrixom

2

Perl, 36 ไบต์

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

35ตัวอักษรสำหรับ+1-n

ทำงานด้วย:

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

2

Java, 71

ฉันไม่สามารถช่วยตัวเองหลังจากที่แสดงความคิดเห็นในคำตอบของ RCB ดังนั้นนี่คือ Java อีกอัน (71 อย่างว้าวเมื่อไหร่ Java จะไม่ยาวที่สุด!)

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

2

ชวา 125 88 ไบต์

เป็นต้นฉบับ

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

ด้วยการจัดรูปแบบ nicer และชื่อตัวแปร:

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

ปรับปรุง -ขอบคุณที่ความคิดเห็นของ Jack Ammo ด้านล่าง:

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

1
คุณไม่ต้องการโอเปอเรเตอร์สามตัวที่ต่อท้าย e เพื่อพิจารณาพื้นที่เพียงสมมติว่าคุณต้องการพื้นที่ด้านหน้าโคลอนe+=" : 0";เสมอ จากนั้นคุณสามารถบันทึก 1 ไบต์โดยการโพสต์การเพิ่มฉันเมื่อมันมาใช้แทนในบรรทัด forloop for(int i=1;i<n;){s+=i+++" ? ";คำสั่งกลับของคุณจะไม่จำเป็นต้องใช้พื้นที่ที่เพิ่มเข้ามาหลังจาก return s+n+e;n นอกจากนี้คุณยังสามารถบันทึก 1 e=sไบต์โดยใช้ นอกจากนี้คำสั่ง if ที่จุดเริ่มต้นนั้นไม่จำเป็นเนื่องจาก for for loop จะรับประกันผลลัพธ์นั้น
Jack Ammo

@JackAmmo สุดยอดเคล็ดลับขอบคุณ! คำสั่ง if จำเป็นต้องหลีกเลี่ยงช่องว่างต่อท้าย แต่ไม่นานหลังจากที่คุณปรับปรุงตรรกะวงรอบ ฉันได้รวมการเปลี่ยนแปลงและปรับปรุงคำตอบของคุณ
RCB

1

JavaScript (ES6), 59 ไบต์

วิธีการเดียวกับคำตอบ CoffeeScript ของฉันโดยใช้วิธีใช้แม่แบบสตริง String.prototype.repeatมีค่าใช้จ่ายมากเกินไป

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

การสาธิต

Firefox สำหรับตอนนี้เท่านั้นเนื่องจากเป็น 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

Python 2, 63 60 58 56

ลองที่นี่

ทางออกที่ง่าย: (63)

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

แก้ไข : ฉันต้องการลองใช้ฟังก์ชันแบบเรียกซ้ำ นี่คือ: (56)

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

แก้ไข : ใครรู้ว่าทำไมสิ่งนี้ไม่ทำงาน ฉันลองรายการที่มีดัชนีของc<nแต่นั่นไม่ได้ผลเพราะข้อผิดพลาดล้นสแต็ค เหมือนกันกับสิ่งนี้:

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

ดัชนีไม่ทำงานเนื่องจากต้องสร้างรายการที่มีฟังก์ชันที่ประเมิน (ซึ่งเห็นได้ชัดว่าจะทำงานตลอดไป) สิ่งเดียวกันที่เกิดขึ้นกับการคูณของคุณก็ยังคงต้องการที่จะประเมินผลการทำงานแม้ว่ามันจะทำ0*มัน
FryAmTheEggman

@FryAmTheEggman เอาล่ะขอบคุณ ฉันไม่เคยมีสถานการณ์แบบนี้เกิดขึ้นมาก่อน
mbomb007

1

อาร์เอส , 77 ไบต์

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

กรณีสาธิตและการทดสอบสด

คำอธิบาย:

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

ขยายจำนวนลงในชุดของขีดเส้นใต้ N

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

สร้างช่วงของการขีดเส้นใต้ซ้ำหลายครั้งคั่นด้วยช่องว่าง เช่นนี้จะเปิดเข้าไป____ __ ___

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

ผนวกกับขีดล่างสุดท้ายของอินสแตนซ์ (ของความยาว N) N-1 ของ : 0กรณีของ

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

แทนที่ขีดล่างแต่ละกลุ่มด้วยความยาวของมัน, นำหน้าด้วย?, ยกเว้นสำหรับกลุ่มแรก

^./1

แทนที่อันแรกด้วยหมายเลข 1

เนื่องจากรูปแบบสิ่งนี้จัดการได้0ดี: มันเพียงพิมพ์สตริงที่ว่างเปล่า


1

Swift, 79 75 ไบต์

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

fถูกประกาศโดยนัยว่าเป็นฟังก์ชันที่มีหนึ่งIntพารามิเตอร์ซึ่งส่งกลับString

ทำงานร่วมกับและเกิดปัญหาที่รันไทม์เมื่อn >= 1 n == 0ไม่มีช่องว่างต่อท้าย

แก้ไข: จัดการเพื่อลบอักขระ 2 * 2 เนื่องจากการแก้ไขสตริงไม่ได้สั้นที่สุดเสมอไป

หมายเหตุในการแก้ไข: รหัสนี้ใช้เวลาตลอดไป (ไม่หยุด) ในการคอมไพล์ แต่แน่นอนว่าถ้าคอมไพเลอร์จะสามารถจัดการได้ ดูเวอร์ชั่นก่อนการแก้ไขนี้เพื่อรับคอมไพล์


1

> <> , 32 + 3 = 35 ไบต์

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

โปรดทราบว่ามีช่องว่างต่อท้ายในบรรทัดที่สอง +3 ใช้สำหรับการ-vตั้งค่าสถานะเช่นใช้คำสั่ง like

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

การป้อนข้อมูลเป็นจุดรหัสเช่น

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

มีขนาด 34 ไบต์ แต่ฉันชอบรุ่นที่สูงกว่าเนื่องจากง่ายต่อการทดสอบและจะไม่ชนะอยู่ดี

คำอธิบาย

มีการแอบอ้างซ้ำซากและการละเมิดที่เกิดขึ้นบ้างดังนั้นลองมาดูกัน

บรรทัดแรกพิมพ์"1 ? 2 ? ... n-1 ? " ส่วน สแต็กเริ่มต้นด้วยอินพุตเพียงnขอบคุณ-vธงและเราทำสิ่งต่อไปนี้:

: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

> <> เป็น toroidal ดังนั้นการดำเนินการข้างต้นจะดำเนินการในลูปจนกว่าสแต็กจะประกอบด้วยnที่ด้านบนที่มีn-1เลขศูนย์ด้านล่างซึ่งจุดที่มันจะย้ายไปที่บรรทัดที่สอง

ครั้งแรกที่บรรทัดที่สองถูกเรียกใช้งานnคำสั่งจะถูกเรียกใช้พิมพ์nที่ด้านบนสุดของสแต็ก นี่เหลือแค่n-1ศูนย์และเราทำสิ่งต่อไปนี้และอยู่ในลูป:

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 พิมพ์กลับด้านของ "?" (แต่เฮ้, palindromes)กำลังพิมพ์ย้อนกลับสั้นกว่าการพิมพ์สตริงจริง?
Caridorc

@Caridorc ใช่แล้วเพราะ> <> สามารถพิมพ์ char-by-char ได้โดยการปิดสแต็ก :)
Sp3000

sp3000 ยินดีที่ได้รู้จัก
Caridorc


1

วัตถุประสงค์ -C, 346 ไบต์

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

ใส่ใน 0สำหรับintหรือเชิงลบอะไรที่ทำให้เกิดNSRangeExceptionเนื่องจากการoutStringที่มีnilที่มีสิ่งนี้ควรทำงานบน iOS 2.0 และใหม่กว่าและ Mac OS X เวอร์ชันล่าสุดจำนวนมาก

รายละเอียดของรหัส:

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

ประกาศฟังก์ชั่นมาตรฐานใน Objective-C

NSMutableString *outString=@"".mutableCopy;

สร้างสตริงสำหรับเอาต์พุตเพื่อไปที่ outStringและทำให้ไม่สามารถเปลี่ยนแปลงได้ (กล่าวอีกนัยหนึ่งก็สามารถอ่านและเขียนได้

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

เพิ่มส่วนแรกของสตริงเพื่อส่งออก

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

ทำความสะอาดจุดเริ่มต้นของสตริงเพื่อให้แน่ใจว่าจะถูกแทนที่ด้วย? 1 1หมายเหตุ: ถ้า0ได้รับนี่คือที่ที่NSRangeExceptionจะเกิดขึ้นเนื่องจากไม่มีดัชนี1จะเกิดขึ้นเนื่องจากมีไม่เป็นดัชนี

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

เพิ่มส่วนที่สองของสตริงให้กับสตริง

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

แยกสตริงกลับออกมาโดยใช้NSLogและปิดฟังก์ชั่น

เอาท์พุท:

การป้อน0ให้บันทึกข้อผิดพลาดนี้:

    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 ให้สิ่งนี้:

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

2 ให้สิ่งนี้:

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

7 ให้สิ่งนี้:

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 ให้สิ่งนี้:

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 ไบต์

C แม้ว่ามันจะไม่สั้นที่สุดเท่าที่ฟังก์ชั่น:

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

ในนามของการเล่นกอล์ฟที่intระบุชนิดที่เหลือออกจากi, fและnเพราะมันเป็นค่าเริ่มต้น iสามารถยกเลิกการกำหนดค่าเริ่มต้นได้เนื่องจากเป็นตัวแปรส่วนกลางและมีค่าเริ่มต้นเป็นศูนย์ fไม่ส่งคืนค่า แต่เป็นเพียงการเตือน printfไม่ใช่#include'd หากต้องการเรียกใช้นี่เป็นโปรแกรมเวอร์ชันเต็ม:

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

for(printf(...);--i;)คุณอาจจะสามารถที่จะลดลงนี้โดยใช้
lirtosiast

1

C, 63 ไบต์

ฟังก์ชั่นนำมาใช้ใหม่ใช้เวลาเป็นอาร์กิวเมนต์

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

Ungolfed และแสดงความคิดเห็น (ตรงไปตรงมาสวย):

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

เสียงกระเพื่อมสามัญ, 84

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

ขั้นแรกให้(loop for i from 1 to (read) collect i)สร้างรายการจำนวนเต็มตั้งแต่ 1 ถึงสิ่งที่ใส่เข้าไปซึ่งใช้เป็นอาร์กิวเมนต์สำหรับฟังก์ชันเท่านั้น แต่ความมหัศจรรย์ที่แท้จริงของมันอยู่ในสายควบคุมที่ดูเหมือนเสียงรบกวนของสาย "~{~A ? ~}"วนซ้ำทั้งรายการที่เก็บไว้ภายในอาร์กิวเมนต์แรกส่งออกแต่ละหมายเลขด้วย?ครึ่งแรก~@*รีเซ็ตรายการอาร์กิวเมนต์เป็นอาร์กิวเมนต์แรก ~{~[~;~:;0~^ ? ~]~}ย้ำเหนือรายการโดยแสดงผลลัพธ์0 ?สำหรับแต่ละอาร์กิวเมนต์ที่ใช้ไป แต่ไม่แสดงผลลัพธ์ใด ๆ หากอาร์กิวเมนต์นั้นเป็น 0 หรือ 1

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.