Простой сегодня. Напишите самую короткую программу, которая рисует «пилообразный алфавит» с заданным положительным целым числом для высоты. Вы должны написать название своего языка программирования, когда придете к букве, с которой он начинается.
Например, если ваш язык Python, а входные данные 1
должны быть такими:
ABCDEFGHIJKLMNOPythonQRSTUVWXYZ
Если на входе 2
вывод, должен быть:
B D F H J L N Python R T V X Z
A C E G I K M O Q S U W Y
Если на входе 4
вывод, должен быть:
D J Python V
C E I K O Q U W
B F H L N R T X Z
A G M S Y
Заметки
A
всегда начинается внизу слева.- Ввод может быть через стандартный ввод или вызов функции или аналогичный. Вывод на стандартный вывод.
- Вход выше
26
не должен работать. - Нет пробелов.
Ответы:
если n содержит высоту:
E + ESC коды: 81
С: 110
источник
cc
выдает ошибку «<bebe.c: 1: 17: error: 'n' undeclared (первое использование в этой функции)».n
это глобальная переменная, для которой установлено число по вашему выбору (как ранее спрашивал Мартин).С, 134
Компилирует на gcc с несколькими предупреждениями. Новые строки не включены в число символов.
122 символа, если вход уже сохранен в
n
.Благодаря user2992539 , Толосы и edc65 для улучшения.
источник
puts("")
вместоprintf("\n")
.p-=(c-n+r)%m*((c-n-r)%m)?0:printf("%*c",p,c+65);
вместоif((c-...
n,m,c,p; main(r){ for(scanf("%d",&n),m=--n?n*2:1;n+r--;puts("")) for(c=-1,p=1;c++<25;) p+=(c-n-r)%m*((c-n+r)%m)?1:1-printf("%*c",p,c+65); }
TI-BASIC - 148 байт (необработанный текст), 186 байт (графическое изображение)
В ответ на OP, замечательный TI-83 (и более новый) поставляется с размером 16 x 8 (только с использованием стандартного большого текста) или с размером 94 x 62 пикселей (который с маленьким текстом стоит около 10 строк) ).
Теперь у этого есть небольшая проблема (к которой я хотел бы разъяснения). Наложение размера не может быть «проигнорировано» интерпретатором; Другими словами, если бы мы попытались установить высоту пилообразного сигнала на 20, это привело бы к ошибке, препятствующей полному выполнению кода. Я мог бы написать код, который в бесконечной среде будет производить правильный вывод, за исключением того, что он не будет работать на машине.
С учетом сказанного, я представляю вам (запущенные) версии программ. Все они зависят от переменной
N
, установленной на желаемую высоту в строках перед запуском:Текстовый подход
Для того , чтобы сделать эту работу независимо от терминала, изменения
For(C,1,16
кFor(C,1,33
и удалить верхнюю границу проверки (R<2 or
). Вот вывод с5→N
:Графический подход (это также может понадобиться
AxisOff
для ясности)Этот работает хорошо, с двумя незначительными причудами. Высота все еще проблема, хотя ширина не. Однако я не пробел буквы, поэтому в некоторых случаях (когда буква начинает подниматься или опускаться от пилообразного), буквы могут быть отрублены их преемниками. Чтобы он работал независимо от терминала, уберите галочку с верхней границы (
R<7 or
). Затем следует график:источник
0→F
вас можно сделать,Delvar F
что экономит 1 байт после токенизации. Кроме того, я уверен, что вы можете факторизовать вывод / текст ближе к концу благодаря встроенному логическому условию теста для координаты, а дляC+7→C
, запишите его в краткомЧистый Bash (без coreutils), 181 байт
Выход:
Переданный, чтобы
cat -E
только доказать, что нет никаких заключительных новых строк.источник
JavaScript (ES6) 231
244Редактировать Исправление ошибки, некоторое изменение порядка и другой способ управления высотой == 1
Более того, оно изменено на функцию, так как это разрешено OP, поэтому не требуется подсказка () для ввода
Никаких изменений в общем алгоритме, который, вероятно, НЕ является лучшим для этой задачи
Разъяснения
Примеры
1
3 идет вверх
4 сверху
7 спускаясь
источник
ЯВА (393)
Как всегда отличный язык для игры в гольф:
источник
java.util.Arrays;
. :-(String x="ABC...Z";
и заменитьfor(char c...
заголовок цикла наfor (char c=65;++c<91;){
, я люблю символы в Java =)c=='J'
наc==74
, экономит еще два байта.public class p{public static void main(String[]a){int h=Integer.valueOf(a[0]),i=h-1,d=-1,n;String[]l=new String[h];for(n=0;n<h;l[n++]="");for(char c=64;++c<91;){for(n=0;n<h;n++){String k=n==i?c==74?"Java":c+"":c==74?" ":" ";l[n]+=k;}if(i==0&d==-1)d=1;if(i==h-1&d==1)d=-1;i+=h>1?d:0;}for(String s:l)System.out.println(s);}}
@Quincunx: больше нет необходимости в import.util.Arrays; =)Рубин, 112 байт
Ожидает, что вход будет сохранен в
h
.Дайте мне знать, если это нужно уточнить.
источник
%
.puts o...
на$><<o...
.J: 75 байт
Используя замечательное соединение Amend . Как обычно, IO уродлив и неуклюж, не вдаваясь в детали. Основное решение занимает 3 герунда (своего рода существительный глагол (aka. Function)):
c) создание матрицы для внесения поправок в
x (a
b
c}) yа) довольно тривиальный поиск в таблице ascii
в) еще тривиальнее
б) интересный. Мораль такова, что горизонтальные индексы должны начинаться с 0, переходить в y-1 и обратно, повторяя это 26 раз. Например. для y == 4:
Реализация этого дает для б):
И да, полезный факт: J зовут ... "J".
источник
3 :'|:(26$1+(i.1=y),}:|i:<:y)|.@{."+u:65+i.26'
Уродливой части в этом решении являются 8 символов только для особой высоты 1, но это, вероятно, можно немного сократить.R (204)
Результат
источник
for
утверждений, хотя (for(i in 1:x)cat(...
например) или вокруг%in%
.Javascript -
248224235Вот ссылка на jsfiddle, где вы можете протестировать его.
редактирование: сделал консольный журнал для моноширинного шрифта и удалил запятые, если input == 1.
источник
|0
или~~
. 2: короче, чтобы построить массив w напрямую, безsplit
.for(w=[],v=0;v<z;v++)w[v]="\n";
(i==9?" ":" ")
вы могли использовать(i^9?" ":" ")
, который сохраняет символ.Perl 119
Эта программа принимает входные данные
STDIN
и печатает результат вSTDOUT
.И бонус - версия, которая противоречит правилам, так как печатает конечные пробелы, но добавляет некоторое взаимодействие:
... и некоторые тесты ниже:
источник
J,
67 5761 символовИспользовать как функцию:
Пояснение: это решение использует другой подход, чем другое решение J. Вместо генерации пилообразной волны 0 1 2 3 2 1 0 1 ... я посмотрел на расстояние между последовательными буквами. Например, при п = 4 , если вы идете от А вверх, плотно прилегать к второй колонке и достичь B, то вы найдете четыре пробела между A и B. Эта схема растягивания между буквами очень регулярно: для п = 4 картина 4 4 4 2 2 2 4 4 4 ... .
Таким образом, идея состоит в том, чтобы сначала построить уплощенный (и транспонированный) массив, а затем изменить его и перевернуть так, чтобы он выглядел правильно. Процедура вывода проста (по крайней мере, для J): dtb означает «удалить конечные пробелы» и
"1
говорит «работать с каждой строкой». dtb и echo предоставляются стандартной библиотекой.Спасибо Zsbán Ambrus за помощь в игре в гольф.
источник
МетаПост (207)
Вы можете попробовать это здесь.
источник
Баш (213)
(223)Незначительные изменения, и мы до 213.
В оригинале была небольшая ошибка. Протестировано и подтверждено работа на bash версии 4.2.37.
Спасибо @manatwork за указание на ошибку и некоторые советы.
источник
;
чтобы сделать их чуть более читабельными? Это не повлияет на ваш счет в гольфеHaskell - 432 байта (к сожалению ...)
Оказалось, что это оказалось намного сложнее, чем я ожидал, чисто отсюда, отсюда и огромное количество байтов. Я уверен, что я (или кто-то) мог бы сделать лучше, но я потратил слишком много времени на это, как есть. Версия для гольфа выглядит следующим образом:
Для запуска загрузите код
ghci
и выполнитеputStr $ s Int
там, гдеInt
вы хотите нужную высоту. Вы также можете добавитьпод
import
s в текстовом файле скомпилируйте егоghc
и передайте высоту в качестве аргумента командной строки. Безголовая версия:источник
const
наpure
(используя экземпляр Applicative для функций), чтобы сохранить несколько байтов.C # / LINQ:
Краткое объяснение:
Enumerable.Range(0, N).Select(...)
заставляет генерировать строку для каждой строки, которая в итоге объединяется в одну строку сString.Join(Environment.NewLine, ...)
. Для каждой строки, с которой мы перебираем все 26 символовEnumerable.Range(0, 26).Select(...)
, тест в начале лямбда-выражения определяет, генерировать ли символ или пробел во времяi==2
проверки на «C», и преобразует его в «C #» или в два пробела в зависимости от строки , ВString.Concat(...)
обращенных в результатеIEnumerable<char>
для каждой строки в строку перед его передачей ,TrimEnd(...)
чтобы аккуратно стирают любой замыкающие пробелы.источник
PHP
(216)(205)Новая версия:
Старая версия:
ожидает, что переменная $ i будет высотой.
источник
C,
214169 байт, без пробеловСпасибо @ edc65 и @tolos за их полезные советы.
источник
scanf
иprintf
) были предоставлены прототипами, в противном случае вы получите неопределенное поведение.#include <stdio.h>
Это, конечно, самый короткий способ дать прототип обоимscanf
иprintf
.int
объявление для main, если вы ничего не возвращаете. Может упасть дополнительные скобки, заменить' '
с32
иif(!C)m=c
с ternarny заявление, и , как я только что узнал (выше) заменитьprintf("\n")
сputs("")
для 18 знаков:n,i,m,c,z;main(){;scanf("%d",&n);z=n<2?1:2*n-2;for(;i<n;i++){for(m=c=65;c<91;c++)m=C?m:c;for(c=65;c<=m;c++)printf("%c",C?32:c);puts("");}}
Javascript (
204 185150)РЕДАКТИРОВАТЬ
Сохранено 13 байт, не создавая массив и .join ("\ n"). Требуется перевернуть петли. Затем, с помощью сына C coding, сделал код слишком умным, чтобы сохранить еще 12 байтов.
Вот читаемая версия, показывающая изменение логики.
Гольф (161):
Гольф и запутанный (149):
источник
.substr(a,1)
=>[a]
h=m=4;d=1<h?-1:0;o=[];for(a=0;35>a;a++){for(r=h;r;r--)o[r]=(o[r]||"")+(r==m?"ABCDEFGHIJavascriptKLMNOPQRSTUVWXYZ"[a]:" ");if(9>a|17<a)if(m+=d,2>m||m==h)d=-d}console.log(o.join("\n"))
К, 60 байтов
Довольно просто, и, похоже, я только что выбил J-решение. :)
Сначала создайте алфавит:
И пилообразная волна соответствующей длины:
Дополните каждую букву алфавита начальными пробелами:
Сожмите алфавит и прямоугольную волну вместе и поверните каждую строку:
И транспонирование этого является нашим ответом:
Попробуйте это здесь, в порядке .
источник
C:142139 символовУжасно долго, я ожидаю, что смогу немного сократить его:Чуть более читабельно:
Изменить: я пропустил правило "без пробелов", но я вернусь.
источник
Scala, 246 байт
переформатировал и прокомментировал:
Полученные результаты:
источник
Python - 137
Вклад для хранения в ieg
i=8
источник
рэкет
Вот чистая функциональная версия: предложения по ее сокращению приветствуются.
Выход
источник