Вяжи мне 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 посетил мою бабушку, и она спросила меня. Трудно сказать ей "нет", так что мы идем :) Закончил первый два дня назад. Я думаю, что это довольно хорошо, но я действительно недооценил объем работы. Так что будьте счастливы, если кто-то сделал носки для вас.
Излин

Могу ли я использовать vили Vвзаимозаменяемо? Я собираюсь предположить, что на данный момент это vразрешено только одно, но разрешение Vповлияет на количество байтов
Golden Ratio

@GoldenRatio Я изменил правила, теперь разрешены оба.
Излин

@GurupadMamadapur Как вы можете прочитать в «Ввод», только четные числа допускаются в качестве ввода. Ваша программа не нужно обрабатывать нечетные числа
izlin

Ответы:


2

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

Mathematica, 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 сверху.
Недла2004

@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используется для пятки. Один vудаляется каждый раз, а три >добавляются. Два дополнительных >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.