มาดูการกระทำกัน!


24

ใครไม่รักภาพยนตร์แอ็คชั่นที่มีรถยนต์ที่มีเสียงดังโดยเฉพาะอย่างยิ่งภาพยนตร์ที่มีปัญหามากมาย ใครไม่ชอบช็อตแอ็คชั่นในศิลปะ ASCII?

ฉากคือ:

รถสองคันเริ่มที่ด้านตรงข้ามของถนนตรง (โดยมีช่องว่างระหว่าง 60) พวกเขาเริ่มขับต่อกันด้วยความเร็วคงที่ รถไปทางซ้ายไดรฟ์ที่ 1 ช่องว่างต่อวินาทีและหนึ่งไปทางขวาไดรฟ์ 2 ช่องว่างต่อวินาที

เห็นได้ชัดว่ารถยนต์ไม่สามารถผ่านกันและกันดังนั้นสำหรับn ≥ 20ฉากจะมีรถสองคันชนกับหมวกขึ้นในตำแหน่งที่เกิดความผิดพลาด

ในฐานะที่เป็นคนรักภาพยนตร์ฉันต้องการหยุดฉากชั่วคราวเพื่อเพลิดเพลินกับความงามของมัน

ได้รับจำนวนเต็มn(อาร์กิวเมนต์ของฟังก์ชันหรือ STDIN) ซึ่งแทนจำนวนวินาทีจากจุดเริ่มต้นของฉากแสดงฉากในขณะนั้น

นี่คือฉากเริ่มต้นโดยมี 60 ช่องว่างระหว่างล้อหน้า:

  __                                                                __
_/  \_                                                            _/  \_
o    o                                                            o    o

นี่คือฉากหลังจาก 11 วินาที:

             __                               __
           _/  \_                           _/  \_
           o    o                           o    o

และนี่คือสิ่งที่ดูเหมือนว่าหลังจากการแข่งขัน (โปรดทราบว่า bonnets ขึ้นหลังจากความผิดพลาด):

                      __    __
                    _/  \/\/  \_
                    o    oo    o

ฉันสนใจที่จะดูการชนกันของรถสองคันเท่านั้นดังนั้นช่องว่างบรรทัดใหม่ + ++ จึงไม่สำคัญ

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


2
มันบอกเป็นนัย ๆ แต่เป็นความผิดพลาด (ยุค 20) เพียงครั้งเดียวที่ bonnets จะขึ้น/ \ เมื่อเทียบกับลง_ _?
Sp3000

2
@StewieGriffin Nice one !!
Luis Mendo

คำตอบ:


10

CJam, 68 66 ไบต์

liKe<:M"  __  _/  \_o    o"6/f{\S*1$+60M3*-S*@N}:+MK={58'/t59'\t}&

ลองออนไลน์

ใครก็ตามที่เห็นจุดเริ่มต้นของรหัสจะต้องแน่ใจliKe!

คำอธิบาย:

li      Get input n and convert to integer.
Ke<     Cap n at 20.
:M      Save in variable M for multiple use later.
"  __  _/  \_o    o"
        Car (18 characters).
6/      Split into 3 lines of 6 characters.
f{      Map lines with parameter.
  \       Swap n to top.
  S*      Create string with n spaces for left margin.
  1$      Copy one car line to top. Keep original for second car
  +       Concatenate the spaces and car.
  60M3*-  Calculate 60-3*n, which is the amount of space between cars.
  S*      Create string with 60-3*n spaces.
  N       Add a newline.
}       End of line mapping.
:+      Concatenate all output pieces into single string.
MK=     Check if capped n is equal to 20.
{       If equal, replace hoods with crashed versions.
  58'/t   '/ at position 58.
  59'\t   '\ at position 59.
}&      End of conditional block for crashed hoods.

อักขระสี่ตัวแรกเป็นข้อความอ่อนเกินสำหรับผู้ลงคะแนนหรือไม่
John Dvorak

@JanDvorak แน่นอน! :) ก็ไม่ได้อ่อนเกินจริงอีกต่อไปเพราะฉันชี้ให้เห็น ไม่มีความตั้งใจดั้งเดิม แต่ฉันสังเกตเห็นได้ทันทีเมื่อฉันวางรหัสลงในคำตอบ
Reto Koradi

14

เขาวงกต , 394 386 ไบต์

ฉันภูมิใจแนะนำ ...

<}74}}:23}29}59}}}}}}}:111_}}}}:::::::23_}:111
?                        @
:" }}_47}_95    3""""""""(
 _ :       }    _   }    {=}
 2 23_}29_ _    ;   :      \
 0       ; 3  +_( 3_"  60{ .{.{.
"-_95:}}"" 2  0 ) 2 "  _ _ {
""       _ :  2 _ ."(; } 3 .{
 ;_92}_47} :  _ 0    = : *  ;
           : "" 2 {.{{ . -""(
}}:59_}}:::: "";_ .    {  _ "
}             "   {.{.{.  32.
}}}_95:}}}}_20-

... เขาวงกต esolang สองมิติใหม่ของฉัน! รหัสข้างต้นไม่ค่อยดีนักกอล์ฟ (มี 161 ช่องและ 25 NOP ดังนั้นเลย์เอาต์ที่ดีกว่านี้อาจทำให้สั้นลงได้มาก) แต่อย่างน้อยฉันก็สามารถแสดงให้เห็นว่าภาษานี้ใช้งานได้สำหรับงานที่ไม่สำคัญ :)

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

ก่อนอื่นภาพรวมอย่างรวดเร็วของภาษา:

  • เขาวงกตทำงานสองกองหลักและเสริมซึ่งสามารถถือจำนวนเต็มที่ลงนามโดยพลการ ที่ด้านล่างของทั้งสองกองมีศูนย์เป็นจำนวนอนันต์
  • คำสั่งคือตัวละครแต่ละตัวในตาราง 2D และพวกเขากลายเป็นเขาวงกต (นั่นคือตัวละครที่ไม่รู้จักโดยเฉพาะช่องว่างเป็นผนัง) "เป็น NOP ซึ่งไม่ใช่กำแพงและสามารถเป็นประโยชน์ในการขยายเส้นทางบางอย่างในรหัส เมื่อเทียบกับภาษา 2D อื่น ๆ อีกมากมายขอบจะไม่พันกัน
  • ตัวชี้คำสั่ง (IP) เริ่มต้นที่อักขระที่ไม่ใช่ตัวแรก (ตามลำดับการอ่าน) เลื่อนไปทางขวา @ยุติโปรแกรม
  • หากเป็นไปได้ IP จะตามด้วยทางเดิน (เช่นรอบ ๆ โค้ง) หาก IP มีหลายเซลล์ที่จะย้ายไปโดยทั่วไปแล้วจะเลี้ยวซ้ายถ้าด้านบนสุดของสแต็กหลักเป็นลบให้ย้ายไปข้างหน้าตรงถ้าเป็นศูนย์หรือเลี้ยวขวาถ้าเป็นบวก เมื่อ IP ชนกับกำแพงมันจะกลับทิศทาง (มีรายละเอียดปลีกย่อยอีกเล็กน้อย แต่ไม่ควรสำคัญสำหรับรหัสนี้) นี่เป็นวิธีเดียวที่จะใช้โฟลว์ควบคุม
  • นอกเหนือจากคำสั่งการคำนวณทางคณิตศาสตร์และสแต็คสแต็คซอร์สโค้ดสามารถแก้ไขได้ที่รันไทม์พร้อมคำสั่งสี่คำสั่ง>v<^ซึ่งจะเลื่อนแถวหรือคอลัมน์ของซอร์สโค้ดโดยวงจรหนึ่งเซลล์ แถวหรือคอลัมน์ใดที่ได้รับผลกระทบขึ้นอยู่กับส่วนบนสุดของสแต็ก หากมีการเลื่อนแถวหรือคอลัมน์ของ IP มันจะย้ายไปพร้อมกับการเปลี่ยนแปลง ทำให้สามารถข้ามจากขอบหนึ่งของซอร์สโค้ดไปยังอีกขอบหนึ่งได้

ตอนนี้สำหรับความท้าทายนี้โดยเฉพาะนี่คือแนวคิดทั่วไปของอัลกอริทึม:

  • ดันปลายรถยนต์ขึ้นไปที่หมวก (เช่น/ \_o oo o) ลงบนสแต็คเสริม
  • อ่านอินพุตและพิจารณาว่าจะผลักดัน__หรือ/\ถัดไป
  • ดันส่วนที่เหลือของรถยนต์ (เช่น__ __ _/ \และสองช่องว่างนำ) ลงบนสแต็กเสริม
  • ยึดอินพุตให้มีค่าสูงสุด20เรียกว่าNนี้
  • ตอนนี้ทำ 3 ครั้งต่อไปนี้:
    • พิมพ์ช่องว่างN
    • พิมพ์ 6 ตัวอักษรที่เก็บไว้
    • พิมพ์ 60 - 3 * Nช่องว่าง
    • พิมพ์ 6 ตัวอักษรที่เก็บไว้
    • พิมพ์ newline

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

}74}}:23}29}59}}}}}}}:111_}}}}:::::::23_}:111<

การเลื่อนแถวนี้มีประโยชน์สำหรับการเล่นกอล์ฟเมื่อคุณต้องการเริ่มต้นด้วยรหัสเชิงเส้นจำนวนมาก

ต่อไปเราอ่านอินพุตและดันหมวกที่ถูกต้อง:

?  
:" 
 _ 
 2 
 0       ;
"-_95:}}""
""       _
 ;_92}_47}

บิตทางด้านซ้ายที่มี NOP สามรายการจะส่งผลลัพธ์เชิงลบตามสาขาด้านบนและผลลัพธ์ที่ไม่ใช่เชิงลบตามสาขาด้านล่าง ด้านขวาพวกเขาจะกลับมารวมกัน

ต่อจากนี้ไปยังส่วนที่เป็นเส้นตรงขนาดใหญ่อีกอัน (ซึ่งอาจจะเล่นกอล์ฟได้มากพร้อมกับเคล็ดลับการเปลี่ยนแถวอื่น):

   }}_47}_95 
   :       } 
   23_}29_ _ 
           3 
           2 
           : 
           : 
           : 
}}:59_}}:::: 
}
}}}_95:}}}}

สิ่งนี้จะผลักดันส่วนที่เหลือของรถยนต์ไปยังสแต็คเสริม

ต่อไปเราคำนวณmin(20, input)ซึ่งคล้ายกับสาขาแรก:

                ;
              +_(
              0 )
              2 _
              _ 0
             "" 2
             "";_
              "  
           _20-

ในที่สุดเรามีการวนรอบที่ทำงานสามครั้งเพื่อพิมพ์บรรทัด การวนซ้ำของลูปแต่ละครั้งมีลูปขนาดเล็ก (3x3) สองห่วงเพื่อพิมพ์ช่องว่างรวมทั้งสองส่วนเพื่อพิมพ์อักขระ 6 ตัวจากสแต็กเสริม:

                         @
                3""""""""(
                _   }    {=}
                    :      \
                  3_"  60{ .{.{.
                  2 "  _ _ {
                  ."(; } 3 .{
                     = : *  ;
                  {.{{ . -""(
                  .    {  _ "
                  {.{.{.  32.

เคล็ดลับที่ดีอย่างหนึ่งที่ฉันอยากจะให้ความสนใจคือ.{.{.ด้านขวา นี่คือจุดจบดังนั้นนอกเหนือจาก.ตอนท้ายรหัสจะถูกดำเนินการสองครั้งหนึ่งครั้งไปข้างหน้าและย้อนหลังอีกครั้ง นี่เป็นวิธีที่เรียบร้อยในการย่อรหัส palindromic (ตัวจับคือคุณต้องตรวจสอบให้แน่ใจว่า IP ใช้การเลี้ยวที่ถูกต้องเมื่อออกจากทางตันอีกครั้ง)


ถาม: เขียนโปรแกรมใน Labyrinth โดยไม่มีแบบอักษร monospaced;)
Beta Decay

1
@BetaDecay ฟังดูเจ็บปวดในทุกภาษา ;)
Martin Ender

7

Python 2.7 167 164 159 ไบต์

n=input();s,x=60-3*n,min(n,20)
for e in['  _',"_/ ","o  "]:p=e+(e[::-1],(' \_',' \/')[s<1])['/'in e];print" "*x+p+" "*s+(p[-1]+p[1:-1]+p[0]).replace("//","\/")

สิ่งนี้รับอินพุตจาก stdin
การสาธิตที่นี่
การทดสอบนี้ -

$ ./cars.py
0
  __                                                                __  
_/  \_                                                            _/  \_
o    o                                                            o    o

$ ./cars.py
11
             __                               __  
           _/  \_                           _/  \_
           o    o                           o    o

$ ./cars.py
20
                      __    __  
                    _/  \/\/  \_
                    o    oo    o

2
(n,20)[n>20]min(n,20)เป็นเพียง
orlp

@orlp ขอบคุณ :)
Kamehameha

คุณสามารถบันทึกไบต์โดยการแทนที่ด้วย(' \_',' \/')[s<1] ' \\\\_/'[s<1::2]
kirbyfan64sos

นอกจากนี้lจำเป็นหรือไม่ คุณสามารถทำได้for e in [' _',"_/ ","o "]:และลบlทั้งหมดหรือไม่
kirbyfan64sos

@ kirbyfan64sos ใช่lไม่จำเป็นตอนนี้ ฉันต้องใช้มันในเวอร์ชันก่อนหน้า ขอบคุณ :)
Kamehameha

5

R, 191 ไบต์

เกี่ยวกับดีเท่าที่ฉันจะได้รับตอนนี้ ใช้เวลาไม่กี่วินาทีจาก STDIN และแมวไปยัง STDOUT

n=scan();p=paste0;formals(p)$collapse='';cat(sprintf(c('%s  __  %s  __  ','%s_/  \\_%s_/  \\_','%s_/  \\/%s\\/  \\_','%so    o%so    o')[-3+(n<21)],p(rep(' ',n)),p(rep(' ',60-n*3))),sep='\n')

คำอธิบาย

# Get the input from STDIN.  Requires a single number 0-20
n=scan();
# alias paste0 and set collapse default to ''
p=paste0;
formals(p)$collapse='';
# output
cat(
    # sprintf to format the strings
    sprintf(
        # vector of strings to format                                                      picks which bonnet to remove
        c('%s  __  %s  __  ','%s_/  \\_%s_/  \\_','%s_/  \\/%s\\/  \\_','%so    o%so    o')[-3+(n<21)]
        # move left car by 1
        ,p(rep(' ',n))
        # move right car by 2
        ,p(rep(' ',60-n*3))
    )
,sep='\n')

การทดสอบ

> n=scan();p=paste0;formals(p)$collapse='';cat(sprintf(c('%s  __  %s  __  ','%s_/  \\_%s_/  \\_','%s_/  \\/%s\\/  \\_','%so    o%so    o')[-3+(n==20)],p(rep(' ',n)),p(rep(' ',60-n*3))),sep='\n')
1: 0
2: 
Read 1 item
  __                                                                __  
_/  \_                                                            _/  \_
o    o                                                            o    o
> n=scan();p=paste0;formals(p)$collapse='';cat(sprintf(c('%s  __  %s  __  ','%s_/  \\_%s_/  \\_','%s_/  \\/%s\\/  \\_','%so    o%so    o')[-3+(n==20)],p(rep(' ',n)),p(rep(' ',60-n*3))),sep='\n')
1: 5
2: 
Read 1 item
       __                                                 __  
     _/  \_                                             _/  \_
     o    o                                             o    o
> n=scan();p=paste0;formals(p)$collapse='';cat(sprintf(c('%s  __  %s  __  ','%s_/  \\_%s_/  \\_','%s_/  \\/%s\\/  \\_','%so    o%so    o')[-3+(n==20)],p(rep(' ',n)),p(rep(' ',60-n*3))),sep='\n')
1: 20
2: 
Read 1 item
                      __    __  
                    _/  \/\/  \_
                    o    oo    o
> 

เยี่ยมมาก! formals()และใช้ฉลาดของ :)
Alex A.

@AlexA มันช่วยฉันได้เพียงคนเดียวในตอนท้าย แต่การได้เห็นทั้งสองทรุดลงนั้นเป็นเรื่องที่น่ารังเกียจเล็กน้อย
MickyT

คุณและฉันมีคำจำกัดความที่แตกต่างกันมากสำหรับ
Alex A.

4

CJam, 120 ไบต์

q~20e<_["   "]*\[" _o"]\[" / " "_  " "_  " " \ " ]\[19>" /o"" _o"?]60 3 5$,*-["   "]*[0$," _o"" \o"?]3$[" _o"]+++++++zN*

การสาธิต

Ungolfed:

q~        e# Read the input
20e<      e# min(20, input) (let's call it N)
_         e# Duplicate the value on the stack
["   "]   e# Push 3 blank spaces
*         e# Create N arrays of 3 blank spaces
\         e# Swap the top two stack elements
[" _o"]   e# Push the " _o" string to stack
\         e# Swap the top two stack elements
[" / " "_  " "_  " " \ " ]
\         e#
[         e# If N is greater than 20 then push the array [" /o"],
  19      e# otherwise [" _o"]
  >
  " /o"
  " _o"
  ?
]
60        e# 60 is the maximum space between the two cars
3         e# 3 is the number of blocks covered per move
5$,       e# Take the 6th element from the stack (an array of size N)
*-        e# Compute the remaining blocks (60 - 3 * N)
["   "]   e# Add an array of 3 blank spaces
*         e# Multiply it to fit the remaining blocks
[0$," _o"" \o"?] e# Add the (broken?) front part of the second car
3$        e# Copy the middle part of the car
[" _o"]   e# Append the right side of the car
+++++++   e# Concatenate all arrays
z         e# Transpose the array
N*        e# Join the array using new lines

การสาธิต


คุณควรจะสามารถบันทึกรหัสได้เล็กน้อยโดยไม่ต้องมีสายอักขระแยกต่างหากสำหรับรถด้านซ้ายและด้านขวาเนื่องจากโดยทั่วไปแล้วพวกเขาจะเหมือนกัน (ยกเว้นกรณีความผิดพลาด) การปรับปรุงภายในสองสามอย่าง: ตัวแปรJมีค่า 19, Kมีค่า 20, บันทึกอักขระแต่ละค่าสำหรับค่าคงที่เหล่านั้น ถ้าคุณต้องการอาร์เรย์ที่มีองค์ประกอบหนึ่งคุณสามารถใช้aโอเปอเรเตอร์เพื่อตัดองค์ประกอบแทนการใช้วงเล็บคู่
Reto Koradi

ขอบคุณสำหรับเคล็ดลับและสำหรับรหัส CJam ที่โพสต์ จริงๆแล้วมันช่วยให้เห็นการปรับปรุงอื่น ๆ มากมาย
Razvan

4

PHP, 160 155 ไบต์

$f=str_repeat;echo$l=$f(' ',$s=min(max($argv[1],0),20)),"  __  ",
$m=$f(' ',$r=60-3*$s),"  __\n{$l}_/  \\",$r?_.$m._:'/\\',
"/  \\_\n{$l}o    o{$m}o    o\n";

รหัสจะแสดงที่นี่ใน 3 บรรทัดเพื่อให้พอดีกับรูปแบบของกล่องรหัส ไม่จำเป็นต้องขึ้นบรรทัดใหม่

รหัส ungolfed:

// The number of seconds, between (and including) 0 and 20
$sec  = min(max($argv[1], 0), 20);
$rest = 60 - 3 * $sec;

$left = str_repeat(' ', $sec);      // left padding
$mid  = str_repeat(' ', $rest);     // space in the middle
$c = $rest ? '_'.$mid.'_' : '/\\';

echo($left.'  __  '.$mid."  __\n");
echo($left.'_/  \\'. $c ."/  \\_\n");
echo($left.'o    o'.$mid."o    o\n");

รับจำนวนวินาทีจากบรรทัดคำสั่ง (อาร์กิวเมนต์แรก):

$ php -d error_reporting=0 action.php 11
             __                               __
           _/  \_                           _/  \_
           o    o                           o    o

-d error_reporting=0จำเป็นต้องใช้ตัวเลือก PHP CLI เพื่อซ่อนประกาศบางรายการ PHP แสดงค่าคงที่ที่ไม่ได้กำหนด ( str_repeat, _) ที่แปลงเป็นสตริง (2 ไบต์บันทึกไว้สำหรับการแจ้งเตือนแต่ละครั้ง)

หนึ่งไบต์เพิ่มเติมสามารถบันทึกใน PHP 7 โดยการบีบอัดการเริ่มต้นของ$fการใช้ครั้งแรก ( $m=($f=str_repeat)(...)); มันไม่ได้รวบรวมใน PHP 5

กรณีการทดสอบและบางส่วนของเทคนิคที่ใช้ในการหดตัวของรหัสที่สามารถพบได้บนGitHub

ปรับปรุง:

@ ismail-miguel บีบการเริ่มต้น$leftและ inlined $cในอาร์กิวเมนต์ของechoการบันทึก 4 ไบต์ (ดูความคิดเห็นด้านล่าง)

ด้วยการสลับลำดับของตัวแปร$mและsเริ่มต้นฉันกำจัดวงเล็บและบันทึกอีก 1 ไบต์


156 ไบต์:$f=str_repeat;$m=$f(' ',$r=60-3*($s=min(max($argv[1],0),20)));echo$l=$f(' ',$s)," __ $m __\n{$l}_/ \\",$r?_.$m._:'/\\',"/ \\_\n{$l}o o{$m}o o\n";
Ismael Miguel

@IsmaelMiguel 155 ไบต์:$f=str_repeat;echo$l=$f(' ',$s=min(max($argv[1],0),20))," __ ",$m=$f(' ',$r=60-3*$s)," __\n{$l}_/ \\",$r?_.$m._:'/\\',"/ \\_\n{$l}o o{$m}o o\n";
axiac

ฉันลองรูปแบบการค้นหาของคุณและฉันได้รหัสที่ยาวกว่า คุณสามารถแก้ไขคำตอบและอัปเดตจำนวนไบต์
Ismael Miguel

ฉันยังพยายามแยกo oออกเป็นตัวแปร แต่มีความยาวเท่ากันหรือแย่กว่านั้น
axiac

คุณสามารถแทนที่\nด้วยบรรทัดใหม่จริง ฉันลืมไปแล้ว และนับเป็น 1 ไบต์ต่อกัน
Ismael Miguel

3

JavaScript (ES6), 121 ไบต์

การใช้แม่แบบสตริงบรรทัดใหม่ 2 บรรทัดภายในสตริงนั้นมีความหมายและนับจำนวน

หากต้องการบันทึกไบต์ให้ใช้เอาต์พุตalertแม้ว่าตัวอักษรที่ได้สัดส่วนที่ใช้alertไม่เหมาะสมกับ ASCII art และผลลัพธ์นั้นน่าเกลียดสำหรับ n> = 20 (crash)

ทดสอบการเรียกใช้ตัวอย่างข้อมูลใน FireFox

F=n=>alert(`  __  
_/  \\_
o    o`.replace(/.+/g,v=>(Z=x=>' '.repeat(x)+v)(n<20?n:n=20)+Z(60-3*n)).replace('__/','/\\/'))
<input id=I value=10><button onclick='F(I.value)'>go</button>


2

Python 2, 148 ไบต์

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

รับค่า int จาก stdin, ส่งออกเป็น stdout

p=lambda x:"u  __u_/  \_uo    o".replace("u","\n\033[%dC")%(x,x,x)+"\033[4A";i=min(20,input());print p(i)+"\n"+p(66-i*2)+"\n\n\n\033[25C/\\"*(i==20)

Ungolfed:

def get_car(x):
    return "\n  __\n_/  \_\no    o".replace("\n","\n\033[%dC")%(x,x,x)+"\033[4A"

i=min(20,input())
print get_car(i)
print get_car(66-i*2)
if i==20:
    print"\n\n\033[25C/\\"

2

Pyth, 67 ไบต์

Kjbm+++*\ JhS,Q20d*\ -60*3Jdc3"  __  _/  \_o    o"?nJ20KXXK58\/59\\

ลองที่นี่

                                                                       Implicit: Q=eval(input())
          JhS,Q20                                                      Set J=min(Q,20)
                              "  __  _/  \_o    o"                     Concatenated car string
                            c3                                         Split into 3
   m                                                                   For d in the above
       *\ J                                                            J spaces before 1st car
                  *\ -60*3                                             60-3J spaces in between them
    +++          d         d                                           Concatenate spaces and car string
Kjb                                                                    Join on newlines, store in K
                                                  ?nJ20                If J != 20...
                                                       K               ... print K
                                                         XK58\/        ... else put / in position 58
                                                        X      59\\        and \ in position 59 (implicit print)

2

C, 180 191 168 ไบต์

#define S(x,y)"  __  ",#x"/  \\"#y,"o    o",
char*s[][3]={S(_,_)S(_,/)S(\\,_)};i;l;f(n){l=n>19&&(n=20);for(i=0;i<3;i++)printf("%*s%*s\n",n+6,s[l][i],60-3*n,s[l*2][i]);}

ungolfed:

// make a map of possible car parts
#define S(x, y) { "  __  ", #x "/  \\" #y, "o    o" }
char * s[4][3]= {
    S(_,_),
    S(_,/),
    S(\\,_)
};
i,l;
f(n){
    i = 0;
    l = n>19 && (n = 20); // l = 1, if crash happend
    for(; i < 3; i++) {
        // '*' means length (padding) is given as an int argument
        printf("%*s%*s\n", n + 6, s[l][i], 60 - 3 * n, s[l*2][i]);
    }
}

โปรแกรมทดสอบ:

main() {
    f( 0);f( 5);f(10);
    f(15);f(20);f(21);
    return 0;
}

เอาท์พุท:

  __                                                          __
_/  \_                                                      _/  \_
o    o                                                      o    o
       __                                           __
     _/  \_                                       _/  \_
     o    o                                       o    o
            __                            __
          _/  \_                        _/  \_
          o    o                        o    o
                 __             __
               _/  \_         _/  \_
               o    o         o    o
                      __    __
                    _/  \/\/  \_
                    o    oo    o
                      __    __
                    _/  \/\/  \_
                    o    oo    o

ฉันสามารถเล่นกอล์ฟอันนี้ยากมาก ฉันคิดว่าฉันเริ่มต้นด้วยเกือบ 300 ไบต์

แต่ฉันไม่รู้ว่าสิ่งนี้ยังคงเป็นไปตามข้อกำหนดทั้งหมดหรือไม่ อย่างที่คุณเห็นหลังจาก 21 วินาทีรถคันแรกผลักคันที่สองไปทางขวา ฉันจะต้องเพิ่มสองสามไบต์ถ้าไม่ได้รับอนุญาต

แก้ไข:แก้ไขมัน นี่ควรจะเป็นจริงมากกว่า Sharknado ;-)

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


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

3
ผมเห็นด้วยกับ @ mbomb007 แต่Sharknado 3มีไอเอ็ม-คะแนน 4.5 ดังนั้นแม้ว่าคำตอบของคุณจะเห็นได้ชัด defying ฟิสิกส์ก็ยังอาจได้รับการยอมรับในเชิงบวก =)
สตีวีกริฟฟิ

ฉันคิดว่าพฤติกรรมที่คาดหวังมีการกำหนดไว้อย่างชัดเจนในคำถาม (เน้นที่เพิ่ม): "สำหรับขนาดใหญ่พอ n ฉากจะเป็นรถยนต์สองคันที่ตกในตำแหน่งที่เกิดการชน " วิธีที่ฉันอ่านสิ่งนี้พวกเขาควรจะอยู่ในตำแหน่งเดิมไปเรื่อย ๆ หลังจากเกิดการชน
Reto Koradi

2

> <> , 538 276 ไบต์

 :3*a6*$-:0)?v~~a2*0c4*1-e2*1+6pa9*2+b7p04.
  v          >04.
 >>1[>:0)  ?v~].
  ^  ^-1o" "<
\$:&94&12." ":oo"_":oo" ":oo
\$:&95&12." ":oo"_":oo" ":ooao
\$:&96&12."_"o"/"o" ":oo"\"o"_"o
\$:&97&12."_"o"/"o" ":oo"\"o"_"oao
\$:&98&12."o"o" ":::oooo"o"o
\$:&99&12."o"o" ":::oooo"o"o;

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

คุณสามารถทดสอบมันออกมาที่นี่ ใส่จำนวนเวลาที่ผ่านไปใน "Initial Stack" ไม่ใช่ "Input"!

นี่คือเวอร์ชั่นเก่า

:3*a6*$-:0)  ?v~~a2*0c4*1-c3*1-4p^                        
v~v?)0:  <[1:$/$:1[ >:0)  ?v~]" ":oo"_":oo" ":ooaov       
] >" "o1-^    ^    <^-1o" "/"/"o"_"<]~v?)0:  <[1:$<       
>" ":oo"_":oo" ":oo^       \o" ":oo"\"\" "o1-^            
/o"\"oo:" "o"/"o"_"]~v?)0:  <[1:$o"_"o/                   
\"_"oaov   hi there  >" "o1-^                             
       >$:1[ >:0)  ?v~]"o"o" ":::oooo"o"o>$:1[ >:0)  ?v~]v
       ^    <^-1o" "<                    ^    <^-1o" "<   
              v      p4-1*29+2*9a<    ;o"o"oooo:::" "o"o"<

2

Java, 258 Chars

class M{public static void main(String[]a){String l="",m=l,r="  __  ",w="o    o",x="_/  \\_";int p=Integer.parseInt(a[0]),i=20;p=p>i?i:p;for(i=-1;++i<p;)l+=" ";for(;++i<21;)m+="   ";System.out.print(l+r+m+r+"\n"+l+(x+m+x).replace("__","/\\")+"\n"+l+w+m+w);}}

ยกเลิกแข็งแรงเล่นกอล์ฟ

  class M {
     public static void main(String[] a) {
        String l = "", m = l, r = "  __  ", w = "o    o", x = "_/  \\_";
        int p = Integer.parseInt(a[0]), i = 20;
        p = p > i ? i : p;
        for (i = -1; ++i < p;)
           l += " ";
        for (; ++i < 21;)
           m += "   ";
        System.out.print(l + r + m + r + "\n"
              + l + (x + m + x).replace("__", "/\\") + "\n"
              + l + w + m + w);
     }
  }

ผล

0
  __                                                                __  
_/  \_                                                            _/  \_
o    o                                                            o    o

1
   __                                                             __  
 _/  \_                                                         _/  \_
 o    o                                                         o    o

...

19
                     __       __  
                   _/  \_   _/  \_
                   o    o   o    o

20
                      __    __  
                    _/  \/\/  \_
                    o    oo    o

21
                      __    __  
                    _/  \/\/  \_
                    o    oo    o      

2

Python 2, 102 ไบต์

n=input()
for r in"  __  ","_/  \_","o    o":print((n*' ')[:20]+r+(60-3*n)*' '+r).replace('__/','/\/')

ตรงไปตรงมาสวย สำหรับแต่ละแถวของรถเราจะพิมพ์nช่องว่างแถวนั้น60-3*nช่องว่างและแถวอีกครั้ง หากต้องการหยุดรถแทนที่จะทำสิ่งmin(n,20)นี้จะทำให้ตัวอักษรสั้นลงหนึ่งตัวเพื่อ จำกัด การเว้นวรรคครั้งแรกด้วย[:20]และตัวที่สองนั้นใช้ได้เนื่องจากค่าลบของสตริงคือสตริงว่าง

replaceที่จะเลื่อนขึ้นกันชนเราก็ทำ เนื่องจาก__ยังปรากฏบนหลังคาเราจำเป็นต้องมีบริบทเพื่อระบุบังโคลนดังนั้นเราจึงตรวจสอบสิ่ง/ต่อไปนี้


1

Java, 270 267 ไบต์

ค่อนข้างแน่ใจว่ามีวิธีที่ดีกว่า / สั้นกว่าในการทำเช่นนี้ แต่สมองของฉันไม่ได้มีส่วนร่วมอย่างถูกต้อง

class C{public static void main(String[]a){String l="",m="",r="  __  ",w="o    o";int p=Math.min(Integer.parseInt(a[0]),20),i;for(i=0;++i<p;)l+=" ";for(i=0;++i<60-3*p;)m+=" ";System.out.print(l+r+m+r+"\n"+l+"_/  \\"+(p==20?"/"+m+"\\":"_"+m+"_")+"/  \\_\n"+l+w+m+w);}}

สำหรับ n = 19:

                    __      __  
                  _/  \_  _/  \_
                  o    o  o    o

สำหรับ n = 20:

                     __    __  
                   _/  \/\/  \_
                   o    oo    o

Ungolfed

public class Crash { public static void main(String[] args) { String left="", mid="", r=" __ ", w="o o"; int pos = Math.min(Integer.parseInt(args[0]),20),i; for (i=0; ++i<pos;){ left+=" "; } for (i=0; ++i<60-3*pos;){ mid+=" "; } System.out.print( left + r + mid + r + "\n" + left + "_/ \\" + (pos==20 ? "/" + mid + "\\" : "_" + mid + "_") + "/ \\_\n" + left + w + mid + w); } }

1
ผลลัพธ์ของสิ่งนี้ไม่ถูกต้องเล็กน้อย รถของคุณเริ่มต้นเพียง 59 ตัวอักษรเท่านั้น โซลูชันของฉันแก้ไขสิ่งนี้และ Golfs ของคุณยากขึ้นเล็กน้อย :)
น้อยที่สุด

จับได้ดี & ทำได้ดีมาก :)
Denham Coote

1

PHP 7, 140 ไบต์

<?$s=$argv[1];$r=($f=str_repeat)(~ß,60-3*$s);echo$l=$f(~ß,min(20,$s)),"  __  $r  __  
${l}_/  \\",$r?_.$r._:~У,"/  \_
$l",$o=~ßßßß,$r,$o;

การใช้งาน:

บันทึกเป็น ANSI ในfile.php(ควรมีอักขระที่มีความกว้างเป็นศูนย์$o) และเรียกใช้:

php -derror_reporting=~E_NOTICE -dshort_open_tag=1 file.php x

ด้วยxจำนวนวินาที

และรุ่นที่ใช้งานได้โดยไม่ต้องเปลี่ยนการรายงานข้อผิดพลาด ( 148 ไบต์ ):

<?$s=$argv[1];$r=($f=@str_repeat)(' ',60-3*$s);echo$l=$f(' ',min(20,$s)),"  __  $r  __  
${l}_/  \\",$r?"_${r}_":"/\\","/  \_
$l",$o="o    o",$r,$o;

1

Javascript, 193 ไบต์

มันไม่ใช่ผู้ชนะ แต่เป็นบางสิ่งบางอย่าง

http://jsfiddle.net/yb703y0p/2/

function f(n){
c = ["  __  A", "_/  \\_A", "o    oA"]
for(i=0;i<3;i++)c[i]=c[i].replace('A',' '.repeat(n))+c[i].replace('A','')
if(n==0)c[1]=c[1].replace('__','/\\')
console.log(c.join("\n"))
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.