Es Krim ASCII

15

Tulis sebuah program atau fungsi yang mengambil dalam bilangan bulat positif N, dan mencetak atau mengembalikan string seni ASCII N × N yang bagian atasnya adalah setengah lingkaran yang terbuat dari ('s dan yang bagian bawahnya adalah segitiga yang menunjuk ke bawah terbuat dari V' s, dengan ruang yang digunakan sebagai bantalan.

Dengan kata lain, buat kerucut es krim ASCII: (output untuk N = 17)

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

Contohnya

Berikut adalah output untuk N = 1 hingga 5. Perhatikan bahwa untuk N aneh, segitiga selalu harus menjadi setengahnya lebih besar.

V

((
VV

(((
VVV
 V 

 (( 
((((
VVVV
 VV 

 ((( 
(((((
VVVVV
 VVV 
  V  

Ini N = 101 pastebin.

Dan inilah implementasi referensi Python ungolfed 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))

Detail

  • Ambil input dari stdin, baris perintah, atau sebagai argumen fungsi. Output ke stdout atau serupa, atau Anda dapat mengembalikan string jika Anda menulis suatu fungsi.
  • Bagian kerucut harus sama persis dengan implementasi referensi untuk semua N.
  • Bagian es krim tidak perlu sama persis dengan implementasi referensi selama itu jelas dalam bentuk setengah lingkaran untuk semua N. (Ini adalah sehingga Anda tidak perlu khawatir tentang sedikit perbedaan dalam setengah lingkaran karena kesalahan putaran) .)
  • Seharusnya tidak ada ruang mengarah yang tidak perlu tetapi mungkin ada ruang trailing berlebihan.
  • Output secara opsional dapat berisi baris tambahan.
  • Anda opsional dapat menggunakan 3 berbeda lainnya ASCII printable karakter di tempat (, Vdan ruang.

Mencetak gol

Pengajuan terpendek dalam byte menang. Tiebreaker pergi ke pengiriman tertua.

Hobi Calvin
sumber
6
Apakah saya satu-satunya yang berpikir "IceCII ASCream" ketika saya membaca judulnya?
Sp3000
15
@ Sp3000 Ya ampun, saya harap begitu ...
Calvin's Hobbies

Jawaban:

7

CJam, 46 byte

Cobalah online.

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

Saya percaya ini saat ini persis meniru spesifikasi asli, yang diperlukan ketika saya mulai menghasilkan jawaban ini. Mungkin ada potensi untuk menyimpan beberapa byte dengan membuat matematika kurang akurat dengan spesifikasi asli, tetapi sampai saya melihat cara untuk menyimpan lebih dari satu atau dua byte melakukannya, saya akan membiarkannya apa adanya.

Penjelasan

{               "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";
Runer112
sumber
Ini tampaknya menggunakan 2'dan 1' dan bukan ('dan V'?
Mark Reed
@ MarkReed Ini diizinkan. Baris terakhir di bagian detail.
Jakube
3

inca2 129 123 121 111 107

Ini sebagian besar menggunakan rumus dari contoh python, tetapi menggunakan jot-dots dan iota bukannya double-looping. The ifungsi melakukan tes melingkar untuk jfungsi yang memanggil iota-dot atasnya. Dan kfungsi melakukan tes segitiga untuk lfungsi tersebut. The cFungsi catenates hasil jdan ldan membentuk ulang untuk N × N.

sunting: -6 gabungkan 2 peta menjadi 1.
sunting: -2 menghapus kekacauan yang tidak berguna.
sunting: naskah yang lebih bagus.
sunting: -10 terapkan array ekspresi yang bijak.
sunting: -4 faktor keluar ekspresi berulang sebagai fungsi.
sunting: komentar baris per baris.

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' 

Secara lebih rinci, entry-point adalah cfungsi yang mengambil satu argumen secara implisit dinamai y.

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

The jFungsi menerima masukan nilai yang sama sebagai yang yparameter.

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

Titik-titik di sini melakukan loop ganda. Ini memanggil ifungsi dengan setiap kombinasi elemen dari array kiri dan kanan (0..n / 2 dan 0..n). Jadi ifungsi menerima sebagai xyang y indeks tabel, dan menerima sebagai yyang x indeks. Nama-nama mendapat sedikit mundur di sini :).

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

di mana qtidak

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

kembali ke 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

Lantai seharusnya tidak perlu. Namun ternyata ada bug pada interpreter.

The lfungsi bekerja sama dengan jfungsi, menggunakan Iota-dot.

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

The kFungsi menghasilkan boolean skala oleh 2 sehingga nilai-nilai dapat dibedakan dari nilai-nilai es krim nanti, dalam pemetaan.

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

Dalam aksi ( trmemipis untuk menghapus tab tab yang merupakan prompt 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
$ 
luser droog
sumber
2

Python 2, 193 192

Tidak menggunakan string, hanya matematika

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)mengembalikan sejumlah bentuk " U-digits dengan Lnol paling kanan dan yang lainnya"
f(N,m)mengembalikan angka N-digit dengan bagian dalam 2dan perbatasan selebar m 1di setiap sisi
g(N,m)melakukan hal yang sama, tetapi menggunakan 7untuk 'warna' bagian dalam karena cocok dengan tekstur kerucut lebih dekat

Keluaran

N=8         N=9
11122111    112222211
12222221    122222221
22222222    222222222
22222222    222222222
77777777    777777777
17777771    177777771
11777711    117777711
11177111    111777111
            111171111
DenDenDo
sumber
Cara yang sangat unik untuk melakukannya :)
Calvin's Hobbies
Kalau saja kita bisa melihat es krim juga: P
Optimizer
2

Perl 6, 175

Implementasi yang cukup mudah tanpa banyak bermain golf, hanya menghilangkan spasi / tanda baca spasi:

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)}}
Mark Reed
sumber