Зробіть перекладач; #


62

Нещодавно я створив нову мову під назвою ;#(вимовляється «Хрестовина крапки»), яка містить лише дві команди:

; додати його до акумулятора

#модулюйте акумулятор на 127, перетворите на символ ASCII та виведіть без нового рядка. Після цього скиньте акумулятор до 0. Так, 127 правильно.

Будь-який інший символ ігнорується. Це не впливає на акумулятор і нічого не повинно робити.

Ваше завдання - створити перекладача для цієї потужної мови!

Це повинна бути або повна програма, або функція, яка буде приймати ;#програму як вхід і давати правильний вихід.

Приклади

Output: Hello, World!
Program: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#

Output: ;#
Program: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#

Output: 2d{ (unprintable characters here; should have 4 `\000` bytes between the `d` and the `{` and 3 after the `{`)
Program: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;hafh;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;f;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;###ffh#h#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ffea;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#au###h;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;h;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;o

Output: Fizz Buzz output
Program: link below

Output: !
Program: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#

Fizz Buzz до 100


1
Чи прийнятно, якщо перекладач не припиняє його виконання в кінці вводу, а натомість продовжує циклічно фіксувати без додаткового результату?
Лев

5
Другий приклад змушує мене замислитися над програмою, що кодує програму для отримання вихідного ... рекурсивної компіляції!
frarugi87

@Leo так, це добре
caird coinheringaahing

1
@iamnotmaynard Semicolon Hash
caird coinheringaahing

2
Можливо, Wink Hash було б простіше сказати
James Waldby - jwpat7

Відповіді:



17

JavaScript (ES6), 76 82 80 байт

s=>s.replace(/./g,c=>c=='#'?String.fromCharCode(a%(a=127)):(a+=(c==';'),''),a=0)

Демо

Рекурсивна версія, 82 77 байт

Збережено 5 байт завдяки Нілу

Цей, швидше за все, збій для великих входів, таких як приклад Fizz Buzz.

f=([c,...s],a=0)=>c?c=='#'?String.fromCharCode(a%127)+f(s):f(s,a+(c==';')):""

Я думаю, що f(s,a+(c==';'))може збити три байти від вашої рекурсивної версії.
Ніл

@Neil Це фактично економить 5 байт. :-)
Арнольд

Зараз я відчуваю себе справді нерозумно. Я спочатку мав баггічну версію і відніс 2 байти, щоб виправити помилку. Але я помилився, і баггі-версія фактично врятувала 7 байт ...
Ніл

12

Сітчаста , 336 63 67 65 66 62 59 байт

T`;#-ÿ`¯_
;{127}|;+$

(^|¯)
¯
+T`-~`_-`[^¯]
T\`¯`

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

Читаема версія з використанням гіпотетичного синтаксису втечі:

T`;#\x01-ÿ`\x01¯_
;{127}|;+$

(^|¯)\x01\x01
¯\x02
+T`\x01-~`_\x03-\x7f`[^\x01¯]\x01
T\`¯`

Не друкує байти NUL, оскільки TIO не дозволяє їх у вихідному коді. Також в кінці друкується додатковий новий рядок, але я думаю, що це не може зробити інакше. Змінна новий рядок пригнічується завдяки @Leo .

-273 (!) Байтів завдяки @ETHproductions .

-2 байти завдяки @ovs .

-3 байти завдяки @Neil . Перегляньте їх чудове 34-байтне рішення .


1
О, моє слово. Але хіба ти не можеш заощадити тисячу байтів +T`\x01-~`_\x03-\x7f`[^\x01¯]\x01? (звичайно, включаючи недруковані
версії

@ETHproductions Звичайно, можна. Дякую! :)
eush77

1
В даний час останній лист завжди знаходиться у висновку, навіть якщо немає #вводу у вводі. Ви можете виправити це, змінивши свій другий етап на(;{127}|;+$)
1717

1
Вам потрібен знак + `на третьому рядку? Коли ви видаляєте весь матч, у другій ітерації не повинно залишатися нічого.
ов

1
Я думаю, що я можу це зробити у 34 байтах: T`;#\x01-ÿ`\x80\x7F_ \x80+$(порожній рядок) \+T`\x7Fo`\x01-\x80_`\x80[^\x80](з використанням шістнадцяткових символів для представлення недрукованих даних). Виходи \ x7F замість нулів.
Ніл

12

Java 8, 100 байт

s->{int i=0;for(byte b:s.getBytes()){if(b==59)i++;if(b==35){System.out.print((char)(i%127));i=0;}}};

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


3
Ласкаво просимо на сайт! :)
DJMcMayhem

Я додав посилання на онлайн-перекладача із прикладом FizzBuzz (текст посилання був занадто довгим, щоб вмістити коментар)
Джонатан Аллан

Java використовує UTF-16 для своїх програм . Отже, це не 100 байт, а 100 символів .
Герольд Брозер

5
@GeroldBroser Unicode - це набір символів: UTF-8 та UTF-16 - це два кодування цього набору символів. Джерело ASCII цілком справедливо як програма Java, і у мене є безліч вихідних файлів Java, закодованих у ASCII (що також є дійсним UTF-8, отже, і кодування Unicode).

1
Цілком гольф, на 81 байт як Consumer<char[]>:s->{char i=0;for(int b:s){if(b==59)i++;if(b==35){System.out.print(i%=127);i=0;}}}
Олів'є Грегоар

11

Japt , 18 байт

®è'; %# d}'# ë ¯J

Отримано недрукований \ x7f char після %#. Перевірте це в Інтернеті!

Як це працює

®   è'; %#   d}'# ë ¯  J
mZ{Zè'; %127 d}'# ë s0,J
                         // Implicit: operate on input string
mZ{           }'#        // Split the input at '#'s, and map each item Z to
   Zè';                  //   the number of semicolons in Z,
        %127             //   mod 127,
             d           //   turned into a character.
m              '#        // Rejoin the list on '#'. At this point the Hello, World! example
                         // would be "H#e#l#l#o#,# #W#o#r#l#d#!#" plus an null byte.
                  ë      // Take every other character. Eliminates the unnecessary '#'s. 
                    ¯J   // Slice off the trailing byte (could be anything if there are
                         // semicolons after the last '#').
                         // Implicit: output result of last expression

1
Д'о, повинні були перевірити відповіді! Просто витратив на це лише час, щоб знайти, як ти побив мене на удар. q'# ®è'; u# dì¯Jтакож працює на ту саму оцінку.
Кудлатий

11

Пітон , 65 байт

Це гольф цієї попередньої відповіді.

lambda t:''.join(chr(x.count(';')%127)for x in t.split('#')[:-1])

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

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

Пояснення

Це досить проста відповідь. Ми визначаємо, скільки ;s знаходиться між кожним #і друкуємо chrмод 127. Єдине, що може бути трохи дивним - це [:-1]. Нам потрібно скинути останню групу, бо #після неї не буде.

Наприклад

;;#;;;;#;;;;;#;;;

Буде розбита на

[';;',';;;;',';;;;;',';;;']

Але ми не хочемо останнього, ;;;оскільки #після нього немає надрукованого значення.


1
Я був зайнятий спробами отримати всі тести в одному посиланні TIO. Був chr за chr, крім tі x.
Джонатан Аллан

9

> <> , 35 байт

>i:0(?;:'#'=?v';'=?0
^   [0o%'␡'l~<

Спробуйте в Інтернеті! Замініть 0x7F ^?або "видаліть".

Основна петля

>i:0(?;:'#'=?v      
^            <

Це приймає характер введення ( i), перевіряє, чи не менше його нуля, тобто EOF ( :0(), і завершує програму, якщо вона ( ?;). В іншому випадку перевірте, чи вхід дорівнює #( :'#'=). Якщо це так, гілка вниз і перезапустіть цикл ( ?v... ^ ... <).

Логіка лічильника

              ';'=?0
              

Перевірте, чи вхід дорівнює ;( ';'=). Якщо це так, натисніть a 0. Інакше нічого не робіть. Це перезапускає основний цикл.

Логіка друку

>       '#'=?v      
^   [0o%'␡'l~<

Коли символом введення є #, вискочіть вхід зі стека ( ~), отримайте кількість членів у стеку ( l), натисніть 127 ( '␡') та візьміть модуль ( %). Потім виведіть його як символ ( o) і запустіть новий стек ( [0). Це "нулі" поза лічильником. Потім цикл перезавантажується.


3
Поганий> <>. Це сумно :0(:(
caird coinheringaahing

9

Пітон 3, 69 байт

Покращено, завдяки @Wheat Wizard, @Uriel

print(''.join(chr(s.count(';')%127)for s in input().split('#')[:-1]))

3
Ласкаво просимо до головоломки програмування та коду для гольфу! Завдання тут - зробити код якомога коротшим (у байтах), тому вам потрібно включити кількість байтів у заголовок :).
Аднан

Дякую за пояснення, не знав цього. Я над цим працюю.
MrGeek

2
Ви можете видалити пробіл після :s.
Павло

1
Я рахую 74 байти. tio.run/nexus/…
Денніс

2
Крім того, ';'==cекономиться місце, але не використовувати ifоператори взагалі було б ще коротше.
Денніс


8

Рубі, 41 35 34 символи

( 40 34 33 символьних коду + 1 символ командного рядка)

gsub(/.*?#/){putc$&.count ?;%127}

Завдяки:

  • Джордан за те, що запропонував використовувати putcне потрібно явного перетворення з .chr(6 символів)
  • Кирилу Л. за пошук непотрібних дужок (1 символ)

Проба зразка:

bash-4.4$ ruby -ne 'gsub(/.*?#/){putc$&.count ?;%127}' < '2d{.;#' | od -tad1
0000000    2  etb    d  nul  nul  nul  nul    {  nul  nul  nul
          50   23  100    0    0    0    0  123    0    0    0
0000013

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


До. Хоча я робив C у перші роки, я зовсім забув putc(). Дякую, @Jordan
manatwork

1
На моє власне здивування, ви можете фактично скинути круглі дужки після підрахунку, щоб зберегти байт
Кирилл Л.

Хороший улов, @KirillL., Дякую.
манатура

7

05AB1E , 16 15 14 байт

Код:

'#¡¨ʒ';¢127%ç?

Пояснення:

'#¡              # Split on hashtags
   ¨             # Remove the last element
    ʒ            # For each element (actually a hacky way, since this is a filter)
     ';¢         #   Count the number of occurences of ';'
        127%     #   Modulo by 127
            ç    #   Convert to char
             ?   #   Pop and print without a newline

Використовує кодування 05AB1E. Спробуйте в Інтернеті!


7

Желе , 13 байт

ṣ”#Ṗċ€”;%127Ọ

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

Як це працює

ṣ”#Ṗċ€”;%127Ọ  Main link. Argument: s (string)

ṣ”#            Split s at hashes.
   Ṗ           Pop; remove the last chunk.
    ċ€”;       Count the semicola in each chunk.
        %127   Take the counts modulo 127.
            Ọ  Unordinal; cast integers to characters.

1
Слово semicolaне існує, це не semicolons.
Ерік Аутгольфер


Хм, дивне слово.
Ерік Аутгольфер

@EriktheOutgolfer Хтось із Вікісловника, ймовірно, намагався зробити латинську множину дійсною англійською мовою, але написання кола та крапки з комою має бути заборонено.
Cœur

7

машинний код x86 на MS-DOS - 29 байт

00000000  31 d2 b4 01 cd 21 73 01  c3 3c 3b 75 06 42 80 fa  |1....!s..<;u.B..|
00000010  7f 74 ed 3c 23 75 eb b4  02 cd 21 eb e3           |.t.<#u....!..|
0000001d

Коментована збірка:

bits 16
org 100h

start:
    xor dx,dx       ; reset dx (used as accumulator)
readch:
    mov ah,1
    int 21h         ; read character
    jnc semicolon
    ret             ; quit if EOF
semicolon:
    cmp al,';'      ; is it a semicolon?
    jne hash        ; if not, skip to next check
    inc dx          ; increment accumulator
    cmp dl,127      ; if we get to 127, reset it; this saves us the
    je start        ; hassle to perform the modulo when handling #
hash:
    cmp al,'#'      ; is it a hash?
    jne readch      ; if not, skip back to character read
    mov ah,2        ; print dl (it was choosen as accumulator exactly
    int 21h         ; because it's the easiest register to print)
    jmp start       ; reset the accumulator and go on reading

6

05AB1E , 25 21 19 байт

-2 байти завдяки Аднану

Îvy';Q+y'#Qi127%ç?0

Пояснення:

Î                       Initialise stack with 0 and then push input
 v                      For each character
  y';Q+                 If equal to ';', then increment top of stack
       y'#Qi            If equal to '#', then
            127%        Modulo top of stack with 127
                ç       Convert to character
                 ?      Print without newline
                  0     Push a 0 to initialise the stack for the next print

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


1
Я думаю, ви можете замінити i>}на +.
Аднан

6

Сітківка , 34 байти

T`;#-ÿ`_
\+T`o`-_`[^]|$

Спробуйте в Інтернеті! Включає тестовий випадок. Редагувати: збережено 2 байти за допомогою довідки @MartinEnder. Примітка. Код включає недруковані версії, а використання &#x;кодів створює невірні результати, оскільки браузер використовує Windows-1252 замість ISO-8859-1. Пояснення: Перший рядок очищає вхід: ;змінюється на \x80, #щоб \x7F(з - за обмеження , TIO) і все інше видаляються. Тоді, коли ми бачимо, \x80що не передує іншому \x80, ми видаляємо його і циклічно збільшуємо код будь-якого наступного символу. Це повторюється, поки не залишиться більше \x80символів. Оригінальний код, що підтримує нульові байти, в основному віднімає 1 з недрукованих байтів, за винятком першого рядка, де він \xFFне змінюється і \x7Fстає\x00. З можливістю зрозуміти:

T`;#\x00-\xFF`\x7F\x00_
\+T`\x7Eo`\x00-\x7F_`\x7F[^\x7F]|\x7F$

Ви можете зберегти байт, комбінуючи останні два етапи з \x80([^\x80]|$)останнім етапом.
Мартін Ендер

@MartinEnder Дякую! Прикро, \s+T`\x7Fo`\x01-\x80_`\x80(?!\x80).?також зберігає лише один байт.
Ніл

А, але [^\x80]|\x80$економить два байти, я думаю.
Ніл

Ах приємно, так останній працює. Я також спробував негативну позицію, але sце дратує.
Мартін Ендер

6

R, 97 90 86 84 байт

Функція:

function(s)for(i in utf8ToInt(s)){F=F+(i==59);if(i==35){cat(intToUtf8(F%%127));F=0}}

Коли R починається, Fвизначається як FALSE(числовий 0).

Безголівки:

function (s)
    for (i in utf8ToInt(s)) {
        F = F + (i == 59)
        if (i == 35) {
            cat(intToUtf8(F%%127))
            F = 0
        }
    }

Чи не повинно це бути R + pryr?
L3viathan

@ L3viathan Оскільки pryrпакет R, це все-таки R-код.
Свен Гогенштайн

Це код R, але він вимагає встановлення додаткової бібліотеки.
L3viathan

@ L3viathan Чи вважаєте ви, що моя відповідь недійсна? Чи слід уникати використання додаткових пакетів?
Свен Гогенштайн

2
@BLT Різниці немає. На мою думку, не проблема використовувати додаткові пакети, які були створені перед викликом. Це справедливо для всіх мов. У Python ви повинні використовувати, importпоки в R ви можете використовувати ::прямий доступ до функції в пакетах. Тут ви часто можете побачити використання додаткових пакетів (наприклад, для Python та Java). Однак я змінив колишню посаду, оскільки не хочу брати участь в обговоренні.
Свен Гогенштайн

5

Пітон, 82 байти

lambda t:''.join(chr(len([g for g in x if g==';'])%127)for x in t.split('#')[:-1])

1
@WheatWizard, оскільки ви вже опублікували це як відповідь, я вважаю, що правильним дійством для мене було б його підтримка, а не оновлення
Uriel

4

Простий TeX, 156 байт

\newcount\a\def\;{\advance\a by 1\ifnum\a=127\a=0\fi}\def\#{\message{\the\a}\a=0}\catcode`;=13\catcode35=13\let;=\;\let#=\#\loop\read16 to\>\>\iftrue\repeat

Читабельна

\newcount\a

\def\;{
  \advance\a by 1
  \ifnum \a=127 \a=0 \fi
}
\def\#{
  \message{\the\a}
  \a=0
}

\catcode`;=13
\catcode35=13

\let;=\;
\let#=\#

\loop
  \read16 to \> \>
  \iftrue \repeat

Чи може він друкувати символи символічно?
eush77


4

Perl, 25 байт

$_=chr(y%;%%%127)x/#/

Запустити з perl -043pe(рахується як 4 байти, оскільки perl -eце стандарт).

Пояснення: -043встановлює лінійний термінатор на #(ASCII 043). -pповторює вхідні "рядки" (насправді # -розділені рядки, зараз). y%;%%підраховує кількість ;у кожному "рядку". x/#/гарантує, що ми не надрукуємо додатковий символ для програм, які не закінчуються на # (наприклад, третій тест). %127має бути досить очевидним. $_=- звичайна котельня.


Вражає одне, хоча є глюк: для ;;#;;;нього виходить №5 замість №2.
манастирство

Як ви отримали цей результат? echo -n ';;#;;;' | perl -043pe '$_=chr(y%;%%%127)x/#/' | xxdправильно виводить 00000000: 02на моїй машині. Якщо ви припинили 043або використовуєте кодову сторінку, де #немає ASCII 043, це пояснить ваш результат.
Грим

1
На жаль Вибачте, у мене був тест на друку. Ваш код працює чудово.
манастирство

4

CJam, 27 байт

0q{";#"#") 127%co0 "S/=~}%;

Пояснення:

0                            e# Push 0
 q                           e# Push the input
  {                          e# For each character in the input:
   ";#"#                     e#   Index of character in ";#", -1 if not found
        ") 127%co0 "S/       e#   Push this string, split on spaces
                      =      e#   Array access (-1 is the last element)
                       ~     e#   Execute as CJam code. ")" increments the accumulator,
                             e#     and "127%co0" preforms modulo by 127, converts to character, pops and outputs, and then pushes 0.
                        }%   e# End for
                          ;  e# Delete the accumulator

Альтернативне рішення, 18 байт

q'#/);{';e=127%c}%

Пояснення:

q                   e# Read the whole input
 '#/                e# Split on '#'
    );              e# Delete the last element
      {             e# For each element:
       ';e=         e#   Count number of ';' in string
           127%     e#   Modulo by 127
               c    e#   Convert to character code
                }%  e# End for

Бізнес-кіт, який не ігнорує недійсних символів.
Esolanging Fruit

чому потрібно ;видалити акумулятор?
caird coinheringaahing

@RandomUser Таким чином, це не закінчується отримання результату в кінці за допомогою рядка.
ETHproductions

4

F #, 79 91 93 байт

let rec r a=function|[]->()|';'::t->r(a+1)t|'#'::t->printf"%c"(char(a%127));r 0 t|_::y->r a y

Безумовно

let rec run acc = function
    | [] -> ()
    | ';'::xs ->
        run (acc + 1) xs
    | '#'::xs ->
        printf "%c" (char(acc % 127))
        run 0 xs
    | x::xs -> run acc xs

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

Редагувати: обробляв будь-які інші символи, ніж ';' як "#". Змінив його так, що ігнорує недійсні символи.

Альтернатива

F #, 107 104 байт

let r i=
 let a=ref 0
 [for c in i do c|>function|';'->a:=!a+1|'#'->printf"%c"(!a%127|>char);a:=0|_->()]

Використання еталонної комірки економить 3 байти

Безумовно

let run i =
    let a = ref 0;
    [for c in i do
        match c with
        | ';' -> a := !a + 1
        | '#' ->
            printf "%c" (char(!a % 127))
            a := 0
        |_->()
    ]

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


4

Processing.js (версія Khanacademy), 118 байт

var n="",a=0;for(var i=0;i<n.length;i++){if(n[i]===";"){a++;}if(n[i]==="#"){println(String.fromCharCode(a%127));a=0;}}

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

Оскільки використовувана версія обробки не має жодних методів введення, введення розміщується в n.


Ви можете технічно підробити свій власний метод введення за допомогою keyTyped=function(){ ... }: P
ETHproductions

@ETHproductions Це погляд огиди.
Крістофер

@RandomUser так! Я зробив це! Мені подобається відповідати в Processing (перевірити мої відповіді)
Christopher

2
@RandomUser Не просто 1000 повтор., А 2 ^ 10 відп. (͡ ° ͜ʖ ͡ °)

@Midnightas О, так
Крістофер

4

Лабіринт , 61 47 байт

_36},)@
;    {
; 42_-
"#-  1
_ ; 72
_ ) %
"""".

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

Пояснення

кольорове зображення коду рішення

Виконання коду починається у верхньому лівому куті, і перша крапка з комою відкидає неявний нуль зі стека та продовжує праворуч.

Помаранчевий

  • _36натискає 36 на стек. Це для порівняння введення з#
  • } переміщує верхню частину стека до вторинної
  • , висуває ціле значення символу на стек
  • )збільшує стек (якщо це кінець вводу, це зробить стек 0 і потік програми перейде до @та виходу)
  • { переміщує верхню частину вторинного стека до верхньої частини основного стека
  • -pop y, pop x, push x - y. Це для порівняння вхідного сигналу з #(35 in ascii). Якщо введення було #кодом, він продовжуватиметься до фіолетового розділу (оскільки верхня частина стека дорівнює 0, IP продовжується у напрямку, до якого він рухався раніше), інакше він продовжить до зеленого розділу.

Фіолетовий

  • 127 натисніть 127 до стека
  • % pop x, pop y, push x% y
  • . вискочити верхню частину стека (акумулятор) і вивести як символ

Звідси сірий код переносить нас у лівий верхній кут програми, на стеці нічого немає.

Зелений

  • _24 натисніть 24 на стек
  • -pop x, pop y, push xy. 24 - різниця між, #і ;це перевіряє, чи був вхід ;. Якщо це був ;код, то продовжуйте прямо до ). Інакше він повернеться до того, #що висуває висоту стека (завжди додатне число, змушуючи програму повернути праворуч на наступному перетині і пропустити код, який збільшує акумулятор)
  • ; відкиньте верхню частину стека
  • ) збільшують верхню частину стека, яка є або неявним нулем, або це попередньо нарощений нуль, що виконує роль акумулятора для виведення

Звідси сірий код переносить нас у верхній лівий кут програми, у якому є стек, на якому є лише акумулятор.

Сірий

Котирування відсутні, немає, _натискає 0 на стек і ;відкидає верхню частину стека. Все це лише код, щоб змусити правильний потік керування та відкинути все зайве з верхньої частини стека.


Як з цікавості ви створили зображення для пояснення? Ви створили його самостійно?
Стефнотч

2
@Stefnotch, я скористався текстовим редактором, щоб поставити вкладку між кожним символом, а потім вставив код у Microsoft Excel, який поставив кожного символу у власну комірку. Я вибрав усі комірки, щоб надати їм однакову ширину та висоту. Потім я скоригував кольори та рамки та зробив знімок екрана.
Роберт Хікман

3

MATL , 29 байт

';#'&mXz!"@o?T}vn127\c&YD]]vx

Введення - це рядок, укладений в одиничні лапки.

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

Програма FizzBuzz занадто довга для онлайн-перекладачів; дивіться, як він працює в автономному режимі в цьому GIF:

введіть тут опис зображення

Пояснення

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

';#'       % Push this string
&m         % Input string (implicit). Pushes row vector array of the same size with 
           % entries 1, 2 or 0 for chars equal to ';', '#' or others, respectively
Xz         % Remove zeros. Gives a column vector
!          % Transpose into a row vector
"          % For each entry
  @        %   Push current entry
  o?       %   If odd
    T      %     Push true. This increases the accumulator (number of stack elements)
  }        %   Else
    v      %     Concatenate stack into a column vector
    n      %     Number of elements
    127\   %     Modulo 127
    c      %     Convert to char
    &YD    %     Display immediately without newline
  ]        %   End
]          % End
vx         % Concatenate stack and delete. This avoids implicit display

3

Аліса , 22 байти

I!?';-n+?h$'@u%?'#-n$O

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

Пояснення

Ми тримаємо на стеку лише одну лічильник того, скільки ;нас зустрічалося. Коли стек порожній (наприклад, на початку програми), це неявно 0.

I!?';-n+?h$'@u%?'#-n$O
I                      Push codepoint of next char from input
 !?                    store it on the tape and reload it right away
   ';-n+               add 1 to the counter if this char is a semicolon,
                       0 otherwise
        ?h$'           If the input char was -1 (EOF) execute the next command,
                       otherwise push its codepoint
            @          Terminate the program (or push 64)
             u         Set all bits up to the most significant as equal to 1
                       this turns 64 (1000000b) into 127 (1111111b)
              %        Compute modulo
               ?       reload the input char from the tape
                '#-n$O if it is a hash, pop the counter and print
                       the corresponding character
                       wrap back to the start of the line

Більш коротку, але не закінчувану версію цієї програми можна знайти тут .


Підтвердили це тут
кайдар коінхергінг, що

Вибачте за неправильне форматування, я опублікував це зі свого телефону, я виправлю це, як тільки я прийму руки на ПК
Лев

Програми мають припинятися, якщо в виклику не вказано інше.
Мартін Ендер

Ви можете зберегти байт, використовуючи буквальний 0x7F замість цього ~h.
Мартін Ендер

@MartinEnder зробив це завершенням. Мені не вдалося вставити в код 0x7F, але я думаю, що ця альтернативна модифікація все одно цікавіша :)
Лев,

3

JS (ES6), 97 92 байт

c=>(a=0,y="",c.split``.map(x=>x=="#"?(a%=127,y+=String.fromCharCode(a),a=0):x==";"?a++:0),y)

Намагався застосувати інший підхід, ніж відповідь Шаггі . Ну добре.


3

; # + , 59 байт, неконкурентоспроможний

Мова була виголошена після цього виклику.

;;;;;~+++++++>~;~++++:>*(~<:-+!(<-;->(;))::<+-::!(<#>)-:-*)

Спробуйте в Інтернеті! Введення закінчується нульовим байтом.

Пояснення

Покоління те саме, що і в моєму " Generate" # відповіді на код . Єдина відмінність тут - ітерація.

Ітерація

*(~<:-+!(<-;->(;))::<+-::!(<#>)-:-*)
*(                                *)   take input while != 0
  ~                                    swap
   <                                   read value from memory (;)
    :                                  move forward to the accumulator memory spot (AMS)
     -                                 flip Δ
      +                                subtract two accumulators into A
       !                               flip A (0 -> 1, else -> 0)
        (     (;))                     if A is nonzero, or, if A == ';'
         <                             read from AMS
          -;-                          increment
             >                         write to AMS
                  ::                   move to cell 0 (#)
                    <                  read value from memory (#)
                     +                 subtract two accumulators into A
                      -                flip Δ
                       ::              move to AMS
                         !(   )        if A == '#'
                           <           read from AMS
                            #          output mod 127, and clear
                             >         write to AMS
                               -:-     move back to initial cell

3

Bash + coreutils, 46 39 байт

tr -dc \;#|sed 'y/;/1/;s/#/.ZC7%P/g'|dc

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

Пояснення

(Дякую Корову Шукаю за -7 байт!)

trЧастина видаляє всі сторонні символи (я міг би поставити це в sedпротягом точно так же ByteCount, але тоді він не обробляє символ перекладу рядка правильно, так як sedзалишає їх і dcотримує тільки до першого перекладу рядка з ?)

sedбере решту і створює dcпрограму:

Рядки ;стають рядками 1(тривалий буквальний)

#стає .ZC7%P(якщо це слідує за рядком 1, .- це десяткова крапка для неопераційного опису. Але якщо це на початку програми або після іншої #, то це буквальне значення 0. Тоді воно бере довжину числа, модифікує його, і друкує відповідний ASCII.)


Вам не потрібно бігти ;зсередини '...'і може просто змінити dc -ez?до dc. Крім того, замість того, щоб ;додати до стека 1, ви можете згрупувати їх разом і отримати їх довжину, використовуючи, Zщоб дістатися до цього tio.run/##S0oszvj/… .
Крітіксі Літос

@Cowsquack Це добре, дякую! (і це dc -ez?було наслідком необхідності додаткового нуля, щоб запустити програму) Але ваша програма додає додатковий висновок stderrабо у випадках послідовного, #або введення, що не закінчується #(в обох випадках я маю на увазі після видалення сторонніх символів) . Я не знаю, чи є консенсус, але я відчуваю, що додатковий результат визнає рішення недійсним. Я, проте, адаптував вашу ідею, і завершився лише на один байт більше, ніж ваша пропозиція, не dcкидаючи помилок!
Софія Лехнер

Згідно з цим stderr можна ігнорувати, якщо виклик прямо не вказав як такий, так що це дуже зручно для постійного струму. Також зауважте, що це поточне рішення виходить з ладу з послідовним #s через Zте, що 0є 1, тому він видає 0x01 замість 0x00 (я потрапив і в ту саму пастку, але мій браузер відображає недруковані версії як їхні гексоди, тому я це зрозумів).
Крітіксі Літос

3

C, 65 64 60 байт

(-2 завдяки стельовій кішці)

c;f(char*s){for(c=0;*s;s++)c+=*s-35?*s==59:-putchar(c%127);}

Вам потрібно буде ініціалізуватися cдо нуля, щоб зробити функцію багаторазовою .
Conor O'Brien

Виправлено @ ConorO'Brien На жаль, мені не вдалося придумати щось коротше, ніж просто додати в c=0, і я не хотів би обдурити, копіюючи відповідь Денніса.
hvd

@ceilingcat Ще раз спасибі, мені вдалося зняти ще три байти після цього. Це дійсно використовує хитрість у відповіді Денніса (перевірено після редагування), але цього разу пройшло стільки часу, що я забув про це все і придумав його самостійно.
hvd
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.