วาดรูปแบบโบว์ลิ่ง


44

เป้าหมายของคุณคือการแสดงศิลปะ ASCII ของการก่อตัวในโบว์ลิ่งสิบพินซึ่งมีหมุดเหลืออยู่เพียงบางส่วน ไบต์ที่น้อยที่สุดจะเป็นผู้ชนะ

หมุดนับสิบอยู่ในรูปแบบสามเหลี่ยม:

O O O O         
 O O O   
  O O       
   O

หมุดมีป้ายกำกับตั้งแต่ 1 ถึง 10 เป็น:

7 8 9 10    
 4 5 6            
  2 3    
   1

วาดหมุดเป็นOและหายไปในขณะที่.การก่อตัว1 3 5 6 9 10คือ:

. . O O         
 . O O    
  . O       
   O

การป้อนข้อมูล:

สตริงที่คั่นด้วยช่องว่างที่แสดงชุดย่อยที่ไม่ว่างเปล่าของตัวเลข 1 ถึง 10 ตามลำดับ

เอาท์พุท:

พิมพ์รูปแบบที่สอดคล้องกันหรือส่งออกมันเป็นสตริงที่มี linebreaks

รูปแบบควรล้างด้วยด้านซ้ายของหน้าจอ ช่องว่างใด ๆ ก็ใช้ได้ตราบใดที่ภาพที่มองเห็นถูกต้อง บรรทัดว่างก่อนและหลังก็ดีเหมือนกัน

กรณีทดสอบ:

>> 1 2 3 4 5 6 7 8 9 10

O O O O    
 O O O    
  O O    
   O

>> 7 10

O . . O    
 . . .   
  . .   
   .

>> 3 5 7 9 10

O . O O    
 . O .    
  . O    
   .

>> 1

. . . .    
 . . .    
  . .    
   O       

คุณรับประกันได้หรือไม่ว่าจะมีอย่างน้อยหนึ่งพิน มันจะบันทึกอักขระสำหรับฉันถ้าฉันสามารถทำให้หายใจไม่ออกในอินพุตที่ว่างเปล่า
undergroundmonorail

1
@undergroundmonorail มันรับประกันอยู่แล้ว: "เซตย่อยที่ไม่มีข้อ จำกัด "
xnor

ฉันพลาดไปโดยสิ้นเชิงขอบคุณ :)
undergroundmonorail

[รหัสโบว์ลิ่ง] : P
mbomb007

คำตอบ:


17

brainfuck - 617 616 604 ไบต์

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

ส่วนนี้ทำให้ฉันดีขึ้นในสองวัน ฉันคิดว่ามันคุ้มค่า อาจมีบางส่วนที่สามารถตีกอล์ฟได้มากขึ้นโดยการเปลี่ยนแปลงสิ่งที่เซลล์ถูกเก็บไว้ในหรืออะไรก็ตาม แต่ตอนนี้ฉันแค่มีความสุขที่ได้ทำงาน

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

If you input these pins:           [2, 3, 6, 8, 9]
First, the program does this:      [2, 3, 6, 8, 9] + [10]
Then this:                         [2, 3, 6] + [7] + [8, 9, 10]
Then this:                         [2, 3] + [4, 5] + [6, 7, 8, 9, 10]
Finally, this:                     [1] + [2, 3, 4, 5, 6, 7, 8, 9, 10]
To build this:                     [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

ในขณะที่มันกำลังทำอยู่มันจะจดจำว่าหมุดใดที่ผู้ใช้ใส่ไว้ กลยุทธ์นี้จะใช้ยากมากหากอินพุตไม่ได้ถูกจัดเรียง

อีกสิ่งหนึ่งที่การเรียงลำดับทำให้ง่ายขึ้นคือการตรวจจับหมายเลข 10 เนื่องจาก brainfuck เกี่ยวข้องกับแต่ละไบต์ไม่ใช่ "หมายเลข" ต่อ se มันอาจจะเป็นความเจ็บปวดในตูด แต่อินพุตที่เรียงลำดับทำให้ฉันจัดการได้ง่ายกว่ามาก กับ เหตุผลที่เกี่ยวข้องกับวิธีการจัดเก็บข้อมูลในโปรแกรม ฉันรับอินพุตหนึ่งตัวอักษรในเวลานั้นและลบ 32 จากผลลัพธ์ ถ้าเซลล์นั้นไม่ใช่ศูนย์หลังจากนั้นฉันก็เลื่อนไปข้างหน้า 4 เซลล์ ก่อนทำซ้ำ ซึ่งหมายความว่าฉันได้รับไบต์ที่ไม่ใช่ช่องว่างของการป้อนข้อมูลทุก 4 เซลล์และฉันเก็บหมุดได้อย่างมีประสิทธิภาพเป็นตัวเลขของพวกเขา + 16 อย่างไรก็ตาม 10 ใช้เวลาสองไบต์ในการพิมพ์ดังนั้นฉันต้องกรณีพิเศษมัน หากอินพุตไม่ได้เรียงฉันจะต้องตรวจสอบพิน แต่เนื่องจากมันถูกจัดเรียงมันจะเป็นพินสุดท้ายเสมอหากปรากฏขึ้น ฉันจะตรวจสอบว่า (ไบต์สุดท้ายของอินพุต + 1) == (ไบต์สุดท้ายที่สองของอินพุต) หรือไม่และถ้าเป็นเช่นนั้นจะต้องเป็น 10 ฉันจะลบไบต์สุดท้ายแล้วตั้งค่าวินาทีสุดท้ายให้เป็นสิ่งที่ระบบของฉันเข้าใจ "10" ตัวละคร'1'และ'0'ไม่พอดีกับไบต์เดียว แต่หมายเลข 26 แน่นอน!

การได้ลูกเล่นขึ้นมาเพื่อทำให้บางสิ่งบางอย่างทำงานได้ดีเป็นส่วนหนึ่งที่ฉันชอบใช้ภาษานี้ :)

หากคุณสนใจว่าโปรแกรมนี้ทำงานในรายละเอียดมากขึ้นคุณสามารถดูโปรแกรมพร้อมความคิดเห็นที่ฉันใช้ในขณะที่เขียนมันเพื่อให้แน่ใจว่าฉันจำได้ว่าทุกอย่างทำอะไร แม้แต่การเขียนความคิดเห็นใน brainfuck ก็ทำได้ยากเนื่องจากไม่มีไวยากรณ์ความคิดเห็น ตัวละครทุกตัวยกเว้นตัวละครใน<[+.,-]>นั้นไม่มีตัวละครแทน มันง่ายที่จะแนะนำข้อบกพร่องโดยบังเอิญรวม.หรือ,ในความคิดเห็นของคุณ! นั่นเป็นเหตุผลว่าทำไมไวยากรณ์จึงไม่มีความหมายและอัฒภาคมีอยู่ทั่วไป

แก้ไข:เป็นตัวอย่างของวิธีง่าย ๆ ที่จะทำให้ตกใจ: ฉันใช้ "non-space" ในความคิดเห็นอย่างใดอย่างหนึ่ง! เมื่อผมปล้นทุกตัวอักษรที่ไม่-BF -จากแหล่งโปรแกรมที่ผมใช้ในการทำที่เก็บไว้ใน โชคดีที่มันไม่ได้ทำลายอะไรเลย แต่ตอนนี้ฉันได้ลบมันเพื่อบันทึกไบต์แล้ว :)

แก้ไขครั้งที่สอง:นานมาแล้วที่ฉันได้สัมผัสสิ่งนี้ฮ่าฮ่า ในอีกคำตอบที่ brainfuck ในเว็บไซต์นี้ฉันสังเกตเห็นว่าฉันใช้เครื่องหมายจุลภาคในเวอร์ชันที่แสดงความคิดเห็นโดยไม่ได้ตั้งใจ เนื่องจากอินพุตหมดแล้วจึงตั้งค่าเซลล์ปัจจุบันเป็น 0 (นี่ขึ้นอยู่กับการใช้งาน แต่จากประสบการณ์ของฉันมันเป็นพฤติกรรมที่พบบ่อยที่สุด) ฉันแก้ไขข้อผิดพลาด แต่มันทำให้ฉันคิด วิธีที่ใช้สำนวนการตั้งค่าเซลล์เป็น 0 คือ[-](คร่าวๆwhile (*p) { *p--; }) ซึ่งมีความยาวสองไบต์ ทุกครั้งที่อ่านอินพุตทั้งหมดฉันสามารถใช้,แทนได้ สิ่งนี้ช่วยฉัน 2 ไบต์ในคำตอบนั้นและ 12 ในคำตอบนี้!

one flag at the very left; will be important later
+>>>>

all nonspace bytes of input separated by 3 empty cells; pin number `n` stored with value `n` plus 16
,[>++++[<-------->-]<[>>>>],]<<<<

test if last pin is 10
[>+<<+<+>>-]<[>+<-]+<+<<[>+>-<<-]>[<+>-]>

[
    if not: find 10 minus the number it is; put that many placeholder pins (cells with value 1) at the end
    ,+++++[>+++++<-]>>[<->-]<[>>>>>[>>>>]+[<<<<]<-]>>[<+>-]<<<
]>


[
    if so: get rid of '0' byte; convert '1' byte to 26 (10 plus 16)
    >>[,<]<<+++++++++<
]<<<

pointer now sitting on the cell with the second greatest pin that was inputted (ie not a placeholder)

;;;;;;;

[
    check for flag placed at the very beginning of the program; if present: break
    -[+>>-<]>
    [
        find ((pin to our right) minus 1) minus pin to our left
        move all pins left of us 4*(that value) cells and insert placeholder pins
        >>[<+<+>>-]<<<<[>+>-<<-]>[<+>-]>[<<[<<<<]>>>>[[<<<<+>>>>-]>>>>]<<<<+>>-]>[>+<-]
    ]

    find first non placeholder pin to our left
    there has to be one because we haven't hit the flag yet
    <<<[-[+>]+<<<<]>>>>-<<<<<
]>>>>>+

we have now added placeholder pins at the end and in the middle; all that's left is the beginning

subtract 17 from lowest pin and put that many placeholders to the left
++++[>----<-]>->[<+>>+<-]<[<<<[<<<<]+[>>>>]<-]>>[<+>-]

subtract 32 from an empty cell 2 to the left of the lowest pin; will be useful later
<[<<<<]>>>++++[<-------->-]>

placeholder pins have the value 1; real pins have a value somewhere between 17 and 26
normalize it by stepping through and setting every pin with value != 1 to 3 (0's ascii code is 2 higher than period so this will make it easier to print later)
[-[,+++>]+>>>[<<<->>]>]<<<<<[>-]>[>>]>>

start writing 32s across the board; hitting every second cell
that's every pin and the cell 2 to the right of each pin
this is done in such a way that it will only halt if adding 32 to a cell sets it to 0; which is why we subtracted 0 from an empty cell earlier
it will catch us and prevent an infinite loop
+[<++++[<++++++++>-]<]

now write 13 to each pin; this adds up to 46 or 48; which are exactly the ascii values we want
>>[+++++++++++++>>>>]

we happen to have made a 14; turn it into a 10 for a newline
<<<<----

we're so close now; i can taste it
we have a list of 10 pins; each one with the ascii value that needs to be written
we have 32 everywhere because we'll need spaces
we even have a newline

the only problem now is that our list looks like this:
;;;;;;;;;;;;;;;;;;;;;;;;
;;1 2 3 4 5 6 7 8 9 10;;
;;;;;;;;;;;;;;;;;;;;;;;;

and we need to print in this order:
;;;;;;;;;;;;;;;;;;;;;;;;
;;7 8 9 10 4 5 6 2 3 1;;
;;;;;;;;;;;;;;;;;;;;;;;;

it's a pretty simple fix
once we print a pin we obviously don't need to remember it any more
so we simply print the last 4 pins on the list; destroying them on the way
then we print the last 3; which have become the ones we want
then two; then one
<+++[<<+<<[<<+<<]+[>>>>]<<<<-]<<<<[-<<<<]

print pins 7 8 9 10
>[.,>>]

print pins 4 5 6
<<<<<[<<<<]<++++++++++<<.<+<<+<<+<<+<<+<[.,>>]

print pins 3 2
<<<<<[<<]>++++++++++<+<<+<<+<..<+<[.,>>]

print the final pin!! :)
<[<<]<...<<.

14

Python 2, 108 ไบต์

def f(x):
 for i in 4,3,2,1:print" "*(4-i)+" ".join(".O"[i*~-i/2-~z in map(int,x.split())]for z in range(i))

f("3 5 7 9 10")โทรหา

iคือหมายเลขแถวโดยที่ 4 คือแถวแรกและ 1 คือหมายเลขสุดท้าย zคือพินที่ n ของแถวนั้นโดยมี 0 หมายความว่าเป็นพินแรกในแถวและi-1หมายความว่าเป็นพินสุดท้ายในแถว

สับหลักคือที่แปลงi*~-i/2-~z (i, z) -> pin numberตัวอย่างเช่น(4, 0) -> 7ในขณะที่พิน 7 เป็นพินแรกในแถว 4 (แถวแรก) ต้นกำเนิดจะเป็นดังนี้:

  • เราต้องการฟังก์ชั่นการiกับขาครั้งแรกในแถวคือi 4 -> 7, 3 -> 4, 2 -> 2, 1 -> 1นี่เป็นที่น่าพอใจ(i**2-i)/2 + 1และทำให้(i**2-i)/2 + 1 + zหมายเลขพินถูกต้องสำหรับการป้อนข้อมูล(i, z)

  • จากนั้นลดความซับซ้อน:

(i**2-i)/2 + 1 + z
  = (i*(i-1))/2 + 1 + z
  = i*~-i/2 + 1 + z
  = i*~-i/2-~z

Pyth , 33 ไบต์

V4~Z-4N+*dNjdm@".O"}+d-11Zrz7U-4N

ลองออนไลน์

โปรแกรมแปลเป็น:

z = input()
Z = 0

for N in range(4):
  Z += 4-N
  print(" "*N + " ".join(".O"[d+11-Z in map(int, z.split())] for d in range(4-N)))

(ขอบคุณ isaacg สำหรับเคล็ดลับ)


รหัส Pyth ของคุณสามารถแข็งแรงเล่นกอล์ฟในสองวิธีV4จะเทียบเท่ากับFNU4และเทียบเท่ากับrz7 mvkcz\
isaacg

ขอบคุณฮ่าฮ่า ฉันยังไม่ชินกับสิ่งที่มีอยู่และไม่ได้อยู่ใน Pyth โดยไม่ต้องตรวจสอบเอกสารตลอดเวลา
Sp3000

107 ไบต์เป็นโปรแกรมแบบเต็ม
FlipTack

9

Pyth , 31

V4+*dNjdm?\O}+7+dZrz7\.rN4~Z-N4

ลองมันนี่

V4 ตั้งค่า a สำหรับลูปโดยที่ N เป็นตัวแปรมากกว่า [0,1,2,3]

*dNจัดเตรียมช่องว่างเริ่มต้นเนื่องจากdเป็นช่องว่าง

เพื่อค้นหาตำแหน่งหมุดใช้+7+dZ- 7 + d + Z

d คือ:

0 1 2 3
 1 2 3
  2 3
   3

ในขณะที่Zเป็น 0 ในบรรทัดแรก -4 ในวินาทีที่สอง -7 ในที่สามและ -9 ในมา นี่คือZเนื่องจากเริ่มต้นเป็น 0 และ~Z-N4ลดลงZ4 จากนั้น 3 จากนั้น 2

}+7+dZrz7จากนั้นจะตรวจสอบว่าสถานที่หมุดอยู่ในการป้อนข้อมูลโดยใช้ rz7เป็นพินที่ต้องการในรูปแบบ list-of-int

จากนั้นจะสร้างOว่ามีอยู่.หรือไม่ นี่คือช่องว่างคั่นด้วยjdและพิมพ์โดยนัย


5

Perl 5: 51 (50 + 1 สำหรับ-p)

การใช้การrตั้งค่าสถานะs///ซึ่งเป็นหนึ่งในการเพิ่ม perl 5 ล่าสุด

#!perl -p
$_="7890
 456
  23
   1
"=~s!\d!'. '^a
x/$&\b/!egr

5

CJam, 48 41 ไบต์

ว้าวนี่มันยาวไปอย่างน่ากลัว

"6789345 12  0"S*7/N*[l~]:(s"O"erA,s"."er

ทดสอบที่นี่

คำอธิบาย

ก่อนอื่นเราสร้างเลย์เอาต์:

"6789345 12  0"       "Push this string.";
               S*     "Riffle with spaces.";
                 7/   "Split into substrings of length 7.";
                   N* "Join with newlines.";

อัตราผลตอบแทนนี้

6 7 8 9
 3 4 5 
  1 2  
   0

และตอนนี้เราแทนที่ตัวละครหลักตามอินพุต:

[l~]                 "Read the input and turn it into an array of integers.";
    :(s              "Decrement each number and turn the array into a string of digits.";
       "O"           "Push this string.";
          er         "Character transliteration, replaces the input digits with O.";
            A,s      "Create the string '0123456789'.";
               "."   "Push this string.";
                  er "Character transliteration, replaces all remaining digits with periods.";

"789A456S23SS1":~S*7/N*[l~]'OerB,'.erสั้นกว่านี้เล็กน้อย
Dennis

@ เดนนิสขอบคุณ ฉันไม่แน่ใจว่าerการออโต้เพื่อจัดเรียงกลับมาแล้ว
Martin Ender

โอ้ใช่. ที่ถูกนำมาใช้ใน 0.6.4 ซึ่งอายุน้อยกว่าคำถามนี้ "789A456S23SS1":~S*7/N*[l~]"O"erB,"."erทำงานได้ดีใน 0.6.2
Dennis

5

Python 2, 97 94

ใช้ฟังก์ชันแปลซึ่งอนุญาตให้หนึ่งทำการแทนอักขระสำหรับอักขระในสตริง เช่นเดียวกับ tr ใน perl ยกเว้นการพิมพ์อีกต่อไป ฉันได้รับรายการเลขทศนิยมโดยสร้างสตริงจาก 9 ถึงกำลัง 99

lambda a:u"7890\n 456\n  23\n   1".translate({ord(n):u'.O'[n+' 'in a+' ']+' 'for n in`9**99`})

5

Javascript, 155

กอล์ฟครั้งแรกอาจสั้นกว่านี้ได้

function f(i){q='replace',s='7 8 9 0\n 4 5 6\n  2 3\n   1';alert(s[q](RegExp(i[q]('10','0')[q](/ /g,'|'),'g'),function(a){return a?'O':a})[q](/\d+/g,'.'))}

โทรด้วย

f('1 2 3 4 5 6 7 8 9 10')
f('1 5 10')
f('')

แก้ไข

ES6 เวอร์ชั่น 130

f=i=>{q='replace',s='7 8 9 0\n 4 5 6\n  2 3\n   1';alert(s[q](RegExp(i[q]('10','0')[q](/ /g,'|'),'g'),a=>a?'O':a)[q](/\d+/g,'.'))}

แก้ไข

รุ่น ES6, 79ล้มเหลว

f=i=>alert('7890\n 456\n  23\n   1'.replace(/\d/g,a=>i.indexOf(a)<0?'. ':'O '))

รุ่น ES6, 72 77, ไม่แจ้งเตือนเพิ่งกลับมา

f=i=>'7890\n 456\n  23\n   1'.replace(/\d/g,a=>i.search(a+'\\b')<0?'. ':'O ')

1
79 และ 72 เสียหายทั้งสองอย่างล้มเหลวในการป้อนข้อมูล 10
edc65

@ edc65 อ๊ะขอบคุณคงแล้ว
แดง -X

โอ้วววววววการใช้คำตัวละครที่มีขอบเขตอย่างฉลาดฉันก็เกือบจะเหมือนกันทุก.matchประการ(ยกเว้นการใช้) นี่คือสง่างามที่สุดของพวกเขาทั้งหมด
ninjagecko

4

ทับทิม, 91

x=(1..10).map{|i|i.to_s==$*[0]?($*.shift;?0):?.}
4.times{|i|puts (x.pop(4-i)*' ').center 8}

เพียงแค่แทนที่อาร์กิวเมนต์บรรทัดคำสั่งด้วย.s และ0s และพิมพ์โดยใช้วงวน 4 รอบ

เวอร์ชันที่อ่านได้

x = (1..10).map do |i|
  if i.to_s == ARGV[0]
    ARGV.shift
    "0"
  else
    "."
  end
end

4.times do |i|
  row = x.pop(4 - i)
  puts row.join(' ').center 8
end

4

GNU sed, 75

  • บันทึกแล้ว 6 ไบต์ขอบคุณ @Jordan

คะแนนรวม 1 พิเศษสำหรับ-rตัวเลือก:

s/^/7 8 9 10\
 4 5 6\
  2 3\
   1 /
:
s/([0-9]+)(.*)\1/O\2/
t
s/[0-9]+/./g

อินพุตผ่าน STDIN:

$ echo 3 5 7 9 10 | sed -rf ./bowling.sed
O . O O
 . O .
  . O
   .    
$ 

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


GNU sed ช่วยให้ป้ายว่างเปล่าดังนั้นคุณสามารถบันทึกไบต์ที่สองโดยทิ้งl s
Jordan

นอกจากนี้ถ้าคุณเปลี่ยน0ไป10ในบรรทัดที่ 2 1/ไป1 /ในบรรทัด 5 และ[0-9]ไป[0-9]+ในสาย 7 และ 9 คุณสามารถวางบรรทัดแรก 4 ไบต์
Jordan

@Jordan Cool - มีคนทำเคล็ดลับแล้ว โอ้เดี๋ยวก่อน ... ;-)
Digital Trauma

3

CJam, 40 39 ไบต์

4,Sf*'-A*[q~]{('ot}/3,{)/(\s}%Sf*W%]zN*

ฉันรู้ว่ามีวิธีที่สั้นกว่าไม่มีเวลาที่จะคิดออกตอนนี้

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

4,Sf*'-A*[q~]{('ot}/3,{)/(\s}%Sf*W%]zN*
4,                                          "Get the array [0,1,2,3]";
  Sf*                                       "Covert each number to that many spaces to";
                                            "get ["", " ", "  ", "   "] array";
     '-A*                                   "String '----------'";
         [q~]                               "Input numbers in an array";
             {    }/                        "For each input number";
              ('ot                          "Put 'o' at the corresponding index";
                    3,                      "Array [0,1,2]";
                      {     }%              "For each of the above number";
                       )                    "Increment the number";
                        /                   "Split the string into pieces of that length";
                         (\s                "Take the first string and join the rest back";
                              Sf*           "Riffle each string in array with space";
                                 W%         "Reverse the array of strings";
                                   ]z       "Zip together the space array and this one";
                                     N*     "Join by new line";

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


3

APL (35)

⊖4 7⍴'.O'[1+⎕∊⍨⍳10]\⍨17110357⊤⍨28/2

ทดสอบ:

      ⊖4 7⍴'.O'[1+⎕∊⍨⍳10]\⍨17110357⊤⍨28/2
⎕:
      1 3 5 6 9 10
. . O O
 . O O 
  . O  
   O   

คำอธิบาย:

  • 17110357⊤⍨28/2: การแทนค่า 28 บิตของ17110357:

          4 7⍴17110357⊤⍨28/2
    0 0 0 1 0 0 0
    0 0 1 0 1 0 0
    0 1 0 1 0 1 0
    1 0 1 0 1 0 1
    
  • \⍨: สำหรับทุกคน0ให้เว้นวรรคและสำหรับทุกคน1ให้นำไอเท็มจากสตริงทางด้านซ้าย

  • ⎕∊⍨⍳10: อ่านบรรทัดจากแป้นพิมพ์และประเมินค่า ( ) จากนั้นตรวจสอบทุกหมายเลขตั้งแต่ 1 ถึง 10 ( ⍳10) ว่ามีอยู่ในอินพุต ( ∊⍨) หรือไม่
  • '.O'[1+... ]: เพิ่ม 1 ทุกค่า (ให้ 1s และ 2s แทน 0s และ 1s) แล้วเปลี่ยนทุก 1 โดย.ทุก 2 Oโดย
  • 4 7⍴: เปลี่ยนสตริงที่สร้างเป็นเมทริกซ์ 4 คูณ 7
  • : พลิกแนวนอน

3

PowerShell: 109

ข้อมูลเข้าเป็น $ i

(7..10),(4..6),(2,3),1|%{$c=0}{$_|%{$o=(" "*$c++)}{$o="$o $(if($i.split() -contains $_){'O'}else{'.'})"};$o}

นั้นน่าสนุก. เรียนรู้สิ่งต่างๆมากมายเกี่ยวกับการทำงานของไปป์ไลน์เช่นกัน


3

Haskell: 163 160 ไบต์

stdinบรรทัดนี้ยอมรับของพื้นที่แยกตัวเลขจาก

m=map
y?x|x`elem`y="O "|0<1=". "
f y=putStr.unlines.zipWith(++)(m(`replicate`' ')[0..])$m(concat.m(y?))[[7..10],[4..6],[2,3],[1]]
main=getLine>>=f.m read.words

Ungolfed:

layout :: [[Int]]
layout = [[7,8,9,10]
         ,[ 4,5,6  ]
         ,[  2,3   ]
         ,[   1    ]
         ]

indentBy :: Int -> String
indentBy n = replicate n ' '

indentLines :: [String] -> [String]
indentLines
  = zipWith (++)
            (map indentBy [0..])

bowling :: [Int] -> String
bowling pins
  = unlines
  . indentLines
  $ map (concatMap showPlace)
        layout
  where
    showPlace :: Int -> String
    showPlace index
      | index `elem` pins = "O "
      | otherwise         = ". "

parseInput :: String -> [Int]
parseInput = map read . words

main :: IO ()
main = do
  pins <- fmap parseInput getLine
  putStr (bowling pins)

และโบนัส:

C: 250 ไบต์

รุ่นนี้คาดว่าอาร์กิวเมนต์บรรทัดคำสั่งจะเป็นรายการของตัวเลข

#define w int
main(w
z,char**a){w
b[10]={1,3,2,6,5,4,10,9,8,7};w
q=9;for(w
k=4;k>0;--k){w
i;for(i=0;i<4-k;++i)printf(" ");for(i=0;i<k;++i,--q){w
g=0;w
c;for(w
p=1;p<z;++p){sscanf(a[p],"%d",&c);g|=b[q]==c;}c=g?'O':'.';printf("%c ",c);}printf("\n");}}

2

Perl, 73

$_="7 8 9 10\n 4 5 6\n  2 3\n   1";for$v(<>=~/\d+/g){s/$v/O/g};s/\d+/./g;print

และวิธีโบนัสที่โง่เขลาที่ไม่ได้ทะลักออกไป 90 ตัวอักษร:

srand(1488068);$i=<>;print+(($i=~/$_\b/?O:".")." "x rand 5)=~s/  /\n /r for 7..10,4..6,2,3,1

2

Mathematica, 109 ไบต์

ฟังก์ชั่น:

f=(i=0;Reverse@Table[Row@Table[If[MemberQ[ToExpression/@StringSplit@#,++i],O,"."],{n}],{n,4}]~Column~Center&)

โทรโดย:

f@"3 5 7 9 10"

หากอนุญาตให้ใช้ฟังก์ชันที่ไม่ระบุชื่อสิ่งนี้สามารถย่อให้เหลือ105 ไบต์ :

i=0;Reverse@Table[Row@Table[If[MemberQ[ToExpression/@StringSplit@#,++i],O,"."],{n}],{n,4}]~Column~Center&

หากอินพุตไม่จำเป็นต้องเป็นสตริงที่คั่นด้วยช่องว่าง แต่อาจเป็นอาเรย์ของตัวเลขในรูปแบบ{3,5,7,9,10}สิ่งนี้สามารถทำให้สั้นลงได้ถึง79 ไบต์ :

i=0;Reverse@Table[Row@Table[If[MemberQ[#,++i],O,"."],{n}],{n,4}]~Column~Center&


2

Rebol - 117

s: array/initial 10"."b:""foreach n to-block input[s/:n:"0"]for n 4 1 -1[prin b print take/last/part s n append b" "]

Ungolfed:

s: array/initial 10 "."
b: ""
foreach n to-block input [s/:n: "0"]
for n 4 1 -1 [prin b print take/last/part s n append b " "]

2

Brainfuck, 179 ไบต์

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

จัดรูปแบบ:

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

ต้องการอินพุตโดยไม่ขึ้นบรรทัดใหม่

ลองออนไลน์

เทปถูกเริ่มต้นด้วยสิบโหนดซึ่งแต่ละอันมีหนึ่งตามด้วยศูนย์ หนึ่งคือค่าเริ่มต้นของพินและศูนย์อำนวยความสะดวกในการนำทางและทำหน้าที่เป็นตัวยึดสำหรับอักขระช่องว่าง สำหรับแต่ละหมายเลขในอินพุตหมุดนั้นจะเพิ่มขึ้น 3 ทราบว่าord('O') - ord('.') = 33และในระหว่างขั้นตอนการพิมพ์ค่าขาจะถูกคูณด้วย 11 (คูณนี้ยังใช้ในการสร้างตัวละครของพื้นที่.) คำสั่งของหมุดจากซ้ายไปขวาบนเทปเป็นเพียงขึ้นไป1 10หากอินพุตจบลงด้วยการ10ที่มีการแก้ไขจะทำตั้งแต่ได้รับการรักษาครั้งแรกเป็น101

หลังจากอินพุตได้รับการประมวลผลแล้วจะมีการลบค่าลบหลังจากแต่ละแถว จากนั้นแถวจะถูกพิมพ์ในลูปด้วยจำนวนช่องว่างนำที่กำหนดโดยจำนวนแถวที่ประมวลผลก่อนหน้านี้


1

Clojure 216 ตัวอักษร (ฮึ)

ฉันแน่ใจว่านี้สามารถเล่นกอล์ฟต่อไป

(let[s(map #(dec(read-string %))(.split(slurp *in*)" +"))](println(apply str(replace(apply hash-map(interleave(map #(char(+ 48 %))(range 10))(map #(if(some #{%}s)"O"".")(range 10))))"6 7 8 9\n 3 4 5\n  1 2\n   0"))))

ใช้แบบนี้:

echo -n "2 4 9 8 10 5" | clojure a-file-which-contains-this-program.clj

1

AWK: 96 ไบต์

{gsub(/ /,"");a="6 7 8 9\n 3 4 5\n  1 2\n   0";gsub("["$0"]","O",a);gsub(/[0-9]/,".",a);print a}

บันทึก:

  • ตัวคั่นช่องว่างในค่าอินพุตเป็นตัวเลือก (แต่ก็สามารถใช้งานได้กับพวกเขาตามต้องการ)
  • ตัวเลขไม่จำเป็นต้องเป็นระเบียบ
  • อินพุตถูกอ่านบน STDIN

1

C # - 192 ไบต์

เพราะ C #!

ฉันเริ่มพยายามสร้างผลลัพธ์ด้วยคณิตศาสตร์ แต่วิธีการแทนที่โทเค็นในสตริงดูเหมือนง่ายที่สุดสำหรับภาษาระดับสูงกว่า การพึ่งพา Linq นั้นค่อนข้างยาว แต่ก็ยังสั้นกว่าการรักษาตัวนับและทำการตรวจสอบระยะไกล

using System.Linq;class A{static void Main(string[]a){var s=@"7 8 9 0
 4 5 6
  2 3
   1";for(int c=11;c-->1;)s=s.Replace((char)(48+c%10),a.Contains(""+c)?'O':'.');System.Console.Write(s);}}

แก้ไข: ผลตอบแทนบรรทัด Unix (-3 ไบต์)


1

สกาลา150 148

def t(n:Any)=("G H I J D E F   B C     A"/:('A'to'J'))((j,i)=>j.replace(i,(if((n+" ").indexOf((i-64)+" ")>=0)'0'else'.'))).grouped(7).maxBy(println)

ยอมรับชุดของสตริงที่คั่นด้วยช่องว่าง


1

JavaScript ES6, 78 ไบต์

F=i=>'7890\n 456\n  23\n   1'.replace(/\d/g,e=>'0.'[+!~i.search(e+'\\b')]+' ')

ใช้ตัวอย่างต่อไปนี้เพื่อทดสอบ มันใช้การแจ้งเตือนและการแจ้งเตือนและสัญกรณ์ฟังก์ชั่นปกติเพื่อความสะดวกในการทดสอบ

i=prompt()
alert('7890\n 456\n  23\n   1'.replace(/\d/g,function(e){return'0.'[+!~i.search(e+'\\b')]+' '}))


1

VB / Basic-229

เป้าหมายของฉันคือการเอาชนะ java ^^

Dim f
Sub m()
f = " 1 2 3 4 5 6 7 8 9 10"
a = l(7, 10) + l(4, 6) + l(2, 3) + l(1, 1)
MsgBox a
End Sub
Function l(b, e)
r = Space(3 - (e - b))
For i = b To e
r = r + IIf(InStr(f, Str(i)), "0 ", ". ")
Next
l = r + vbCr
End Function

แก้ไข vbCr แทน chr (13)

r = r + Space (3 - (e - b))

ชวเลขถ้า

การใช้ฟังก์ชั่นแทนการย่อย

sub MAIN () -> sub m ()


คุณช่วยกรุณารวมความยาวรหัสเป็นไบต์ในคำตอบของคุณ?
ProgramFOX

ฉันจะ แต่ฉันยังคงเล่นซอน้อยกับรหัส
dwana

1

Java - 223 ตัวอักษร

public class Pins {public static void main(String[] args) {String s = "7 8 9 0\n 4 5 6\n  2 3\n   1";for (String arg : args) {s = s.replace(arg.replace("10", "0"), "o");}s = s.replaceAll("\\d", ".");System.out.println(s);}}

ฉันเคยชอบวิธีนี้ในการทำมันจากนั้นฉันก็รู้ว่าฉันต้องการแฮ็กขนาดเล็ก แต่ก็ยังคงเหมือนโซลูชั่นของฉัน

public class Pins {
public static void main(String[] args) {
    String s = "7 8 9 0\n 4 5 6\n  2 3\n   1";
    for (String arg : args) {
        s = s.replace(arg.replace("10", "0"), "o");
    }
    s = s.replaceAll("\\d", ".");
    System.out.println(s);
}
}

1

K, 57 ไบต์

ยังไม่แข่งขันมาก แต่เป็นการเริ่มต้น:

`0:((!4)#\:" "),',/'|0 1 3 6_(". ";"O ")@|/(1+!10)=/:(),.

ตัวอย่างการใช้งาน:

  `0:((!4)#\:" "),',/'|0 1 3 6_(". ";"O ")@|/(1+!10)=/:(),."3 5 7 9 10"
O . O O 
 . O . 
  . O 
   . 
  `0:((!4)#\:" "),',/'|0 1 3 6_(". ";"O ")@|/(1+!10)=/:(),."1"
. . . . 
 . . . 
  . . 
   O 

ฉันเริ่มต้นด้วยการประเมินสตริงอินพุตด้วย.- โชคดีที่ตัวเลขที่คั่นด้วยช่องว่างเป็นรายการที่ถูกต้องตามตัวอักษรใน K โดยการเตรียมรายการว่างกับผลลัพธ์ของ eval ฉันสามารถมั่นใจได้ว่ามันเป็นรายการแม้ในกรณีของพินเดียว จากนั้นฉันสร้างเวกเตอร์บูลีนที่แสดงตำแหน่งของพิน:

  (1+!10)=/:3 5 7 9 10
(0 0 1 0 0 0 0 0 0 0
 0 0 0 0 1 0 0 0 0 0
 0 0 0 0 0 0 1 0 0 0
 0 0 0 0 0 0 0 0 1 0
 0 0 0 0 0 0 0 0 0 1)
  |/(1+!10)=/:3 5 7 9 10
0 0 1 0 1 0 1 0 1 1

จากนั้นฉันสร้างดัชนีลงในรายการสตริงเพื่อรับอักขระเว้นวรรคสำหรับตำแหน่งพินแต่ละตำแหน่ง

  (". ";"O ")@0 0 1 0 1 0 1 0 1 1
(". "
 ". "
 "O "
 ". "
 "O "
 ". "
 "O "
 ". "
 "O "
 "O ")

ฉันฝานลำดับนั้นเป็นแถว ( _) ย้อนกลับพวกเขา ( |) และเข้าร่วมแต่ละส่วน ( ,/'):

  ,/'|0 1 3 6_(". ";"O ")@0 0 1 0 1 0 1 0 1 1
("O . O O "
 ". O . "
 ". O "
 ". ")

ตอนนี้มันเริ่มที่จะดูเหมือนรูปแบบที่เราต้องการ สิ่งที่เหลือคือการตรึงในช่องว่างนำไปสู่แต่ละแถว ( ((!4)#\:" "),') และพิมพ์แถวเพื่อ stdout ( 0:)


1

Pascal (FPC) , 165 ไบต์

var f:string='. . . .'#10' . . .'#10'  . .'#10'   .';i:byte;z:array[1..10]of byte=(25,18,20,10,12,14,1,3,5,7);begin repeat read(i);f[z[i]]:='O'until eof;write(f)end.

ลองออนไลน์!

ใช้ตัวเลขจากอินพุตมาตรฐานพิมพ์รูปแบบไปยังเอาต์พุตมาตรฐาน

Pascal (FPC) , 175 ไบต์

function f(q:array of byte):string;var i:byte;z:array[1..10]of byte=(25,18,20,10,12,14,1,3,5,7);begin f:='. . . .'#10' . . .'#10'  . .'#10'   .';for i in q do f[z[i]]:='O'end;

ลองออนไลน์!

ฟังก์ชั่นที่ทำสิ่งเดียวกันโดยรับตำแหน่งพินและส่งคืนสตริงที่จัดรูปแบบ


1

Powershell, 84 ไบต์

$p='6789
 345
  12
   0'
-split$args|%{$p=$p-replace($_-1),'O '}
$p-replace'\d','. '

สคริปต์ทดสอบ:

$f = {

$p='6789
 345
  12
   0'
-split$args|%{$p=$p-replace($_-1),'O '}
$p-replace'\d','. '

}

# one space at the end of each line with pins
@(
,("1 2 3 4 5 6 7 8 9 10",
@"
O O O O 
 O O O 
  O O 
   O 
"@)

,("7 10",
@"
O . . O 
 . . . 
  . . 
   . 
"@)

,("3 5 7 9 10",
@"
O . O O 
 . O . 
  . O 
   . 
"@)

,("1",
@"
. . . . 
 . . . 
  . . 
   O 
"@)
) | % {
    $s, $expected = $_
    $result = &$f $s
    $result-eq$expected
    $result
}

เอาท์พุท:

True
O O O O
 O O O
  O O
   O
True
O . . O
 . . .
  . .
   .
True
O . O O
 . O .
  . O
   .
True
. . . .
 . . .
  . .
   O

0

Java - 371 316 294 ตัวอักษร

public class Bowling{public static void main(String[] a){boolean[] o=new boolean[10];int i;for(String s:a){i=Integer.parseInt(s)-1;o[i]=true;}for(int j=9;j>=0;j--){p((o[j]?"0 ":". "));p(j==6?"\n ":"");p(j==3?"\n  ":"");p(j==1?"\n   ":"");}p("\n");}static void p(String l){System.out.print(l);}}

ครั้งแรกที่ทำสิ่งนี้ฉันค่อนข้างแน่ใจว่ามันเป็นเรื่องน่าอาย แต่ฉันเป็นสามเณร นอกจากนี้ยังใช้งานได้เมื่อไม่ได้สั่งหมายเลข การกำหนดหมายเลขผิด แต่ฉันไม่มีเวลาที่จะหาวิธีแก้ไข ...

public class Bowling {
    public static void main(String[] args) {
        boolean[] ordened = new boolean[10];
        int i;
        for (String s : args) {
            i = Integer.parseInt(s) - 1;
            ordened[i] = true;
        }
        for (int j = 9; j >= 0; j--) {
            p((ordened[j] ? "0 " : ". "));
            p(j == 6 ? "\n " : "");
            p(j == 3 ? "\n  " : "");
            p(j == 1 ? "\n   " : "");
        }
        p("\n");
    }
    static void p(String l){
        System.out.print(l);
    }
}

อินพุตถูกกำหนดโดยjava B 1 2 3 5 10ตัวอย่างเช่น ผลลัพธ์จะเป็น:

0 . . . 
 . 0 . 
  0 0 
   0 

1
การกำหนดหมายเลขผิด
เครื่องมือเพิ่มประสิทธิภาพ

ฉันจะพยายามแก้ไข
Haroen Viaene

0

Japt -Rx , 29 19 18 17 ไบต์

5ÇÆ".O"gUø°TøÃÔû

ลองมัน


คำอธิบาย

                      :Implicit input of integer array U
5Ç                    :Map each Z in the range [0,5)
  Æ                   :  Map the range [0,Z)
          °T          :    Increment T (initially 0)
        Uø            :    Does U contain T? (false=0, true=1)
   ".O"g              :    Get the character in the string ".O" at that index
            Ã         :  End mapping
             ¸        :  Join with spaces
              Ã       :End mapping
               Ô      :Reverse
                û     :Centre pad each element with spaces to the length of the longest
                      :Implicitly join with newlines, trim (not strictly necessary) and output
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.