Синтаксис без сахара


55

В Хаскеле список обозначений:

[a,b,c]

Это просто синтаксический сахар для:

a:b:c:[]

И строка обозначений:

"abc"

Это просто синтаксический сахар для:

['a','b','c']

Это означает, что строка:

"abc"

Такой же как:

'a':'b':'c':[]

задача

Получив строку, вы должны вывести, как будет выглядеть десинтаксированная версия в Haskell.

правила

  • Вы получите строку любым допустимым методом ввода, вы должны вывести строку, заканчивающуюся :[]каждым символом из ввода, окруженного 'и разделенного :. Пустая строка должна вывести [].

  • Вы можете предположить, что вы не получите никаких символов, требующих экранирования (например ', новые строки, табуляции ...), и что ввод будет находиться в диапазоне ascii для печати.

  • Это вы должны стремиться минимизировать количество байтов вашего ответа

Тестовые случаи

"" -> []
"a" -> 'a':[]
"Hello, World" -> 'H':'e':'l':'l':'o':',':' ':'W':'o':'r':'l':'d':[]   

Будет ли вход когда-либо иметь не-ascii значения? Ваше ограничение на символы, требующие экранирования, требует либо того, чтобы мы знали, какие символы экранирует Haskell, либо предполагает, что ваш список является исчерпывающим.
FryAmTheEggman

@FryAmTheEggman Вы можете предположить, что они находятся в диапазоне ASCII
Wheat Wizard

7
@totallyhuman Это даже не действительный Haskell. Если бы они были, может быть, но приятно, что нет, определенно нет.
Пшеничный волшебник

38
Этот вопрос может быть альтернативно назван «Диета Хаскелла».
Март Хо

1
@cairdcoinheringaahing Нет, "и 'синтаксически разные.
Wheat Wizard

Ответы:


85

Haskell , 26 байтов

(++"[]").((++":").show=<<)

Попробуйте онлайн!

Объяснение:

В неточечной нотации и использовании concatMapвместо =<<этого это становится

f s = concatMap(\c-> show c ++ ":")s ++ "[]"

Для данной строки sмы сопоставляем каждый символ cсо строкой, "'c':"используя showфункцию, которая возвращает строковое представление большинства типов Haskell. Эти строки объединяются и []добавляется финал .

Хотя этот запрос не запрашивается, этот ответ даже работает с правильным экранированием, потому что showзаботится о нем: f "'"доходность "'\\'':[]".


25
Подожди, ты имеешь в виду (++'[':']':[]).((++':':[]).show=<<), нет?
Адам

11
Когда у любого вызова есть ответ на Haskell, я считаю его принципиальным. Это удваивается для этого.
Райан Райх

43

Haskell, 33 28 26 байт

foldr((.(':':)).shows)"[]"

Попробуйте онлайн!

foldзаданная функция pointfree справа во входную строку, начиная с []. Функция такова: показывать char как символ Haskell, то есть окружать 'и объединять результат до того, как поместить его :перед ним.

Редактировать: @ Ørjan Йохансен сохранил два байта. Спасибо!


Я полагаю, что это значит (++'[':']':[]).(>>= \c->'\'':[]++[c]++'\'':':':[]).
Адам

1
Я думаю, что это лучше, чем другой ответ на Haskell (с тем же количеством байтов), потому что он используется :для построения списка ++, хотя оба имеют свою элегантность.
CAD97

4
Это довольно удивительно. Два отдельных подхода с одинаковым количеством байтов на одном языке.
J Аткин



16

Common Lisp, 50 42 байта

(format t"~{'~a':~}[]"(coerce(read)'list))

Попробуйте онлайн!

Уменьшено благодаря комментарию @coredump, с использованием readвместо определения функции.


1
Добро пожаловать в PPCG!
Мартин Эндер

2
Лисп! Действительно добро пожаловать :)
Оливье Дюлак

@Renzo Привет, Ренцо, вы могли бы немного его уменьшить, используя анонимную лямбда-форму или просто вызвав read: (format t"~{'~a':~}[]"(coerce(read)'list))(некоторые другие вопросы более строги по отношению к входам и выходам, но здесь все в порядке)
coredump

@coredump, спасибо !, я обновил код.
Ренцо


10

C 55 54 53 байта

s(char*h){while(*h)printf("'%c':",*h++);puts("[]");}

1
Вы можете удалить место вchar *h
Cyoce

1
puts("[]");Вместо этого вы можете сделать вывод с завершающей строкой, чтобы сохранить несколько байтов.
Критиси Литос

рекурсивныйs(char*h){*h?printf("'%c':",*h++),s(h):puts("[]");}
l4m2

8

Python 3 , 41 38 36 байт

-2 байта благодаря овсу

print(*map(repr,input()),[],sep=':')

Попробуйте онлайн!


Упс ... Забыл, что *mapсуществует ...
Мистер Xcoder

Я был озадачен пустым в input()течение последних 20 минут (буквально), когда это могла быть просто лямбда @. @
Rod


@WheatWizard О, я использовал пустой-пустой (без новой строки) ввод
Род

Вы можете заменить "[]"с[]
овсом

8

05AB1E , 15 12 11 10 байт

-3 байта благодаря carusocomputing
-1 байту благодаря Adnan
-1 байту благодаря гениальной идее Эрика Аутгольфера

ʒ"'ÿ':"?},

Попробуйте онлайн!

ʒ          # Filter out every character that the following code doesn't return 1 for
 "'ÿ':"?   #   Print the string 'ÿ': with ÿ replaced by this character
        }  # End for
         , # No character returned 1 so an empty array is left on the stack. Print that

Видимо, я побил тебя на 4 секунды ;-)
Цифровая травма

1
@DigitalTrauma Ваше сообщение появилось, когда я нажимал Опубликовать ваш ответ.
Райли

1
Вы можете напечатать глобальный массив вместо того, чтобы заключать в скобки 3 байта. Вы также можете интерполировать строку для другой экономии байтов в общей сложности -3, конечный результат - 12 байтов:vy"'ÿ':"?}¯?
Волшебная урна осьминога

@carusocomputing Я все время использую строковый интерполятор для комплектов тестов, но забываю использовать его в реальном коде. Спасибо!
Райли

@carusocomputing Я думал, что vy"'ÿ':"}¯Jбудет работать для 11, но Jприсоединяется к глобальному массиву, а не весь стек в этой ситуации.
Райли

8

R, 51 байт

f<-function(x)(paste0(gsub("(.)","'\\1':",x),'[]'))

1
Отличное решение! Несколько способов сэкономить несколько байтов и по-настоящему избавиться от них. Ввод / вывод по умолчанию позволяет вам просто вернуть анонимную функцию или даже получить ввод из стандартного ввода, последний из которых будет гораздо короче, чем scan(,'')вместо функции.
Джузеппе

Спасибо, я немного новичок с R (и код гольф!), Поэтому еще не совсем понял анонимные функции, хотя я пытался сделать это без «функции» там. сканирование может быть полезным!
дц

ах, ну анонимная функция - это всего лишь та, где вы не назначаете ее переменной, поэтому вы просто отбрасываете ее f<-с начала своего кода
Giuseppe

paste0 (gsub ('(.)', "'\\ 1':", scan (, "")), '[]') - 43
Захиро Мор

8

Pyth, 14 10 8 байт

j\:a`MQY

Попробуй это!

-2 байта благодаря @isaacg

Наконец, Pyth хорош в чем-то.

объяснение

j\:a`MQY
    `MQ        # map the representation over the input string: ["'a'","'b'",...]
   a   Y       # append the empty list
j\:            # join on :

@isaacg Спасибо! Я забыл о, Mи я не знаю, почему я не использовал a. Теперь мы как минимум на 2 байта короче, чем все остальные решения здесь!
КарлКастор


7

Сетчатка, 12

  • 3 байта сохранены благодаря @FryAmTheEggman
,
'$ &':
$
[]

2 этапа:

  • для каждого оставшегося символа поместить ' ':вокруг него
  • добавить []в конец

Попробуйте онлайн .


Помог парню, которого ты избил, на 4 секунды связал тебя;).
Волшебная Урна Осьминога

Я думал об этом!
CalculatorFeline

6

Python 2 , 48 46 44 37 байт

-2 байта благодаря Роду. -7 байт благодаря Wheat Wizard.

lambda s:':'.join(map(repr,s)+['[]'])

Попробуйте онлайн!



О, аккуратно. Спасибо!
полностью человек

1
Один короче как lambda s:':'.join(map(repr,[*s,[]]))или lambda s:':'.join(map(repr,s))+":[]".
xnor

@xnor Второй пример, который вы приводите, не работает для пустого случая. (оригинальный ответ выглядел очень похоже на это, но заплатил много, чтобы покрыть случай с пустой строкой)
Wheat Wizard


6

JavaScript (ES6), 36 байт

s=>s?`'${[...s].join`':'`}':[]`:"[]"

Попробуй

f=
s=>s?`'${[...s].join`':'`}':[]`:"[]"
oninput=_=>o.innerText=f(i.value);o.innerText=f(i.value="abc")
<input id=i><pre id=o>


5

Желе ,  11 10  8 байт

-1 байт благодаря Кристиану (удалите конкатенацию ;и используйте неявную печать)

+0 байт (фиксированная для торцевого случае пустой строки - ранее полной программе: ŒṘ€j”:“:[])

-2 благодаря Erik the Outgolfer (использование pвместо этого ;€с ”:эффективностью длины 1; использование Ø[с тех пор, как оно стало сокращением для ⁾[])

ŒṘ€p”:Ø[

Попробуйте онлайн!

Полная программа, печатающая результат (в виде ссылки возвращает список списков символов).

... но есть ли способ сохранить с помощью STDIN?

Как?

ŒṘ€p”:Ø[ - Main link: list of characters, s  e.g. "Hey"
ŒṘ€      - Python representation for €ach    [["'",'H',"'"],["'",'e',"'"],["'",'y',"'"]]
    ”:   - literal character = ':'
   p     - Cartesian product                 [["'",'H',"'",':'],["'",'e',"'",':'],["'",'y',"'",':']]
         - implicit print (no newline): 'H':'e':'y':
      Ø[ - literal list of characters        ['[',']']
         - implicit print (no newline): []

4

PHP , 41 байт

<?=preg_filter("#.#","'$0':",$argn)."[]";

Попробуйте онлайн!


4 байт короче: for(;~$c=$argn[$i++];)echo"'$c':"?>[].
user63956

@ user63956 не нужно ли дополнительно <?с какой опцией его запускать? Сделайте свой собственный подход, я бы сказал, чтобы получить положительные отзывы, а Титус сделал что-то подобное в это время
Йорг Хюльсерманн

Работает с -Rфлагом. Теги могут быть закрыты даже в конструкциях типа eval()и create_function().
user63956

4

Perl 5 , 22 байта

19 байт кода + -pфлаг.

s/./'$&':/g;$\="[]"

Или для того же bytecount s/./'$&':/g;s/$/[]/.

Совершенно прямо: s/./'$&':/gокружает каждого персонажа кавычками и добавляет :после. $\неявно печатается после каждой распечатки, поэтому установка его на []выводит финал [].

Попробуйте онлайн!


4

Java (OpenJDK 8) ,86 83 76 байт

-3 байта благодаря @KevinCruijssen
-7 байтов благодаря @FlorianSchaetz

s->{String b="";for(char c:s.toCharArray()){b+="'"+c+"':";};return b+"[]";};

Попробуйте онлайн!


Вы можете сбросить 4 байта. Трейлинг ;не нужно считать лямбда-ответами, ;после }не нужно вообще, {а }можно и убрать вокруг цикла for. И вы могли бы сэкономить еще 4 байта в Java 10 изменяющемся как Stringи charв var.
Кевин Круйссен

4

брейкфук, 68 байт

+[-->+[<]>-]>>,[<.>.<.>>-[>+<+++++++++]>+.[-]<<,]-[+[+<]>>+]<+++.++.

Попробуйте онлайн!


Не совсем работает с пустой строкой - вернул мне два недопустимых символа в вашем онлайн-тесте. Очень хорошо, в противном случае.
NoseKnowsAll

@NoseKnowsAll я не могу воспроизвести это; Без ввода я не получаю вывод. Не могли бы вы предоставить обновленную ссылку с этим входом?
Даньеро

Это то, что я получил, когда я запускаю его . При пустом вводе он должен возвращать «[]» без кавычек.
NoseKnowsAll

@NoseKnowsAll Ваша ссылка идет на ввод "hello world" (обновите ссылку, нажав эту ссылку / цепочку), но да, я понимаю, что вы имеете в виду. Я посмотрю на это
Даниеро

1
@NoseKnowsAll Вот и все, я исправил это;)
daniero

3

Brain-Flak , 135 , 131 байт

{({}<>)<>}(((((((()()()()()){})){}{}())){}{})[()()])<>{<>(((((((()()()){}()){}){}()){})[(((()()()){})){}{}()])<>)({}<({}<>)>)<>}<>

Попробуйте онлайн!

+1байт для -cфлага.

Спасибо WheatWizard за удаление очень очевидных NOOP, которые у меня были без причины XD.


@WheatWizard> _> Да, я просто проверял тебя ... Хахаха, спасибо, что указал на это. Я попробую
сыграть

3

Стандарт ML , 52 50 байт

Сохранено 2 байта благодаря @Laikoni!

fn s=>String.translate(fn c=>"'"^str c^"':")s^"[]"

Попробуйте онлайн!

String.translateэто , к сожалению , длинное имя, но 5 байт короче , чем при использовании concat, mapи explode.


@ Лайкони спасибо! Я всегда забываю, что операторы имеют более низкий приоритет, чем функции.
musicman523

3

Cubix , 31 29 байт

uo@[)o'U);!A?ro;o;o;os:'/u:''

Aтакже может быть заменен i; пытаясь выяснить, есть ли хороший способ выжать еще один или два байта из этого. -2 байта благодаря MickyT! Также перехитрил MickyT !

Устанавливается на куб 3x3x3:

      u o @
      [ ) o
      ' U )
; ! A ? r o ; o ; o ; o
s : ' / u : ' ' . . . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

Смотреть онлайн!

Попробуйте онлайн!


Вы можете сохранить пару байтов, используя пару приращений для последней скобки. Это позволяет немного uo@[)o'U);!A?ro;o;o;os:'/u:''
сжать




2

PHP, 39 байт

<?while(~$c=$argn[$i++])echo"'$c':"?>[]

Беги как труба с -F.



2

Cubix , 27 байтов

uosW?U.iv":'"^soso;os@o[]'/

Попробуйте онлайн!

      u o s
      W ? U
      . i v
" : ' " ^ s o s o ; o s
@ o [ ] ' / . . . . . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

Смотреть это беги

Немного отличающийся вариант от ответа Гизеппа . Это помещает двоеточие и кавычку в стек. Затем он проходит по входам, меняя местами и выводя стек. Только входные данные удаляются, а двоеточие и кавычка сохраняются.

Как только достигнут конец ввода, IP немного удивляется кубу, добавляя и выводя скобки. В миксе есть пара избыточных команд.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.