Rajut aku ASCII-Sock

15

pengantar

Singkat cerita: beberapa hari yang lalu saya secara tidak sengaja mulai merajut kaus kaki dan struktur jahitan yang cukup logis membawa saya pada ide: Mengapa kita tidak hanya ASCII-merajut kaus kaki?

Memasukkan

Input adalah bilangan bulat genap N dalam kisaran [2,30].

Keluaran

Keluarannya adalah kaus kaki, jelas.

Struktur

Karena kami hanya akan menggunakan jahitan biasa, Anda hanya akan menggunakan vuntuk jahitan ke bawah dan >untuk jahitan ke kanan. Biarkan saya menjelaskan struktur lengkap dengan contoh untuk N=8:

vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvv>>>
vvvvvv>>>>>>
vvvvv>>>>>>>>>
vvvv>>>>>>>>>>>>
vvvv>>>>>>>>>>>>>>>>>>>>>>>>
vvvv>>>>>>>>>>>>>>>>>>>>>>>>>>
vvvv>>>>>>>>>>>>>>>>>>>>>>>>>>
vvvv>>>>>>>>>>>>>>>>>>>>>>>>
  • Blok pertama adalah bagian atas. Ia memiliki lebar Ndan tinggiN*1.5
  • Setelah itu tumit dimulai. Anda mengurangi satu vper baris dari sisi kanan hingga Anda memiliki N/2lebar. Kemudian Anda menambahkan N/2baris dengan lebar di N/2bawah untuk menyelesaikan rajutan ke bawah. Perhatikan bahwa ini memberikan total N/2 + 1baris dengan lebarN/2

bagian pertama:

vvvvvvvv    //begin with width N
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv    // N*1.5 times
vvvvvvv     // reduce
vvvvvv
vvvvv
vvvv        // till here
vvvv        // repeat N/2 times
vvvv
vvvv
vvvv
  • Sekarang rajutan sisi samping dimulai. Anda mulai dengan baris pertama yang diperkecil, isi >sampai Anda memiliki lebar Ndan tambahkan dua lagi. Lanjutkan proses itu termasuk baris pertama dengan N/2lebar
  • Isi baris di bawah ke level itu dan tambahkan N*1.5waktu >ke sana
  • Biarkan bagian luar sebagaimana adanya dan tambahkan pada baris di bawah yang pertama dan di atas lase dua lagi >'ssampai selesai

bagian kedua:

vvvvvvvv
vvvvvvv>>>  //fill to N and add two >
vvvvvv>>>>>>     //repeat
vvvvv>>>>>>>>>
vvvv>>>>>>>>>>>>   //till here
vvvv>>>>>>>>>>>>>>>>>>>>>>>>       //fill to the row above and add N*1.5 times >
vvvv>>>>>>>>>>>>>>>>>>>>>>>>>>     //add two more '>' than the row above
vvvv>>>>>>>>>>>>>>>>>>>>>>>>>>     //add two more '>' than the row beneath
vvvv>>>>>>>>>>>>>>>>>>>>>>>>

Aturan

Mengejar baris baru ok.

Anda dapat memilih antara huruf besar atau kecil Vtetapi harus konsisten.

Ini adalah sehingga kode terpendek dalam byte menang.

Uji kasus

N=2
vv
vv
vv
v>>>
v>>>>>>

N=4
vvvv
vvvv
vvvv
vvvv
vvvv
vvvv
vvv>>>
vv>>>>>>
vv>>>>>>>>>>>>
vv>>>>>>>>>>>>

N=6
vvvvvv
vvvvvv
vvvvvv
vvvvvv
vvvvvv
vvvvvv
vvvvvv
vvvvvv
vvvvvv
vvvvv>>>
vvvv>>>>>>
vvv>>>>>>>>>
vvv>>>>>>>>>>>>>>>>>>
vvv>>>>>>>>>>>>>>>>>>>>
vvv>>>>>>>>>>>>>>>>>>

N=12
vvvvvvvvvvvv
vvvvvvvvvvvv
vvvvvvvvvvvv
vvvvvvvvvvvv
vvvvvvvvvvvv
vvvvvvvvvvvv
vvvvvvvvvvvv
vvvvvvvvvvvv
vvvvvvvvvvvv
vvvvvvvvvvvv
vvvvvvvvvvvv
vvvvvvvvvvvv
vvvvvvvvvvvv
vvvvvvvvvvvv
vvvvvvvvvvvv
vvvvvvvvvvvv
vvvvvvvvvvvv
vvvvvvvvvvvv
vvvvvvvvvvv>>>
vvvvvvvvvv>>>>>>
vvvvvvvvv>>>>>>>>>
vvvvvvvv>>>>>>>>>>>>
vvvvvvv>>>>>>>>>>>>>>>
vvvvvv>>>>>>>>>>>>>>>>>>
vvvvvv>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
vvvvvv>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
vvvvvv>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
vvvvvv>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
vvvvvv>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
vvvvvv>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
izlin
sumber
2
Saya harap baris baru tidak apa-apa? (juga, bagaimana seseorang secara tidak sengaja mulai merajut kaus kaki?)
Greg Martin
3
@ Regregin Mengunjungi nenek saya dan dia bertanya kepada saya. Sulit untuk mengatakan tidak padanya jadi begini :) Selesai yang pertama dua hari yang lalu. Saya pikir itu cukup baik tetapi saya benar-benar meremehkan jumlah pekerjaan. Jadi berbahagialah jika seseorang membuat kaus kaki untuk Anda.
izlin
Bisakah saya menggunakan vatau Vsecara bergantian? Saya akan menganggap untuk saat vini adalah satu-satunya yang diizinkan, tetapi memungkinkan Vakan mempengaruhi jumlah byte
Rasio Emas
@GoldenRatio Saya mengubah aturan, sekarang keduanya diizinkan.
izlin
@GurupadMamadapur Seperti yang Anda baca di 'Input', hanya angka genap yang diizinkan sebagai input. Program Anda tidak perlu menangani angka ganjil
izlin

Jawaban:

2

Pyth - 93 Bytes

J/Q2K"V"P*s*Q1.5+*QKbVJp*+Q_+1NK*+3*3N">";InQ2VJp*JK*+s*2aaNc-J 1 2c-J 1 2+3*Q3">";IqQ2pK*6">

Penjelasan:

J/Q2                             sets J to half of input
K"V"                             sets K to "V"
P                                prevents newline after main block of sock
*                                multiply the next 2 items
s*Q1.5                           rounds up input*1.5 (columns in main block)
+                                adds the next 2 item (this item gets multiplied by the previous item)
*QK                              multiplies "V" by input (resulting in each row)
b                                New line
VJ                               For all the numbers 0-((Q/2)-1) (as represented by N)
p                                print
*                                multiply the next 2 items
+Q_+1N                           input + -1*(1+N)
K                                "V"
*+3*3N">"                        3N+3 many ">"'s
;                                ends for statement
InQ2                             if input is not 2
VJ                               For all the numbers 0-((input/2)-1) (as represented by N)
p                                print
*JK                              input/2 many ">"'s
*+s*2aaNc-J 1 2c-J 1 2+3*Q3">"   int(abs(abs(N-((input/2)-1)/2)-((input/2)-1)/2)))+(input*3)+3 many ">"'s
;                                end of for statement
IqQ2                             if input is 2
pK*6">                           print "V" and 6 ">"'s

Anda bisa mencobanya di sini!

Nick si pembuat kode
sumber
2

Mathematica, 104 byte

""<>{t=Table;c=t[{"v"~t~#,">"~t~#2,"
"},#3]&;h=#/2;c[#,0,3h],c[#-i,3i,z={i,h}],c[h,6h+2Min[i-1,h-i],z]}&

Fungsi tanpa nama mengambil bilangan bulat positif sebagai input dan mengembalikan string (dengan baris baru) Perhatikan bahwa baris baru antara dua baris kode di atas adalah bagian dari kode. Pekerjaan utama dilakukan oleh fungsi c, yang definisi ungolfed

c[#1, #2, #3] = Table[{Table["v", #1], Table[">", #2], "\n"}, #3]

membuat daftar daftar, masing-masing terdiri dari beberapa "v"s dalam satu baris diikuti oleh beberapa ">"s diikuti oleh baris baru. Untungnya, rentang #3untuk bagian luar Tabledapat memiliki nama variabel, yang dapat dirujuk dalam ekspresi #1dan #2; ini memungkinkan fungsi cdipanggil dengan argumen konstan dan variabel. Sisanya hanyalah perhitungan, dan operator penyambung string ""<>meratakan daftar bersarang yang muncul secara gratis.

Greg Martin
sumber
2

Python, 3,5 183 177 byte

n=int(input())
h=n//2
z=h%2
l=['v'*h+'>'*(2*n-h+3*h+i*2)for i in range(1*z+n//4)]
*map(print,['v'*n]*(3*h)+['v'*i+'>'*(3*(n-i))for i in range(h,n)][::-1]+[l,l[:-1]][z]+l[::-1]),

Penjelasan masuk.

Cobalah secara Online!

Gurupad Mamadapur
sumber
Supaya Anda tahu, TIO Nexus bekerja lebih baik daripada TIO v2 saat ini karena v2 ada di "tahap alpha awal"
Untuk menyimpan satu byte, Anda bisa menetapkan 'v' di atas variabel.
nedla2004
@ JackBates Sepatutnya dicatat.
Gurupad Mamadapur
@ nedla2004 Apakah yang Anda maksud dengan cara ini: n,v=int(input()),'v'? Maka itu tidak menghemat apa pun.
Gurupad Mamadapur
1

Groovy, 168 byte

{n->h=n/2;z=(int)h%2;l=(0..<1*z+n/4).collect{'v'*h+'>'*(2*n-h+3*h+it*2)};(['v'*n]*(3*h)+(n-1..h).collect{'v'*it+'>'*(3*(n-it))}+(z==0?l:l[0..<-1])+l[-1..0]).join('\n')}

Ini adalah penutupan tanpa nama. Pendekatan ini sangat mirip dengan jawaban Python 3.5 saya .

Cobalah secara Online!

Gurupad Mamadapur
sumber
1

Batch, 279 byte

@echo off
set i=for /l %%i in (2,2,%1)do 
set v=
%i%call set v=v%%v%%v
%i%echo %v%&echo %v%&echo %v%
%i%call:a
%i%call set v=%%v%%]]]
%i:,2,=,4,%call:c&if %%i lss %1 call set v=%%v%%]]
%i:2,=4,%call:b
exit/b
:a
set v=%v:~1%]]]]]
:b
set v=%v:~0,-2%
:c
echo %v:]=^>%

Catatan: baris kedua berakhir di spasi. Batch memiliki masalah dengan gema >dalam variabel jadi saya harus a) menggunakan pengganti b) memanggil subrutin untuk menggemakan string yang dikoreksi. Sebenarnya saya punya tiga subrutin:

  • adigunakan untuk tumit. Satu vdihapus setiap kali dan tiga >s ditambahkan. Dua ekstra >ditambahkan sehingga subrutin bisa masuk ke dalam bsubrutin.
  • bdigunakan untuk bagian bawah kaki. Dua >s dihapus setiap kali. Subroutine kemudian jatuh ke dalam csubroutine.
  • cmencetak baris kaus kaki saat ini, mengganti karakter placeholder sehingga >cetak dengan benar.

Garis keempat menangani lebar kaki, sedangkan garis kelima menangani panjangnya. Garis ketujuh menangani panjang kaki sementara garis kedelapan menangani setengah bagian atas tinggi kaki dengan menambahkan dua >>ke setiap garis setelah mencetaknya. Ini berfungsi untuk ukuran kaus kaki yang merupakan kelipatan 4, dan penyesuaian dibuat untuk ukuran kaus kaki lain sehingga garis terpanjang tidak berulang.

Neil
sumber
0

PHP, 229 byte

pendekatan yang cukup malas

for($m=$n=$p=$argv[1];$i++<$q=$n*1.5;)echo($d=str_pad)("
",$n+1,v);for(;$p-->$n/2;)echo$s="
".$d($d("",$p,v),$m+=2,">");$r=[$s.=$d("",$q,">")];for($k=$n>>2;--$k;)$r[]=$s.=">>";echo join($r),$n&2?"$s>>":"",join(array_reverse($r));

mencetak baris baru terkemuka. Jalankan dengan -nr.

kerusakan

// print first part + preparing some variables for later
for($m=$n=$p=$argv[1];$i++<$q=$n*1.5;)echo str_pad("\n",$n+1,v);

// print second part + prepare $s for third part
for(;$p-->$n/2;)echo$s="\n".str_pad(str_pad("",$p,v),$m+=2,">");

// third part: create an array of strings ...
$r=[$s.=str_pad("",$q,">")];
for($k=$n>>2;--$k;)$r[]=$s.=">>";
// ... then print it and its reverse
echo join($r),$n&2?"$s>>":"",join(array_reverse($r));
Titus
sumber
0

dc , 269 byte

1k?d1.5*sadsdsb[[[v]nlb1-dsb0<f]dsfx[]pldsbla1-dsa0<c]dscxldd1-sisb2su[[[v]nlb1-dsbldli-<g]dsgx[[>]nlb1-dsblu+0<t]dstx[]plu2+suli1-dsilddsb2/!>m]dsmxld3*dsdsolidswst[[[v]nlw1-dsw0!>x]dsxx[2-]sa[2+]sy[[>]nlo1-dso0<g]dsgxldltli1+2/<yltli1+2/>adsdsolisw[]plt1-dst0!>f]dsfx

Baiklah, yah ... ini masif . Itu tidak mudah, saya akan memberi tahu Anda banyak, apa dengan semua referensi register, perbandingan, makro, kurangnya kemampuan manipulasi string, dll. Meskipun demikian, saya senang menyatukan ini, dan hanya itu yang paling penting, bukan ? ;)

Cobalah secara Online!

R. Kap
sumber