ไอศกรีม ASCII


15

เขียนโปรแกรมหรือฟังก์ชั่นที่รับจำนวนเต็มบวก N และพิมพ์หรือส่งกลับสตริงศิลปะ ASCII N × N ที่ครึ่งบนเป็นครึ่งวงกลมที่ทำจาก('s และครึ่งล่างเป็นรูปสามเหลี่ยมชี้ลงที่ทำจากV' โดยมี ช่องว่างที่ใช้เป็นช่องว่างภายใน

กล่าวอีกนัยหนึ่งให้ทำกรวยไอศครีม ASCII: (เอาต์พุตสำหรับ N = 17)

      (((((      
    (((((((((    
  (((((((((((((  
  (((((((((((((  
 ((((((((((((((( 
 ((((((((((((((( 
(((((((((((((((((
(((((((((((((((((
VVVVVVVVVVVVVVVVV
 VVVVVVVVVVVVVVV 
  VVVVVVVVVVVVV  
   VVVVVVVVVVV   
    VVVVVVVVV    
     VVVVVVV     
      VVVVV      
       VVV       
        V        

ตัวอย่าง

นี่คือผลลัพธ์สำหรับ N = 1 ถึง 5 โปรดทราบว่าสำหรับคี่ N, สามเหลี่ยมจะต้องเป็นครึ่งที่ใหญ่กว่าเสมอ

V

((
VV

(((
VVV
 V 

 (( 
((((
VVVV
 VV 

 ((( 
(((((
VVVVV
 VVV 
  V  

นี่คือ N = 101 pastebin

และนี่คือการดำเนินการอ้างอิง Python 3 ที่ไม่ได้รับความนิยม:

N = int(input())
ic = [[' '] * N for _ in range(N)]
for y in range(N//2):
    for x in range(N):
        if (x - (N - 1) / 2)**2 + (y - (N - 1) / 2)**2 < (N / 2)**2:
            ic[y][x] = '('
for y in range(N//2, N):
    for x in range(y - N//2, N - (y - N//2)):
        ic[y][x] = 'V'
for line in ic:
    print(''.join(line))

รายละเอียด

  • รับอินพุตจาก stdin, บรรทัดคำสั่งหรือเป็นอาร์กิวเมนต์ของฟังก์ชัน ส่งออกไปยัง stdout หรือคล้ายกันหรือคุณอาจกลับสตริงถ้าคุณเขียนฟังก์ชั่น
  • ส่วนกรวยควรตรงกับการใช้งานอ้างอิงสำหรับ N. ทั้งหมดอย่างแน่นอน
  • ส่วนไอศครีมไม่จำเป็นต้องตรงกับการใช้งานอ้างอิงอย่างแน่นอนตราบใดที่มันเห็นได้ชัดในรูปของครึ่งวงกลมสำหรับ N. ทั้งหมด (นี่คือดังนั้นคุณไม่ต้องกังวลเกี่ยวกับความแตกต่างเล็กน้อยในครึ่งวงกลมเนื่องจากข้อผิดพลาด roundoff .)
  • ไม่ควรมีช่องว่างนำหน้าที่ไม่จำเป็น แต่อาจมีช่องว่างต่อท้ายที่ไม่จำเป็น
  • เอาท์พุทอาจมีการขึ้นบรรทัดใหม่ต่อท้าย
  • คุณอาจเลือกใช้ใด ๆ ที่แตกต่างกัน 3 อื่น ๆASCII พิมพ์ตัวอักษรในสถานที่ของ(, Vและพื้นที่

เกณฑ์การให้คะแนน

การส่งที่สั้นที่สุดในหน่วยไบต์ชนะ Tiebreaker ไปที่การส่งที่เก่าแก่ที่สุด


6
ฉันเป็นคนเดียวที่คิดว่า "IceCII ASCream" เมื่อฉันอ่านชื่อ
Sp3000

15
@ Sp3000 Jeez ฉันหวังว่าอย่างนั้น ...
งานอดิเรกของ Calvin

คำตอบ:


7

CJam, 46 ไบต์

ลองออนไลน์

{:Z{Z{Z(2./:R-zYR<):P#YR-zP#+Z2./P#>SP?}/N}fY}

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

คำอธิบาย

{               "Begin block";
  :Z{             "For each y from 0 to input-1";
    Z{              "For each x from 0 to input-1";
      Z(2./:R         "Calculate the radius as (input-1)/2.0";
      -z              "Calculate the horizontal distance from the center";
      YR<):P          "Calculate the power to raise distances to: (y<radius)+1
                       (This results in Euclidean distance being calculated for
                        the ice cream and Manhattan distance being calculated
                        for the cone)";
      #               "Raise the horizontal distance to the determined power";
      YR-zP#          "Calculate the vertical distance from the center and
                       raise it to the determined power";
      +               "Add the horizontal and vertical distances";
      Z2./P#          "Calculate the solid distance threshold and raise it to
                       the determined power";
      >SP?            "If the solid threshold is exceeded, produce a space;
                       otherwise, produce the determined power digit
                       (This results in ice cream being represented by the
                        digit '2' and the cone by the digit '1')";
    }/              "End x loop";
    N               "Produce a new line";
  }fY             "End y loop";
}               "End block";

ดูเหมือนว่าจะใช้2ของและ1แทนที่จะ(เป็นและV?
Mark Reed

@MarkReed สิ่งนี้ได้รับอนุญาต บรรทัดสุดท้ายในส่วนรายละเอียด
Jakube

3

inca2 129 123 121 111 107

ส่วนใหญ่ใช้สูตรจากตัวอย่างของไพ ธ อน แต่ใช้ jot-points และ iotas แทนการวนซ้ำสองครั้ง iฟังก์ชั่นการดำเนินการทดสอบวงกลมสำหรับjฟังก์ชั่นซึ่งจะเรียกนิดหนึ่ง-dotกับมัน และkฟังก์ชั่นทำการทดสอบสามเหลี่ยมสำหรับlฟังก์ชั่น cฟังก์ชั่น catenates ผลของการjและlและ reshapes มัน N ร N

แก้ไข: -6รวม 2 แผนที่เป็น 1
แก้ไข: -2ลบ ravels ที่ไร้ประโยชน์
แก้ไข: nicer typescript
แก้ไข: -10ใช้ array expression ที่ชาญฉลาดซ้ำ ๆ
แก้ไข: -4ปัจจัยออกมาแสดงออกซ้ำเป็นฟังก์ชั่น
แก้ไข:ความเห็นทีละบรรทัด

q:y-(n-1)%2
i:[((n%2)^2)>+/(qx y)^2
j:(~[y%2)i.(~y)
k:2*[x>[|qy
l:(@1+~]y%2)k.(~y)
c:y y#((jn<y),ly){' (V' 

ในรายละเอียดรายการจุดเป็นฟังก์ชั่นซึ่งจะใช้เวลาหนึ่งอาร์กิวเมนต์ชื่อโดยปริยายcy

c:y y#((jn<y),ly){' (V' 
         n<y            } assign y to 'n'
        jn<y            } call j(y)
              ly        } call l(y)
      ((    ),  )       } catenate the results
      (         ){' (V' } map 0 1 2 to ' ' '(' 'V'
  y y#                  } reshape to NxN

jฟังก์ชั่นได้รับค่าการป้อนข้อมูลเช่นเดียวกับของyพารามิเตอร์

j:(~[y%2)i.(~y)
     y%2         } y divided by 2
    [            } floor
   ~             } iota. this generates the row indices 0..y/2
            ~y   } iota y. this generates the column indices 0..y
  (     )i.(  )  } jot-dot with the function i

jot-dot ที่นี่ทำ double-loop มันเรียกiฟังก์ชั่นที่มีการรวมกันขององค์ประกอบจากอาร์เรย์ซ้ายและขวา (0..n / 2 และ 0..n) ดังนั้นiฟังก์ชั่นได้รับเป็นYดัชนีของตารางและได้รับเป็นxดัชนี ชื่อกลับด้านหลังนิดหน่อย :)xy

i:[((n%2)^2)>+/(qx y)^2
     n%2                 } n divided by 2
    (n%2)^2              } squared
                 x y     } make a 2-element array (x,y)
                qx y     } call q on this array

ที่qไม่

q:y-(n-1)%2
     n-1    } n minus 1
         %2 } divided by 2
  y-        } y minus that

กลับไป i

i:[((n%2)^2)>+/(qx y)^2
               (    )^2  } square the result from q(x,y)
             +/          } sum the two numbers
            >            } compare the left side (above) with the right (=> 0/1)
  [                      } floor

พื้นไม่ควรจำเป็น แต่เห็นได้ชัดว่ามีข้อผิดพลาดในล่าม

lฟังก์ชั่นการทำงานคล้าย ๆ กับjฟังก์ชั่นการใช้นิดหนึ่งจุด

l:(@1+~]y%2)k.(~y)
        y%2         } y divided by 2
       ]            } ceiling
      ~             } iota 0..ceil(y/2)-1
    1+              } add 1 => 1..ceil(y/2)
   @                } reverse => ceil(y/2)..1
               ~y   } iota y  0..y-1
  (        )k.(  )  } jot-dot using k

kฟังก์ชั่นอัตราผลตอบแทนปรับขนาดแบบบูล 2 เพื่อให้ค่าที่สามารถจะแตกต่างจากค่าไอศครีมในภายหลังในการทำแผนที่

k:2*[x>[|qy
     x       } k's left arg
         qy  } y-(n-1)%2
        |    } abs
       [     } floor
     x       } left-hand-side again
      >      } compare 
    [        } floor (should be unnecessary)
  2*         } scale by 2

กำลังดำเนินการ (การส่งผ่านtrเพื่อลบตัวอักษรแท็บซึ่งเป็นพรอมต์ของ REPL):

josh@Z1 ~/inca
$ ./inca2 <icecream | tr -d '\t'

c1
V

c2
((
VV

c3
(((
VVV
 V 

c4
 (( 
((((
VVVV
 VV 

c5
 ((( 
(((((
VVVVV
 VVV 
  V  

josh@Z1 ~/inca
$ 

2

Python 2, 193 192

ไม่ใช้สตริงเฉพาะคณิตศาสตร์

N=input()
R=(N+1)/2;r=range(R)
s=lambda L,U:(10**U-10**L)/9
f=lambda N,m:s(0,N)+s(m,N-m)
g=lambda N,m:s(0,N)+s(m,N-m)*6
for i in r[1:]:print f(N,int(R-(2*R*i-i*i)**.5))
for i in r:print g(N,i)

s(L,U)ส่งกลับตัวเลขของรูปแบบ " U-digits ด้วยLค่าศูนย์ขวาสุดและส่วนที่เหลือ"
f(N,m)ส่งกลับตัวเลข N หลักพร้อมส่วนด้านใน2และขอบกว้าง m ของ1แต่ละด้าน
g(N,m)ทำแบบเดียวกัน แต่ใช้7สำหรับ 'สี' ของส่วนด้านในเนื่องจากเข้ากับพื้นผิวของกรวยอย่างใกล้ชิดยิ่งขึ้น

เอาท์พุต

N=8         N=9
11122111    112222211
12222221    122222221
22222222    222222222
22222222    222222222
77777777    777777777
17777771    177777771
11777711    117777711
11177111    111777111
            111171111

วิธีที่ไม่เหมือนใครในการทำมัน :)
งานอดิเรกของ Calvin

ถ้ามีเพียงเราเท่านั้นที่สามารถเห็นไอศกรีมได้เช่นกัน: P
เครื่องมือเพิ่มประสิทธิภาพ

2

Perl 6, 175

การนำไปใช้งานที่ไม่ซับซ้อนโดยไม่ต้องตีกอล์ฟมากเพียงแค่กำจัดช่องว่าง / เครื่องหมายวรรคตอนจากภายนอก:

sub MAIN($d){my$r=($d/2).Int;for 1..$r ->$n
{my$y=$n-$r;my$h=sqrt($r*$r-$y*$y).Int;my$w=2*$h+$d%2;say
' 'x($r-$h)~'('x$w};for 1..($d-$r) ->$y {say ' 'x($y-1)~'V'x($d-2*$y+2)}}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.