Bana bir ASCII çorap örme


15

Giriş

Uzun lafın kısası: Birkaç gün önce yanlışlıkla bir çorap örmeye başladım ve düz dikişlerin oldukça mantıklı yapısı beni şu fikre götürüyor: Neden sadece bir çorap örmüyoruz?

Giriş

Giriş, aralıkta eşit bir tamsayı N'dir [2,30].

Çıktı

Çıktı açıkçası bir çorap.

yapı

Yalnızca düz dikiş kullanacağımız viçin yalnızca aşağı doğru dikiş ve >sağa doğru dikiş için kullanacağınız. Tüm yapıyı bir örnekle açıklayayım N=8:

vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvv>>>
vvvvvv>>>>>>
vvvvv>>>>>>>>>
vvvv>>>>>>>>>>>>
vvvv>>>>>>>>>>>>>>>>>>>>>>>>
vvvv>>>>>>>>>>>>>>>>>>>>>>>>>>
vvvv>>>>>>>>>>>>>>>>>>>>>>>>>>
vvvv>>>>>>>>>>>>>>>>>>>>>>>>
  • İlk blok üst kısımdır. Genişlik Nve yüksekliğe sahiptirN*1.5
  • Daha sonra topuk başlar. Genişlik elde vedene kadar sağ taraftan satır başına bir tane çıkarırsınız N/2. Ardından , aşağı örgülerin bitirilmesi için alt kısımdaki N/2genişliğe sahip satırlar eklersiniz N/2. N/2 + 1Genişliğe sahip toplam satır verdiğini unutmayınN/2

ilk kısım:

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
  • Şimdi yan koğuş örgüler başlıyor. İlk küçültülmüş satırla başlarsınız >, genişliği elde edene kadar doldurun Nve iki tane daha ekleyin. N/2Genişliğe sahip ilk satırı içeren işleme devam edin
  • Bu seviyeye altına satır doldurun ve eklemek N*1.5kez >buna
  • Dış parçaları oldukları gibi >'sbırakın ve bitene kadar ilk önce ve lase iki sıraya ekleyin

ikinci kısım:

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

kurallar

Sondaki yeni satırlar tamam.

Büyük veya küçük harf arasında seçim yapabilirsiniz V ancak tutarlı olması gerekir.

Bu yani bayt en kısa kodu kazanır.

Test senaryoları

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

2
Umarım takip eden bir satırsonu olur mu? (ayrıca, yanlışlıkla bir çorap örmeye nasıl başlar?)
Greg Martin

3
@GregMartin Büyükannemi ziyaret etti ve bana sordu. Ona hayır demek zor, işte başlıyoruz :) İlkini iki gün önce bitirdik. Bence gayet güzel ama iş miktarını gerçekten hafife aldım. Birisi senin için çorap yaparsa mutlu ol.
izlin

Değiştirebilir miyim vveya Vdeğiştirebilir miyim ? Şu an için vizin verilen tek şey olduğunu varsayıyorum , ancak izin vermek Vbayt sayısını etkileyecektir
Altın Oran

@GoldenRatio Kuralları değiştirdim, şimdi her ikisine de izin veriliyor.
izlin

@GurupadMamadapur 'Giriş' bölümünde okuyabileceğiniz gibi, giriş olarak yalnızca sayılara bile izin verilir. Programınızın tek sayıları işlemesi gerekmez
izlin

Yanıtlar:


2

Pyth - 93 Bayt

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">

Açıklama:

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

Burada deneyebilirsiniz!


2

Mathematica, 104 bayt

""<>{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]}&

Adsız işlev girdi olarak pozitif eşit bir tamsayı alan ve bir dize döndüren (sondaki yeni satırla). Yukarıdaki iki kod satırı arasındaki yeni satırın kodun bir parçası olduğunu unutmayın. Ana çalışma, cçözülmemiş tanımı olan fonksiyon tarafından yapılır.

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

her biri "v"arka arkaya birkaç ">"s, ardından birkaç s ve bir satırsonu içeren bir liste tablosu oluşturur . Neyse ki, #3dış aralığın Tableifadelerde ifade edilebilecek değişken bir adı olabilir #1ve #2; bu, işlevin chem sabit hem de değişken bağımsız değişkenlerle çağrılmasını sağlar . Gerisi sadece hesaplamadır ve dize birleştirme operatörü ""<>, ücretsiz olarak ortaya çıkan iç içe listeleri düzleştirir.


2

Python, 3.5 183 177 bayt

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]),

Açıklama geliyor.

Çevrimiçi deneyin!


Bildiğiniz gibi, v2 "erken alfa aşamasında" olduğundan TIO Nexus şu anda TIO

Bir bayt kaydetmek için bir değişkenin üstüne 'v' atayabilirsiniz.
nedla2004

@JackBates Doğru şekilde not edildi.
Gurupad Mamadapur

@ Bu şekilde ifade ediyor mu nedla2004: n,v=int(input()),'v'? Sonra hiçbir şey kazandırmaz.
Gurupad Mamadapur


1

Toplu, 279 bayt

@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:]=^>%

Not: ikinci satır boşlukla biter. Toplu >değişkenlerde yankılama s ile ilgili sorunlar var, bu yüzden a) yerine kullanmak zorunda b) düzeltilmiş dize yankı için bir altyordam çağırmak. Aslında üç altyordam var:

  • atopuk için kullanılır. Bir vher çıkarılır ve üç >s eklenir. >Alt rutinin alt rutine düşebilmesi için iki ekstra s eklenir b.
  • bayağın alt kısmı için kullanılır. >Her seferinde iki s çıkarılır. Daha sonra caltyordam , altyordam içine düşer .
  • cçorabın geçerli satırını yazdırır, yer tutucu karakterin yerini alır, böylece >s düzgün yazdırılır.

Dördüncü çizgi bacağın genişliğini, beşinci çizgi uzunluğunu idare eder. Yedinci çizgi ayağın uzunluğunu, sekizinci çizgi >>yazdırdıktan sonra her bir çizgiye iki tane ekleyerek ayak yüksekliğinin üst yarısını işler . Bu, 4'ün katları olan çorap boyutları için çalışır ve en uzun hattın tekrarlanmaması için diğer çorap boyutları için bir ayarlama yapılır.


0

PHP, 229 bayt

oldukça tembel bir yaklaşım

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));

önde gelen bir yeni satır yazdırır. Şununla koş:-nr .

Yıkmak

// 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));

0

dc , 269 bayt

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

Pekala, bu ... bu çok büyük . Kolay değildi, size tüm kayıt referansları, karşılaştırmalar, makrolar, string manipülasyon yeteneklerinin eksikliği vb. İle ne kadar çok şey söyleyeceğim. ? ;)

Çevrimiçi Deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.