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


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.