В'яжіть мені шкарпетку ASCII


15

Вступ

Довга коротка історія: кілька днів тому я випадково почав в’язати шкарпетку, і досить логічна структура простих стібків підводить мене до думки: Чому ми не просто ASCII в'яжемо шкарпетку?

Вхідні дані

Вхід - це ціле число N у діапазоні [2,30].

Вихідні дані

Вихід - носок, очевидно.

Будова

Тому що ми будемо використовувати лише звичайні шви, які ви будете використовувати лише vдля нижньої строчки і >для стібка праворуч. Дозвольте пояснити всю структуру на прикладі N=8:

vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvv>>>
vvvvvv>>>>>>
vvvvv>>>>>>>>>
vvvv>>>>>>>>>>>>
vvvv>>>>>>>>>>>>>>>>>>>>>>>>
vvvv>>>>>>>>>>>>>>>>>>>>>>>>>>
vvvv>>>>>>>>>>>>>>>>>>>>>>>>>>
vvvv>>>>>>>>>>>>>>>>>>>>>>>>
  • Перший блок - це верхня частина. Він має ширину Nі висотуN*1.5
  • Після цього починається каблук. Ви віднімаєте по одному vрядку з правого боку, поки не будете мати N/2ширину. Потім ви додаєте N/2рядки з шириноюN/2 внизу, щоб закінчити вниз в'язання. Зауважте, що він дає загальну кількість N/2 + 1рядків із шириноюN/2

перша частина:

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
  • Тепер починаються в’язання бічних підопічних. Ви починаєте з першого зменшеного ряду, заповнюєте, >поки не отримаєте ширинуN і додасте ще два. Продовжуйте цей процес, включаючи перший ряд із N/2шириною
  • Заповніть рядки внизу до цього рівня та додайте N*1.5> до них раз
  • Залиште зовнішні частини такими, якими вони є, і додайте на рядок під першою та над лазкою ще дві >'s поки вона не закінчиться

друга частина:

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

Правила

Нові лінії в порядку.

Ви можете вибрати між великими або малими літерами V але це повинно бути послідовним.

Це тому найкоротший код у байтах виграє.

Тестові справи

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
Я сподіваюсь, що з новим рядком добре? (також, як випадково почати в'язати шкарпетку?)
Грег Мартін

3
@GregMartin Відвідав бабусю, і вона запитала мене. Важко сказати їй "ні", так ось ми йдемо :) Закінчив перший два дні тому. Я думаю, що це досить добре, але я дійсно занижував обсяг роботи. Тож будьте щасливі, якщо хтось зробив для вас шкарпетки.
izlin

Чи можна використовувати vабо Vвзаємозамінно? На даний момент я припускаю, що vце єдиний дозволений, але дозволяючи Vвплинути на кількість байтів
Золоте співвідношення

@GoldenRatio Я змінив правила, тепер дозволено обидва.
izlin

@GurupadMamadapur Як ви можете прочитати у розділі "Введення", вводяться лише парні числа. Вашій програмі не потрібно обробляти непарні номери
izlin

Відповіді:


2

Піт - 93 байти

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

Пояснення:

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

Ви можете спробувати тут!


2

Математика, 104 байти

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

Безіменна функція, яка приймає додаткове парне ціле число в якості введення та повертає рядок (із заднім рядком). Зауважте, що новий рядок між двома рядками коду вище є частиною коду. Основна робота виконується функцією c, визначення якої неперевершено

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

створює таблицю зі списками, кожен з яких складається з декількох "v"s поспіль, а потім декількох ">"s з наступним новим рядком. На щастя, діапазон #3для зовнішньої Tableможе мати назву змінної, на яку можна посилатися у виразах #1та #2; це дозволяє cвикликати функцію як константними, так і змінними аргументами. Решта - це лише обчислення, і оператор приєднання рядків ""<>розгладжує вкладені списки, які виникають безкоштовно.


2

Python, 3,5 183 177 байт

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

Пояснення вхідних.

Спробуйте в Інтернеті!


Тільки щоб ви знали, TIO Nexus працює краще, ніж TIO v2 на даний момент, оскільки v2 перебуває на "ранньому етапі альфа"

Щоб зберегти один байт, ви можете призначити 'v' верхній змінній.
nedla2004

@JackBates Зауважив належним чином.
Гурупад Мамадапур

@ nedla2004 Ви маєте на увазі так n,v=int(input()),'v':? Тоді це нічого не економить.
Гурупад Мамадапур


1

Пакетна, 279 байт

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

Примітка: другий рядок закінчується пробілом. Пакет має проблеми з відлунюванням >s у змінних, тому я повинен a) використовувати замінник b) викликати підпрограму, щоб повторити виправлену рядок. Насправді у мене є три підпрограми:

  • aвикористовується для каблука. Один vвидаляється кожен раз і >додаються три s. >Додано два додаткових s, щоб підпрограма могла потрапити в bпідпрограму.
  • bвикористовується для нижньої частини стопи. Два >с видаляються щоразу. Потім підпрограма потрапляє в cпідпрограму.
  • cдрукує поточний рядок шкарпетки, замінюючи символ заповнення так, щоб >s друку було належним чином.

Четверта лінія обробляє ширину ніжки, тоді як п'ята лінія обробляє її довжину. Сьома лінія обробляє довжину стопи, тоді як восьма лінія обробляє верхню половину висоти стопи, додаючи два >>до кожного рядка після його друку. Це працює для розмірів шкарпеток, кратних 4, і для інших розмірів шкарпеток робиться коригування, щоб найдовша лінія не повторювалася.


0

PHP, 229 байт

досить ледачий підхід

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

друкує провідний новий рядок. Бігайте з -nr.

зламатися

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

постійного струму , 269 байт

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

Гаразд, ну ... це масово . Це було непросто, я вам скажу так багато, що з усіма посиланнями на регістри, порівняннями, макросами, відсутністю здібностей до маніпуляцій з рядками тощо. Тим не менш, мені було весело разом це робити, і це все, що насправді має значення, правильно ? ;)

Спробуйте в Інтернеті!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.