Кодеры всегда пытаются сгладить массивы в скучные одномерные объекты, и это меня огорчает.
Ваша задача состоит в том, чтобы расстегнуть произвольную строку символов, выводя прекрасный городской пейзаж.
Рассмотрим строку: aaabbbbbccqrrssstttttttPPw
Это выглядит намного лучше, как это:
tt
tt
bb tt
bb tt
aabb sstt
aabbcc rrssttPP
aabbccqqrrssttPPww
(Хорошо, да, буквы продублированы, чтобы они выглядели как городские горизонты).
Возьмите строку ввода, продублируйте каждый подраздел соответствующих символов (не обязательно букв алфавита) и постройте мне город!
Самый короткий код байтов побеждает.
Я на самом деле думал, что у меня есть требования, но ответить на несколько вопросов:
- это должно быть на земле
- Вы можете иметь дополнительное небо, если хотите (ведущие пустые строки, окружающие пустое пространство) - но не между зданиями
- буквы могут быть повторно использованы внутри строки (та же архитектура, другое местоположение)
- Предполагается, что буквы ASCII, но больше внимания будет уделено тем, кто поддерживает дополнительные кодировки (UTF8 и т. д.).
aaabbbbaa
?Ответы:
05AB1E , 6 байтов
Попробуйте онлайн!
В версии, более новой, чем задача,
ζ
была добавлена в качестве замены для.Bø
05AB1E , 8 байтов
Объяснение:
Попробуйте онлайн!
источник
z⁶
для.Bø
... но он также имеетŒgx'2
дляγ€D
> _>γ.BD)ø˜øR»
было то, что я имел, не глядя,€D
намного лучше; Я чувствую, что нам обоим не хватает 1-байтового решения для встроенного дублирования.CJam , 23 байта
Попробуйте онлайн!
Объяснение:
источник
Желе , 9 байт
Попробуйте онлайн!
Объяснение:
источник
'
, которое состояло в том, чтобы повторять сами списки, а не элементы внутри них, но в целом это хорошо. :)Python 3 ,
155136134132 байта-19 байт благодаря @LeakyNun
-2 байт благодаря @officialaimm
-1 байт благодаря @Wondercricket
Попробуйте онлайн!
источник
Python 2 , 117 байт
Попробуйте онлайн!
источник
Ява 8,
412400330324312319 байт-6 байт благодаря VisualMelon
-12 байт благодаря Кевину Круйссену,
но +19 байт, потому что я забыл включить импорт в число байтов.
Попробуйте онлайн!
источник
i=0
или, что лучшеi=l
, и вести обратный отсчетfor(;i-->0;h=d>h?d:h)
(и добавитьh=
туда немного). Тот же обратный отсчет будет работать и для внутреннего цикла. Внутреннийif
также не нуждается в фигурных скобках{}
. И всегда надоедать<=
или>=
, вы можете перевернуть троичный с помощью>
и сохранить байт.import java.util.*;
дляMap
иHashMap
, импорт является частью количества байтов; -1 путем удаления конечной точки с запятой, что не часть подсчета байтов).import java.util.*;x->{Map m=new HashMap(),n;int l=x.length(),i=l,v,y,h=0,d=1;char c,k;for(;i-->0;m.put(c,d=m.get(c)!=null?d+1:1),h=d>h?d:h)c=x.charAt(i);for(y=h;y>0;y--){n=new HashMap(m);for(i=0;i<l;i++)if(n.get(k=x.charAt(i))!=null){v=(int)m.get(k);System.out.print((y>v?" ":k+""+k)+(i==l-1?"\n":""));n.remove(k);}}}
HashMap<>
→HashMap
;Map n=
→,n
иn=
;m.put(c,d=m.get(c)!=null?d+1:1);
внутри петли, чтобы избавиться от скобок;k=x.charAt(i)
внутри,if(n.get(k)!=null)
чтобы избавиться от точки с запятой и петли для скобок. И снова добро пожаловать и отличный ответ! +1 от меня. Кроме того, на случай, если вы еще этого не видели: советы по игре в гольф на Java и советы по игре в гольф на <любой язык> могут быть интересными для чтения.Джапт ,
1918151312 байтВключает конечные пробелы в каждой строке.
Попробуй это
объяснение
источник
Mathematica, 150 байт
источник
R 135 байтов
Попробуйте онлайн!
читает из стандартного ввода, пишет в стандартный вывод (с завершающим переводом строки).
Объяснение:
rle
находит длины полос персонажей, высоты каждой башни.sub
выражение заменяет каждый символ с его двойным (так что я не должен слоняться с установкой соседних индексов вместе)sapply
возвращает массив (в данном случае матрица):sum(e$l|1)
количество отдельных символов; мы идем сверху внизifelse( ... )
это векторизацияif...else
позволяющая нам построить матрицу башен и двойных пространствwrite
пишет в консоль, с несколькими вариантами форматирования.источник
Pyth , 13 байт
Попробуйте онлайн!
источник
PHP , 138 байт
Попробуйте онлайн!
источник
MATL , 15 байт
Попробуйте онлайн!
объяснение
источник
Древесный уголь , 40 байт:
Попробуйте онлайн! Ссылка на подробную версию кода. Первоначально я пытался выполнить простой цикл над строкой ввода, чтобы печатать продолговатую букву каждый раз, когда буква менялась, но я переключился на этот метод построения списка, так как он экономил 5 байтов. Объяснение: Переменная
l
содержит вложенный список вводимых букв. Символы, которые соответствуют текущим последним элементам списка, помещаются в последний список, в противном случае для этого символа создается новый подсписок. Затем остается объединить буквы в каждом подсписке, чтобы они могли печататься вертикально дважды.источник
C
259231 байтГольф-код
Подробный код
Составлено с GCC, без специальных флагов
редактировать
Сохранено 28 байт благодаря adelphus. Его изменение позволило мне создать определение. И я сделал цикл while для циклов for, чтобы сэкономить 2 байта каждый, переставляя цикл. Я также исправил проблему, из-за которой код ломался, когда последний введенный символ не был одиночным. Код не удастся, если есть только одна уникальная буква, но должен работать во всех других случаях.
источник
while (i < strlen(argv[1]))
может быть сокращено доwhile (argv[1][i])
- цикла до нулевого символаПип , 22 байта
21 байт кода, +1 для
-l
флага.Попробуйте онлайн!
объяснение
источник
QuadS , 15 + 1 = 16 байт
+1 байт за
1
флаг.Попробуйте онлайн!
⊖⍵
пост-процесс, переворачивая вверх дном(.)\1*
пробеги одинаковых персонажей2/⍪⍵M
дублировать столбец M ATCH1
Флаг приводит к тому , чтобы результаты были объединены вместе.источник
Haskell, 144 байта
Я уверен, что могу добиться большего, чем это, но это лучшее, что я могу придумать на данный момент.
источник
Data.List
которые не входят в область действия по умолчанию. Вы должны либо добавитьimport Data.List
счетчик байтов, либо указать среду Haskell, которая включает его по умолчанию (например, изменить язык сHaskell
наHaskell (lambdabot)
. - Некоторые советы: а) использовать шаблонную защиту для связывания переменных вместоlet
и / или объявления вспомогательных функций непосредственно:l=length;f s|x<-groupBy(==)s,m<-... =concatMap
. б)map l x
естьl<$>x
, в)concatMap("++\n"
естьunlines
. г)groupBy(==)
это простоgroup
. е)concat
естьid=<<
. Вы можете использоватьm
только один раз, так встраивать его()
вокругl y
,replicate ... ' '
иmap ... x
. В общем и целом:import Data.List;l=length;f s|x<-group s=unlines$reverse$transpose$id=<<[[z,z]|z<-map(\y->y++replicate(maximum(l<$>x)-l y)' ')x]
.groupBy(==)
=group
, хотя я не уверен, есть ли один в Prelude, а другой нет.concatMap
может быть написано>>=
, иmap
может быть добавлено<$>
, иconcat[[z,z]|z<-…]
может быть(replicate 2)=<<…
или(\z->[z,z])=<<…
(\z->[z,z])
(:)<*>pure
...transpose$(:)<*>pure=<<map(\y...)x
С накоплением , 42 байта
Попробуйте онлайн!
источник
Рубин , 116 байт
Попробуйте онлайн!
источник
puts a.map{...}
можно заменить наp(a.map{})
p
будет выводить символы кавычек, так что это здесь не подходитAPL (Dyalog) , 37 байт
Попробуйте онлайн!
источник
q / kdb +, 53 байта
Решение:
Пример:
Объяснение:
источник
Perl 5 , 92 + 1 (-p) = 93 байта
Попробуйте онлайн!
источник