! Я! N! S! E! R! T! ! n! b! e! t! w! e! e! n!


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
KFkepjgop sgpaoj faj

Виходи

! a! s! d! ! a! f! j! o! k! ! a! k!:! e!
! k! p! r! l! d!
! ! ! ! ! f! O! J! O! E!;!
! ! ! ! ! К! Ф! О!
! K! F! K! E! P! J! G! O! P! ! s! g! p! a! o! j! ! ! ! f! a! j!

Базовий тестовий випадок із лише одним символом:

а

Виходи

! a!

(Автозавершення! Просто жартую, такого немає.) Містить знаки оклику:

!!
!!
!!
!!
!!

Виходи:

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


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-nbet Between/… як ви говорили, щоб показати коротший шлях
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 Nifty one!
Арнольд

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

На щастя, нам не потрібно обробляти un-printtable, інакше перший нульовий байт переверне нас на ,та пограє.


5

sed , 12 байт

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

Спробуйте в Інтернеті!

-3 байти завдяки коровам квак


Насправді код Sed всього 15 символів: Спробуйте в Інтернеті! .
манатура

Чудово, дякую. Мені було незрозуміло, як це працювало ...
Йона

1
s/\b\|\B/!/gтакож працює на 12 байт
Kritixi Lithos

@Cowsquack дякую оновлено.
Йона


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працює правильно.
Гриммі

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 повертає символи з набором бітів, програми монтажу, як правило, очищають біт символу, щоб отримати його значення ASCII перед його використанням.


1
Ласкаво просимо на сайт! :)
Рахул Бхарадвай

Дякую, @Rahul!
лій

4

Баш , 36 байт

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

Спробуйте в Інтернеті!

Це розраховує на те, що новий рядок закінчує вхід для останнього! позначка.


Ласкаво просимо! Будь ласка, подумайте про додавання пояснення чи посилання до перекладача чи чогось іншого, тому що відповіді лише для коду автоматично позначені як неякісні.
mbomb007

@ mbomb007, дякую за вказівник.
spuck

1
На жаль, це не додає !в кінці вводу.
Kritixi Lithos

@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. У мене просто є досвід роботи з мозком, а також іншими двомовними мовами
Джо Кінг,

4

Perl 6 , 16 11 байт

{S:g/<(/!/}

Спробуйте в Інтернеті!

Замінює всі сірники нульової ширини окликами. Нульові регулярні вирази заборонені, тому ми використовуємо маркер захоплення, щоб нічого не захопити





3

Трикутна , 15 13 байт

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

Спробуйте в Інтернеті!

-2 байти після того, як згадали, що в трикутника є оператор умовного зупинки.

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

Безголівки:

    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}

Can @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.