! Я! П! S! Е! Г! Т! ! П! Б! Е! Т! Ш! Е! Е! П!


24

Опубликовано здесь .

Эта проблема очень "искажена" из этого вопроса. Отдельное спасибо @Akababa!

В этой задаче вы должны вставить восклицательный знак в начале строки и после каждого символа.

правила

  • Всегда будет ввод непустой строки. Ввод также не будет содержать вкладки. Можно предположить, что входные данные содержат только расширенные печатные символы ASCII и символы новой строки.
  • Входные данные не будут содержать завершающие символы новой строки, если ваш язык не может обнаружить новую строку.
  • Это соревнование по ; самый короткий ответ должен победить.

Примеры

  • 4 символа новой строки дают 5 восклицательных знаков с разделителями. Очень трудно поместить это как текст Markdown, так что это указывается вместо этого.
1 2 3 4 5 6
129591 129012 129127 129582

0

Выходы

! 1! ! 2! ! 3! ! 4! ! 5! ! 6!
! 1! 2! 9! 5! 9! 1! ! 1! 2! 9! 0! 1! 2! ! 1! 2! 9! 1! 2! 7! ! 1! 2! 9! 5! 8! 2!
!
! 0!
asd afjoK ak: e
kPrLd
    fOJOE;
    KFO
КФкепйгоп сгпаой фай

Выходы

! A! S! D! ! А! Е! J! O! K! ! A K:! Е!
! К! Р! Г! Л! Д!
! ! ! ! ! Ф О J O E!!!!!;!
! ! ! ! ! K! F! O!
! K! F! К! Е! Р! J! Г! О! Р! ! S! Г! Р! А! О! J! ! ! ! Е! А! J!

Базовый контрольный пример только с одним символом:



Выходы

! А!

(Автозаполнение! Шучу, такого нет.) Содержит восклицательные знаки:

!!
!!
!!
!!
!!

Выходы:

!!!!!
!!!!!
!!!!!
!!!!!
!!!!!


7
Я действительно не понимаю отрицательный голос - это четкая и хорошо написанная задача. Re: быть дубликатом - это не так (предшествующее '!' Имеет большое значение), и я не верю, что кто-либо предлагал это (нет близких голосов).
Джонатан Аллан

1
если язык не может определить разницу между a\nи a, можем ли мы требовать, чтобы не было завершающих строк?
Джузеппе

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

2
Это мертвый
В. Куртуа

Ответы:



12

Python 3 , 27 байт

lambda s:f"!{'!'.join(s)}!"

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

Честно говоря, я надеюсь, что кто-то может показать мне классный способ сделать это с меньшим количеством байтов.


Это неправильно обрабатывает случай пустой строки
отслаивается

@flakes Что ты имеешь в виду? Если вы имеете в виду пустую строку: нам не нужно обрабатывать пустую строку (и независимо от этого выводит !!в этом случае, что является для меня смыслом). Если вы имеете в виду строку \n: это так, поскольку правильный вывод !\n!.
Джонатан Аллан

3
@JAD Насколько я вижу, в примерах нет пустой строки. Не только это, но и первое правило буквально гласит: «всегда будет ввод непустой строки».
Восстановить Монику

1
Ах, я был не прав. Первый пример имеет пустую строку в середине ввода. Но этот ответ будет обрабатывать размещение восклицательного знака в середине этого !\n!\n!,. хорошо сделано.
хлопья

1
codegolf.stackexchange.com/questions/190223/insert-nbetween/… как вы говорили, чтобы показать более короткий путь
U10-Forward - восстановить Монику


10

Сетчатка 0.8.2 , 2 байта


!

Попробуйте онлайн! Наконец, вызов, где Retina имеет встроенный!


1
На самом деле, я создал этот вызов на основе этой встроенной Retina.


-1 байт в QuadR.

2
@A__ Правильно, я забыл об этой функции ( если есть только одна нефункциональная строка ... ). Вы можете пересмотреть свою галочку .
Адам



8

JavaScript (ES6), 19 байт

Принимает ввод как массив символов.

s=>`!${s.join`!`}!`

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


JavaScript (ES6),  23  20 байт

Сохранено 3 байта благодаря @ShieruAsakoto

Принимает ввод в виде строки.

s=>[,...s,,].join`!`

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


JavaScript (ES6), 22 байта

Предложил @tjjfvi

Принимает ввод в виде строки.

s=>s.replace(/|/g,"!")

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



@tjjfvi Отличный!
Арно

5
У меня есть 20 для твоих 23:s=>[,...s,,].join`!`
Сиру Асакото

7

R , 25 байт

function(x)gsub("","!",x)

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

Функция, принимающая и возвращающая символьный вектор.


Можно сбрить 3 байта, переключив форму функции на scan(,''), например, tio.run/##K/r/P724NElDSUlHSVFJpzg5MU9DR11dU/O/…
Sumner18

@ Sumner18 спасибо. Я начал с этого, но он разделяет ввод в пробелах.
Ник Кеннеди

1
@ Sumner18 Задача состоит в том, чтобы обрабатывать ввод с помощью новых строк, чего нельзя сделать scan(но с помощью которого решение Ника справляется, по крайней мере, если вы отображаете вывод с помощью cat.)
Робин Райдер

7

8086 машинный код, формат .COM (MS-DOS 2+), 32 байта

(-1 в зависимости от эмулятора: см. Ниже)

Для достижения наилучших результатов перенаправьте стандартный ввод из файла, так как при наборе текста получается странный вывод из-за отсутствия буферизации; Кроме того, переводы строки выглядят немного странно, потому что они хранятся как CR LF, а CRчасть портит вывод.

Эта программа работает нормально в реальной эмуляции MS-DOS (например, PCjs), но DOSBox, похоже, имел проблемы с Ctrl + Z EOF (см. Комментарии в листе сборки), поэтому НЕ пытайтесь вводить ввод с помощью консоли в DOSBox, если вы добавить дополнительную проверку!

BB 01 00 53 59 BA 0B 01 B4 40 CD 21 4A 4B B4 3F CD 21 85 C0 74 09 B4 40 43 41 CD 21 49 EB EE C3

Некоторые интересные биты:

  • Я сохранил некоторое пространство данных за счет многократного использования памяти , которая уже была выполнена ( 21Hв INT 21Hслучается !)

  • Я был почти в состоянии использовать интересный трюк, который я нашел на странице «Скрытая сила команд BCD», который позволил бы мне использовать AAAвместо стандарта TESTсравнение ALс 0, сохраняя один байт. К сожалению, это не полностью задокументировано, поэтому я не мог на это полагаться: например, PCjs не регулирует ничего, кроме флагов переноса и вспомогательного переноса. :-(

Код сборки (идеальный режим TASM):

IDEAL
MODEL   TINY

CODESEG
ORG 100H

;; DOSBox (tested with 0.74-2) didn't seem to handle Ctrl-Z as EOF
;; so uncomment the ";;" lines to run it there.
MAIN:
    MOV     BX,1
    PUSH    BX
    POP     CX
    MOV     DX,OFFSET MAIN_1+1  ; The 21H in INT 21H
    MOV     AH,40H
MAIN_1:
    INT     21H
    DEC     DX
    ;;PUSH  DX
    ;;POP   SI
IO_LOOP:
    DEC     BX
    MOV     AH,3FH
    INT     21H
    ;;; This should work on an non-emulated PC. 
    ;;;AAA      ; AL=0?
    TEST    AX,AX
    JZ      DONE
    ;;CMP   [BYTE PTR SI],1AH
    ;;JZ    DONE
    MOV     AH,40H
    INC     BX
    INC     CX
    INT     21H
    DEC     CX
    JMP     IO_LOOP
DONE:
    RET
ENDS
END MAIN


6

Пепе , 47 байт

REREEeRErEErREeeEeeeeEREEeeREEeereeREEEEeeEReee

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

Объяснение:

REREEeRE # Push 0,then input (str),then 0 -> (R)
         # The zeroes are pushed to correct the inserting
rEE # Begin loop labelled 0 -> (r)
  rREeeEeeeeE # Push "!" -> (R)
              # r flag inserts it instead of pushing
  REEeeREEee # Move pointer pos 2 steps forward -> (R)
ree # Loop while (R) != 0
REEEEeeE # Remove characters of (R) that are in stack of (r)
         # Removes the 0 in (R)
Reee # Output (R)

Как вы пишете этот код? Какой конвертер кода вы используете? Это кажется сумасшедшим, чтобы попытаться написать
Cruncher

1
@ Cruncher 1) Я использую это в качестве руководства. 2) Нет, я не использую конвертер кода, я просто использую руководство для написания кода.
u_ndefined

6

Лабиринт ,  19 11 10  9 байтов

33
..
",@

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

Как?

Мы входим в Лабиринт в верхнем левом углу вправо с бесконечной стопкой нулей ...

                         I / O    stack
                                  0,0,0,...
3 - pop * 10 + 3                  3,0,0,0,...
  - 2 neighbours, forward
3 - pop * 10 + 3                  33,0,0,0,...
  - 2 neighbours, forward
. - pop & print chr          !    0,0,0,...
  - T junction from the side
  -   TOS==0, forward
, - read chr or -1       L        76,0,0,0,...   or   -1,0,0,0
  - T junction from the base
  -   if TOS > 0 right:
" -     no-op                     76,0,0,0,...
  -     2 neighbours, forward
. -     pop & print chr      L    0,0,0,...
  -     T junction from the side
  -       TOS==0, forward
3 -       ...back to the start
  -   elif TOS == -1 left:
@ -     exit                                          we're out!


  * right, but on the first occasion (from above) we hit the wall and turn
    around, so that's like a left

К счастью, нам не нужно обрабатывать непечатаемые документы, иначе первый нулевой байт перевернет нас ,и приведет к хаосу.


5

sed , 12 байт

s/\b\|\B/!/g

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

-3 байта благодаря Корове Кря


На самом деле код Sed всего 15 символов: попробуйте онлайн! ,
Манатворк

Отлично, спасибо. Мне было неясно, как это сработало ...
Иона

1
s/\b\|\B/!/gтакже работает для 12 байтов
Kritixi Lithos

@ Cowsquack спасибо. обновлено.
Иона

4

Zsh , 32 байта

for c ('' ${(s::)1})echo -nE $c!

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

(s::)разбивается на символы, ''добавляет пустой элемент в начало, а затем echo -nE $c!отображает каждый из них, после которого следует символ !.


4

Perl 5 -p0, 17 6 байтов

s,,!,g

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

Мой оригинальный ответ был -pи $_='!'.s,.,$&!,gr. Спасибо @Nahuel Fouilleul за сокращение 11 байтов и @Grimy за -p0отзыв.



1
@NahuelFouilleul -lpдает неверный вывод для \n\n\n\nконтрольного примера (возвращает 4 разделенных новой строкой !вместо указанных 5). -p0работает правильно.
Grimmy

4

6502, 12 байт (13 байт, если Apple II)

6502

Машинный код предполагает, что пара местоположений нулевой страницы подключена к аппаратному обеспечению ввода ($ FE) и вывода (FF). Многие системы на основе 6502 облегчают ввод-вывод таким способом, хотя адрес ввода-вывода обычно не находится на нулевой странице.

Для простоты я использовал Py65 , симулятор микрокомпьютерной системы 6502, написанный на Python.

Вот дамп памяти от Py65. Вы можете загрузить следующий код в любом месте нулевой страницы, чтобы он не перекрывал $ FE и $ FF.

       PC  AC XR YR SP NV-BDIZC
6502: 0000 00 00 00 ff 00110010
.mem 0:b
0000:  a9  21  85  ff  a5  fe  f0  fc  85  ff  d0  f4

Запустив в командном окне Windows, вы можете вставить (Ctrl + V) любой текст, который вы хотите, или вы можете просто напечатать. Если вы печатаете, нажмите Ctrl + J для новой строки (тот же символ ASCII). Нажмите Ctrl + C, чтобы прервать работу процессора и вернуться в командную строку Py65.

Естественно, ассемблерный код легче читать.

       PC  AC XR YR SP NV-BDIZC
6502: 0000 00 00 00 ff 00110010
.d 00:0b
$0000  a9 21     LDA #$21
$0002  85 ff     STA $ff
$0004  a5 fe     LDA $fe
$0006  f0 fc     BEQ $0004
$0008  85 ff     STA $ff
$000a  d0 f4     BNE $0000

Для наглядности вот код сборки в формате CBA65 .

; ASSEMBLE:
; cba65 bangit
;
; LOAD/RUN
; python3 py65/monitor.py -i 00fe -o 00ff -l bangit.bin
; goto 0000

        .FILES  BIN=256

; I/O LOCATIONS
GETC    .EQU    $FE             ; (1) MOVING PY65'S GETC TO ZP SHAVES 1 BYTE
PUTC    .EQU    $FF             ; (1) MOVING PY65'S PUTC TO ZP SHAVES 2 BYTES

        .ORG    $0000

VROOM   LDA     #'!'
        STA     PUTC
VROOM2  LDA     GETC
        BEQ     VROOM2
        STA     PUTC
        BNE     VROOM

        .END

Apple II

Приведенный выше код предполагает, что нулевое значение указывает на отсутствие ввода, поэтому продолжает опрос, пока не будет возвращено ненулевое значение.

Для сравнения, Apple I и Apple II сигнализируют о доступности нового символа, устанавливая бит 7 адреса ввода-вывода клавиатуры, который затем необходимо очистить после извлечения символа. В этих системах символьный ввод-вывод обычно выполняется путем вызова процедур системного монитора вместо прямого доступа к оборудованию.

Вызывая RDKEY ($ FD0C) и COUT ($ FDED), Apple II эквивалент вышеупомянутого может быть закодирован в 13 байтов и может быть запущен где угодно в оперативной памяти. Вот код, который я запускал в эмуляторе Apple // e, a2ix на Android 9.

Нажатие Return имеет тот же эффект, что и перевод строки.

*300L

0300-   A9 A1       LDA   #$A1
0302-   20 ED FD    JSR   $FDED
0305-   20 0C FD    JSR   $FD0C
0308-   20 ED FD    JSR   $FDED
030B-   F0 F3       BEQ   $0300

Вы заметили, что вместо нормального значения ASCII # $ 21 для восклицательного знака вместо него используется # $ A1? Это происходит потому, что отправка стандартных значений ASCII в COUT приводит к их отображению в «инверсном режиме», черным по белому. Отображение ASCII обычным белым на черном требует добавления $ 80 к значению символа в аккумуляторе перед вызовом COUT. Поскольку RDKEY возвращает символы с установленным hi-bit, программы сборки обычно очищают бит символа, чтобы получить его значение ASCII перед его использованием.


1
Добро пожаловать на сайт! :)
Рахул Бхарадвад

Спасибо, @Rahul!
Ли

4

Баш , 36 байт

while read -n1 c;do printf \!$c;done

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

Это означает, что перевод строки завершает ввод последней строки! отметка.


Добро пожаловать! Пожалуйста, рассмотрите возможность добавления объяснения или ссылки на переводчика или что-то еще, потому что ответы только для кода автоматически помечаются как некачественные.
mbomb007

@ mbomb007, спасибо за указатель.
Спак

1
К сожалению, это не добавляет !в конце ввода.
Критиси Литос

@ Cowsquack: на моем терминале новая строка, завершающая ввод, получает! добавлено. На tio.run ввод должен завершаться переводом каретки. Я обновил ссылку на Попробовать онлайн, чтобы отразить это.
spuck

4

MarioLANG , 95 94 90 89 69 байт

++++++
======< >)
>+++++++",+[
=======<.==<
>+++++++!(.-
========#===

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

Впервые попробовать MarioLANG, это было очень весело!

Спасибо Джо Кингу за -20 байт

Объяснение:

Таким образом, как следует из названия, MarioLANG создан, чтобы играть как игра Super Mario Bros. Он работает аналогично BF, с памятью, упорядоченной в виде ленты ячеек. Существуют операторы для увеличения, уменьшения, печати (как ascii или числовые) и считывания в текущую ячейку памяти, а также операторы для перемещения влево или вправо по ленте.

Марио (указатель инструкций) всегда начинается в верхней левой ячейке программы, причем его предполагаемое направление движения установлено вправо. Если у Марио нет объекта наподобие пола (=, "или #), он упадет, пока не достигнет напольного объекта. Если Марио покинет пространство программы, программа завершится из-за Game Over :(

Эта конкретная программа может быть в основном разделена на две половины: настройка и цикл.

   Setup                          Loop
-----------------------------------------------
                       |
++++++                 |          
======<                |          >)
>+++++++               |          ",+[
=======<               |          .==<
>+++++++               |          !(.-
========               |          #===

В разделе «Настройка» мы просто увеличиваем первую ячейку памяти, пока не достигнем 33 - значение ASCII для «!». Достаточно просто; если это можно сыграть в гольф, это просто вопрос формы. Марио начинает сверху слева, поднимает 10 монет, начинает падать, когда поднимает 11-е, меняет направление, затем повторяется. Он подбирает последние 11 монет без смены направления; он заканчивает раздел настройки в крайнем правом нижнем углу "+".

В секции петли Марио начинает с лифта. "!" Оператор заставляет его прекратить движение, чтобы он оставался на лифте. По пути он печатает соответствующий символ ASCII в текущем значении ячейки памяти (это всегда 33, «!»), Затем переключается на следующую ячейку в памяти. Марио достигает вершины и задает направление вправо. Он падает и читает символ из ввода как его значение ASCII (или -1, если нет символа). Мы увеличиваем, потому что единственная мера контроля в MarioLANG - это пропуск инструкции, если текущая ячейка памяти имеет значение 0. Если это так, мы пропускаем изменение направления Марио, поэтому он сразу уходит со следующего этажа к своей гибели. Если это не так, мы устанавливаем направление налево; шаг влево от пола ниже уменьшает текущую ячейку до ее предыдущего значения,


Предыдущая версия (89 байт):

+++++++++++>,
==========@"+
+++++++++++)[
@==========.==<
+++++++++++!(.-
===========#===

62 байта , используя цикл умножения вместо счетчика
Джо Кинг

Хорошо, теперь это круто. Я обновлю, как только у меня будет время, чтобы повторить объяснение, спасибо большое!
Восстановить Монику

1
Ага! 60 байтов путем умножения 5 * 6 + 3 вместо 8 * 4 + 1
Джо Кинг

Чувак, я знаю, что это не совсем твой первый родео, но это действительно впечатляет. xD
Восстановить Монику

На самом деле, я впервые играю в гольф MarioLANG. У меня просто есть некоторый опыт работы с brainfuck, а также с другими языками 2D
Джо Кинг,

4

Perl 6 , 16 11 байт

{S:g/<(/!/}

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

Заменяет все совпадения нулевой ширины восклицательными знаками. Нулевые регулярные выражения недопустимы, поэтому мы используем маркер захвата, чтобы ничего не захватывать





3

Треугольный , 15 13 байтов

B\3;#*~.,</@<

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

-2 байта после запоминания того, что у Triangular есть оператор условного останова.

Я считаю, что это так же коротко, как и на этот. Треугольный делает имеют условные операторы направления-изменения, но они , к сожалению , работают иначе , чем другие условные. В то время как все остальные проверяют, является ли ToS <= 0, условные выражения, изменяющие направление, проверяют ToS! = 0. Если бы это было не так, у нас было бы 10 байтов в форме Bq3~#*/@<<.

Ungolfed:

    B
   \ 3
  ; # *
 ~ . , <
/ @ <
----------------------------------------------------
B3*              - Push 11 and 3, then pop both and push their product.
    <,<          - Change directions 3 times (to save 2 bytes on last line)
        @/       - Print Top of Stack value as a character, do not pop
          ~;\    - Push a character from input to ToS. Halt if ToS <= 0. Change Direction.
              #  - Print ToS as a character and pop

Предыдущая версия (15 байт):

B.3\.*#).(/?~@<

3

SimpleTemplate , 23 байта

Это язык, который я написал, и он должен был быть для шаблонов, но хорошо.

!{@eachargv.0}{@echo_}!

Должно быть почти самоочевидным, как только вы увидите некоголенный код:

!{@each argv.0 as char} {@echo char}!{@/}

И объяснение:

  • !- печатает буквальный !символ
  • {@each argv.0 as char}- Перебирает каждый символ со значением, установленным для переменной char( необязательно , переменная по умолчанию - _).
    argv.0это первый параметр, переданный render()методу компилятора.
  • {@echo char}!- выводит charпеременную и буквальный !символ.
    Для версии для гольфа используется переменная по умолчанию _.
  • {@/}- закрывает цикл ( необязательно )

Чистое решение SimpleTemplate :

{@fn x}!{@eachargv.0}{@echo_}!{@/}{@/}

Создает функцию, xкоторая выводит тот же результат.

Вы можете использовать это так:

{@call x "this is an example"}

Вы можете попробовать все это на: http://sandbox.onlinephpfunctions.com/code/f6baff8d411fc8227ece81eccf05b6e7d3586bfa

На линии 908, вы можете использовать переменные $golfed, $ungolfedи $fnпроверить все версии.



Однако, если разрешено использовать массив символов, код упрощается (20 байт):

!{@echoj"!" argv.0}!

И безглым

!{@echo separator "!" argv.0}!

По сути, выводит все элементы массива "!", окруженные литералом !.
Из-за ограничений в классе компилятора, место обязательно (в версии для гольфа).

Этот код также чрезвычайно сложно использовать в чистом SimpleTemplate (используя функцию в качестве примера):

{@fn x}!{@echoj"!" argv.0}!{@/}

{@// alternative: @call str_split into a "a char array"}
{@set a "a", " ", "c", "h", "a", "r", " ", "a", "r", "r", "a", "y"}

{@call x a}

@callМожет вызвать функцию , которая существует в PHP, что означает , что она не является чисто SimpleTemplate решения.



2

Гема , 11 персонажей

\A=\!
?=?\!

К сожалению, !начинается комментарий в Gema, поэтому должен быть экранирован.

Образец прогона:

bash-5.0$ echo -ne '1 2 3 4 5 6\n129591 129012 129127 129582\n\n0' | gema '\A=\!;?=?\!'
!1! !2! !3! !4! !5! !6!
!1!2!9!5!9!1! !1!2!9!0!1!2! !1!2!9!1!2!7! !1!2!9!5!8!2!
!
!0!

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





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