Faça um; # intérprete

62

Recentemente, criei um novo idioma chamado ;#(pronunciado "Ponto-e-vírgula Hash"), que possui apenas dois comandos:

; adicione um ao acumulador

#module o acumulador por 127, converta para caractere ASCII e produza sem uma nova linha. Depois disso, redefina o acumulador para 0. Sim, 127 está correto.

Qualquer outro caractere é ignorado. Não tem efeito no acumulador e não deve fazer nada.

Sua tarefa é criar um intérprete para essa linguagem poderosa!

Deve ser um programa completo ou uma função que terá um ;#programa como entrada e produzirá a saída correta.

Exemplos

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 até 100

caird coinheringaahing
fonte
11
É aceitável se um intérprete não terminar sua execução no final da entrada, mas continuar repetindo indefinidamente sem produzir saída extra?
Leão
5
O segundo exemplo me faz pensar em um programa para codificar um programa para produzir uma saída ... compilação recursiva!
Frarugi87
@Leo sim isso é bom
caird coinheringaahing
11
@iamnotmaynard Ponto-e-vírgula Hash
caird coinheringaahing
2
Talvez Wink Hash seria mais fácil de dizer
James Waldby - jwpat7

Respostas:

17

JavaScript (ES6), 76 82 80 bytes

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

Demo

Versão recursiva, 82 77 bytes

Guardado 5 bytes graças a Neil

É provável que este trava com grandes entradas, como o exemplo do Fizz Buzz.

f=([c,...s],a=0)=>c?c=='#'?String.fromCharCode(a%127)+f(s):f(s,a+(c==';')):""
Arnauld
fonte
Eu acho que f(s,a+(c==';'))pode derrubar três bytes sua versão recursiva.
Neil
@ Neil Na verdade, ele salva 5 bytes. :-)
Arnauld
Eu me sinto muito boba agora. Originalmente, eu tinha uma versão de buggy e subtraí 2 bytes para corrigir o erro. Mas eu tinha contado mal ea versão de buggy realmente salvou 7 bytes ...
Neil
12

Retina , 336 63 67 65 66 62 59 bytes

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

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

Experimente online!

Versão legível usando sintaxe de escape hipotética :

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

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

Não imprime NUL bytes, porque o TIO não os permite no código-fonte. Também imprime uma nova linha extra no final, mas acho que não pode fazer o contrário. Nova linha final suprimida graças ao @Leo .

-273 (!) Bytes graças a @ETHproductions .

-2 bytes graças a @ovs .

-3 bytes graças a @Neil . Confira sua maravilhosa solução de 34 bytes .

eush77
fonte
11
Oh minha palavra. Mas você não pode salvar mil bytes com +T`\x01-~`_\x03-\x7f`[^\x01¯]\x01? (incluindo os imprimíveis como caracteres únicos, é claro)
ETHproductions
@ETHproductions Claro que você pode. Obrigado! :)
eush77
11
Atualmente, a última letra está sempre na saída, mesmo que não haja nenhum resultado #na entrada. Você pode corrigi-lo alterando seu segundo estágio para(;{127}|;+$)
ovs
11
Você precisa do + `na terceira linha? À medida que você remove a correspondência inteira, não resta mais nada para substituir na segunda iteração.
ovs
11
Eu acho que posso fazer isso em 34 bytes: T`;#\x01-ÿ`\x80\x7F_ \x80+$(linha vazia) \+T`\x7Fo`\x01-\x80_`\x80[^\x80](usando escapes hexadecimais para representar não imprimíveis). Saídas \ x7F em vez de nulos.
Neil
12

Java 8, 100 bytes

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

Experimente online!

Mas
fonte
3
Bem vindo ao site! :)
DJMcMayhem
Eu adicionei um link para um intérprete em linha com o exemplo FizzBuzz para você (texto do link era muito grande para caber em um comentário)
Jonathan Allan
Java usa UTF-16 para seus programas . Portanto, esses não são 100 bytes, mas 100 caracteres .
G.Broser diz Restabelecer Monica
5
@GeroldBroser Unicode é um conjunto de caracteres: UTF-8 e UTF-16 são duas codificações desse conjunto de caracteres. A fonte ASCII é perfeitamente válida como um programa Java, e eu tenho muitos arquivos de origem Java codificados em ASCII (que também é UTF-8 válido, portanto, também é uma codificação Unicode).
11
Inteiramente jogado, por 81 bytes como um Consumer<char[]>:s->{char i=0;for(int b:s){if(b==59)i++;if(b==35){System.out.print(i%=127);i=0;}}}
Olivier Grégoire
11

Japonês , 18 bytes

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

Existe um caractere \ x7f não imprimível depois %#. Teste online!

Como funciona

®   è'; %#   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
ETHproductions
fonte
11
D'oh, deveria ter verificado as respostas! Passei algum tempo nisso apenas para descobrir que você tinha me derrotado. q'# ®è'; u# dì¯Jtambém funciona para a mesma pontuação.
Shaggy
11

Python , 65 bytes

Este é um golfe desta resposta anterior.

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

Experimente online! Python2

Experimente online! Python3

Explicação

Esta é uma resposta bastante direta: determinamos quantos ;s existem entre cada um #e imprimimos o chrmod 127. A única coisa que pode ser um pouco estranha é a [:-1]. Precisamos deixar o último grupo porque não haverá #depois dele.

Por exemplo

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

Será dividido em

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

Mas não queremos o último, ;;;porque não há #depois para imprimir o valor.

Assistente de Trigo
fonte
11
Eu estava ocupado tentando fazer todos os testes em um link TIO. Foi chr por chr, exceto te x.
Jonathan Allan
9

> <> , 35 bytes

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

Experimente online! Substitua por 0x7F,, ^?ou "excluir".

Laço principal

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

Isso pega um caractere de input ( i), verifica se é menor que zero, isto é, EOF ( :0() e finaliza o programa se for ( ?;). Caso contrário, verifique se a entrada é igual a #( :'#'=). Se for, ramifique e reinicie o loop ( ?v... ^ ... <).

Lógica do contador

              ';'=?0
              

Verifique se a entrada é igual a ;( ';'=). Se estiver, pressione a 0. Caso contrário, não faça nada. Isso reinicia o loop principal.

Lógica de impressão

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

Quando o caractere de entrada é #, retire a entrada da pilha ( ~), obtenha o número de membros na pilha ( l), pressione 127 ( '␡') e faça o módulo ( %). Em seguida, imprima como um caractere ( o) e inicie uma nova pilha ( [0). Isso "zera" o contador. Então, o loop reinicia.

Conor O'Brien
fonte
3
Ruim> <>. É triste :0(:(
caird coinheringaahing 22/17/17
9

Python 3, 69 bytes

Melhorado, graças ao @Wheat Wizard, @Uriel

print(''.join(chr(s.count(';')%127)for s in input().split('#')[:-1]))
MrGeek
fonte
3
Bem-vindo à Programação de Puzzles e Code Golf! O objetivo aqui é tornar o código o mais curto possível (em bytes), para que você precise incluir a contagem de bytes no cabeçalho :).
Adnan
Obrigado por explicar, não sabia disso. Vou trabalhar nisso então.
MrGeek 21/05
2
Você pode remover o espaço após os :s.
Pavel
11
Eu conto 74 bytes. tio.run/nexus/…
Dennis
2
Além disso, ';'==ceconomiza espaço, mas a não utilização de ifinstruções seria ainda mais curta.
Dennis19 /
9

Röda , 44 39 38 bytes

5 bytes salvos graças a @fergusq

{(_/`#`)|{|d|d~="[^;]",""chr #d%127}_}

Experimente online!

Função anônima que recebe a entrada do fluxo.


Se outros caracteres não precisarem ser ignorados, recebo o seguinte:

Röda , 20 bytes

{(_/`#`)|chr #_%127}
Kritixi Lithos
fonte
8

Ruby, 41 35 34 caracteres

( Código de 40 34 33 caracteres + opção de linha de comando de 1 caractere)

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

Graças a:

  • Jordan por sugerir o uso putcpara não precisar de conversão explícita com .chr(6 caracteres)
  • Kirill L. por encontrar o parêntese desnecessário (1 caractere)

Exemplo de execução:

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

Experimente online!

homem a trabalhar
fonte
Doh. Embora eu tenha feito C nos meus primeiros anos, esqueci completamente putc(). Obrigado, @Jordan
manatwork
11
Para minha própria surpresa, você pode realmente cair parênteses após contagem para salvar um byte
Kirill L.
Boa captura, @KirillL., Obrigado.
manatwork
7

05AB1E , 16 15 14 bytes

Código:

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

Explicação:

'#¡              # 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

Usa a codificação 05AB1E. Experimente online!

Adnan
fonte
7

Gelatina , 13 bytes

ṣ”#Ṗċ€”;%127Ọ

Experimente online!

Como funciona

ṣ”#Ṗċ€”;%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.
Dennis
fonte
11
A palavra semicolanão existe é semicolons.
Erik the Outgolfer
@EriktheOutgolfer en.m.wiktionary.org/wiki/semicola
Dennis
Hmm, palavra estranha.
Erik the Outgolfer
@EriktheOutgolfer Alguém no Wikcionário provavelmente estava tentando tornar o plural do latim válido em inglês, mas grafias de cola e semicola devem ser proscritas.
Coeur
7

código de máquina x86 no MS-DOS - 29 bytes

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

Montagem comentada:

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
Matteo Italia
fonte
6

05AB1E , 25 21 19 bytes

-2 bytes graças a Adnan

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

Explicação:

Î                       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

Experimente online!

Okx
fonte
11
Eu acho que você pode substituir i>}por +.
Adnan
6

Retina , 34 bytes

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

Experimente online! Inclui caso de teste. Editar: salvou 2 bytes com alguma ajuda de @MartinEnder. Nota: O código inclui não-imprimíveis e o uso de &#x;códigos gera resultados incorretos, pois o navegador usa Windows-1252 em vez de ISO-8859-1. Explicação: A primeira linha limpa a entrada: ;é alterada para \x80, #para \x7F(devido a limitações do TIO) e todo o resto é excluído. Então, sempre que vemos um \x80que não está antes de outro \x80, o excluímos e incrementamos ciclicamente o código de qualquer próximo caractere. Isso é repetido até que não haja mais \x80caracteres. O código original que suporta bytes nulos basicamente subtrai 1 dos bytes não imprimíveis, exceto na primeira linha em que \xFFpermanece inalterada e \x7Fse torna\x00. Com escapes para facilitar a leitura:

T`;#\x00-\xFF`\x7F\x00_
\+T`\x7Eo`\x00-\x7F_`\x7F[^\x7F]|\x7F$
Neil
fonte
Você pode salvar um byte combinando os dois últimos estágios com \x80([^\x80]|$)o último.
Martin Ender
@MartinEnder Thanks! Irritantemente, \s+T`\x7Fo`\x01-\x80_`\x80(?!\x80).?também salva apenas um byte.
Neil
Ah, mas [^\x80]|\x80$economiza dois bytes, eu acho.
Neil
Ah legal, sim, o último funciona. Eu também tinha tentado o lookahead negativo, mas o sé chato.
Martin Ender
6

R, 97 90 86 84 bytes

Uma função:

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

Quando R inicia, Fé definido como FALSE(numérico 0).

Ungolfed:

function (s)
    for (i in utf8ToInt(s)) {
        F = F + (i == 59)
        if (i == 35) {
            cat(intToUtf8(F%%127))
            F = 0
        }
    }
Sven Hohenstein
fonte
Isso não deveria ser R + pryr?
L3viathan
@ L3viathan Como pryré um pacote R, ainda é um código R.
Sven Hohenstein
É um código R, mas requer a instalação de uma biblioteca adicional.
L3viathan
@ L3viathan Você acha que minha resposta é inválida? Devo evitar o uso de pacotes adicionais?
Sven Hohenstein
2
@BLT Não há diferença. Na minha opinião, não há problema em usar pacotes adicionais que foram criados antes do desafio. Isso vale para todos os idiomas. No Python você tem que usar importenquanto no R você pode usar ::para acessar diretamente a função nos pacotes. Você pode ver frequentemente o uso de pacotes adicionais aqui (por exemplo, para Python e Java). No entanto, mudei meu post anterior porque não quero participar de discussões.
Sven Hohenstein
5

Python, 82 bytes

lambda t:''.join(chr(len([g for g in x if g==';'])%127)for x in t.split('#')[:-1])
Uriel
fonte
11
@WheatWizard desde que você já postou isso como uma resposta, eu acredito que a ação correta para mim seria upvote-lo ao invés de atualização
Uriel
4

TeX simples, 156 bytes

\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

Legível

\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
Uriel
fonte
Pode imprimir caracteres simbolicamente?
Eush77
4

C (gcc) , 58 bytes

a;f(char*s){a+=*s^35?*s==59:-putchar(a%127);a=*s&&f(s+1);}

Experimente online! (Dica: clique em ▼ Rodapé para recolhê-lo.)

Dennis
fonte
4

Perl, 25 bytes

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

Execute com perl -043pe(contado como 4 bytes, pois perl -eé padrão).

Explicação: -043define o terminador de linha como #(ASCII 043). -pitera sobre as "linhas" de entrada (atualmente, # # delimited strings). y%;%%conta o número de ;em cada "linha". x/#/garante que não imprimimos um caractere extra para programas que não terminam em um # (como o terceiro caso de teste). %127deve ser bastante óbvio. $_=é o padrão comum.

Grimmy
fonte
Impressionante, embora exista uma falha: ;;#;;;ela produz o número 5 em vez do número 2.
Manatwork
Como você conseguiu esse resultado? echo -n ';;#;;;' | perl -043pe '$_=chr(y%;%%%127)x/#/' | xxdproduz corretamente 00000000: 02na minha máquina. Se você parou 043ou está usando uma página de código onde #não é ASCII 043, isso explicaria seu resultado.
Grimmy #
11
Opa Desculpe, tive um erro de digitação no meu teste. Seu código funciona perfeitamente.
Manatwork
4

CJam, 27 bytes

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

Explicação:

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

Solução alternativa, 18 bytes

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

Explicação:

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
fonte
Gato de negócios Isso não ignora caracteres inválidos.
Esolanging Fruit
por que você precisa ;excluir o acumulador?
Caird coinheringaahing
@RandomUser Portanto, não acaba sendo gerado no final com a string.
ETHproductions
4

F #, 79 91 93 bytes

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

Ungolfed

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

Experimente online!

Edit: Estava tratando qualquer outro caractere além de ';' Como '#'. Foi alterado para ignorar caracteres inválidos.

Alternativa

F #, 107 104 bytes

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

O uso da célula de referência economiza 3 bytes

Ungolfed

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
        |_->()
    ]

Experimente online

Brunner
fonte
4

Processing.js (versão Khanacademy), 118 bytes

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;}}

Experimente online!

Como a versão do processamento usada não possui nenhum método de entrada, a entrada é colocada em n.

Christopher
fonte
Você poderia tecnicamente forjar o seu próprio método de entrada com keyTyped=function(){ ... }: P
ETHproductions
@ETHproductions Este é um olhar de nojo.
Christopher
@RandomUser yay! Eu consegui! Eu gosto de responder em Processamento (verifique minhas respostas)
Christopher
2
Não apenas @RandomUser 1000 Rep .. mas 2 ^ 10 rep (͡ ° ͜ʖ ͡ °)
@Midnightas Ohhh yeah
Christopher
4

Labirinto , 61 47 bytes

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

Experimente online!

Explicação

imagem codificada por cores do código da solução

A execução do código começa no canto superior esquerdo e o primeiro ponto e vírgula descarta um zero implícito da pilha e continua à direita.

laranja

  • _36empurra 36 para a pilha. Isto é para comparar a entrada com#
  • } move o topo da pilha para a pilha secundária
  • , empurra o valor inteiro do caractere na pilha
  • )incrementa a pilha (se for o final da entrada, isso tornará a pilha 0 e o fluxo do programa prosseguirá para a @saída)
  • { move o topo da pilha secundária para o topo da pilha primária
  • -pop y, pop x, pressione x - y. Isto é para comparar a entrada com #(35 em ascii). Se a entrada foi #o código continuará na seção roxa (porque a parte superior da pilha é 0, o IP continua na direção em que estava se movendo antes), caso contrário, continuará na seção verde.

Roxa

  • 127 empurre 127 para a pilha
  • % pop x, pop y, pressione x% y
  • . pop no topo da pilha (o acumulador) e saída como um caractere

A partir daqui, o código cinza nos leva ao canto superior esquerdo do programa sem nada na pilha.

Verde

  • _24 empurre 24 para a pilha
  • -pop x, pop y, pressione xy. 24 é a diferença entre #e, ;portanto, isso verifica se a entrada foi ;. Se fosse ;o código continua direto para o ). Caso contrário, ele girará para o #que empurra a altura da pilha (sempre um número positivo, forçando o programa a virar à direita no próximo cruzamento e perder o código que incrementa o acumulador)
  • ; descartar a parte superior da pilha
  • ) incrementa a parte superior da pilha, que é um zero implícito ou é um zero incrementado anteriormente, atuando como acumulador de saída

A partir daqui, o código cinza nos leva ao canto superior esquerdo do programa com a pilha apenas com o acumulador.

cinzento

As cotações são não ops, _empurra um 0 para a pilha e ;descarta a parte superior da pilha. Tudo isso é apenas um código para forçar o fluxo de controle da maneira correta e descartar qualquer coisa extra do topo da pilha.

Robert Hickman
fonte
Por curiosidade, como você gerou a imagem da explicação? Você criou você mesmo?
Stefnotch
2
@ Stepfnotch, usei um editor de texto para colocar uma guia entre cada caractere e colei o código no Microsoft Excel, que colocou cada caractere em sua própria célula. Selecionei todas as células para fornecer largura e altura iguais. Depois ajustei cores e bordas e tirei uma captura de tela.
Robert Hickman
3

MATL , 29 bytes

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

Entrada é uma cadeia de caracteres entre aspas simples.

Experimente online!

O programa FizzBuzz é muito longo para os intérpretes online; veja trabalhando offline neste gif:

insira a descrição da imagem aqui

Explicação

O valor do acumulador é implementado como o número de elementos na pilha. Isso torna o programa mais lento do que se o valor do acumulador fosse um único número na pilha, mas salvaria alguns bytes.

';#'       % 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
Luis Mendo
fonte
3

Alice , 22 bytes

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

Experimente online!

Explicação

Mantemos na pilha apenas um único contador de quantos ;encontramos. Quando a pilha está vazia (por exemplo, no início do programa), isso é implicitamente um 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

Uma versão mais curta, mas não finalizadora, deste programa pode ser encontrada aqui .

Leo
fonte
Confirmado aqui
caird coinheringaahing
Desculpem a formatação ruim, eu postei isso no meu telefone, eu vou corrigi-lo assim que eu colocar minhas mãos em um PC #
Leo Leo
Os programas precisam terminar, a menos que especificado de outra forma no desafio.
Martin Ender
Você pode salvar um byte usando um 0x7F literal, em vez disso ~h.
Martin Ender
@MartinEnder fez com que terminasse. Eu não poderia conseguir inserir um 0x7F no código, mas acho que esta modificação alternativa é mais interessante de qualquer maneira :)
Leo
3

JS (ES6), 97 92 bytes

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

Tentou adotar uma abordagem diferente da resposta de Shaggy . Ah bem.


fonte
3

; # + , 59 bytes, não-concorrentes

A linguagem foi feita após esse desafio.

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

Experimente online! A entrada é finalizada com um byte nulo.

Explicação

A geração é a mesma da minha resposta de código Generate; # . A única diferença aqui é a iteração.

Iteração

*(~<:-+!(<-;->(;))::<+-::!(<#>)-:-*)
*(                                *)   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
Conor O'Brien
fonte
3

Bash + coreutils, 46 39 bytes

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

Experimente online!

Explicação

(Obrigado Vacas Quack por -7 bytes!)

A trparte remove todos os caracteres estranhos (eu poderia colocá-lo sedexatamente para o mesmo bytecount, mas, em seguida, ele não manipula o caractere de avanço de linha corretamente, pois os seddeixa inseridos e dcsó chega ao primeiro avanço de linha ?)

sedpega o resto e cria um dcprograma:

Strings de ;tornar-se strings de 1(um longo literal)

#torna- .ZC7%Pse (se isso segue uma sequência de 1, o .é um ponto decimal para um no-op. Mas se é no início do programa, ou após outro #, é um literal 0. Em seguida, leva o comprimento do número, modifica-o, e imprime o ASCII correspondente.)

Sophia Lechner
fonte
Você não precisa escapar por ;dentro '...'e pode simplesmente mudar dc -ez?para dc. Além disso, em vez de ;adicionar 1 à pilha, você pode agrupá-los e obter seu comprimento usando Zpara alcançar este tio.run/##S0oszvj/… .
Kritixi Lithos
@ Cowsquack Isso é bom, obrigado! (e isso dc -ez?foi uma conseqüência da necessidade de um zero extra para iniciar o programa) Mas o seu programa adiciona saída adicional stderrnos casos de #entrada consecutiva ou que não termina #(nos dois casos, quero dizer, após a remoção de caracteres estranhos) . Não sei se há consenso, mas sinto que a saída extra invalida a solução. Eu adaptei sua ideia e acabei com apenas um byte a mais do que a sua sugestão sem dcgerar erros!
Sophia Lechner
De acordo com esse stderr, pode ser ignorado, a menos que o desafio indique explicitamente como tal, o que é muito útil para o dc. Observe também que esta solução atual falha com #s consecutivos por causa Zde 0is 1, então gera 0x01 em vez de 0x00 (caí nessa mesma armadilha também, mas meu navegador exibe não-imprimíveis como seus códigos hexadecimais, então peguei isso).
Kritixi Lithos
3

C, 65 64 60 bytes

(-2 graças a ceilingcat)

c;f(char*s){for(c=0;*s;s++)c+=*s-35?*s==59:-putchar(c%127);}
hvd
fonte
Você precisará inicializar cpara zero para tornar a função reutilizável .
Conor O'Brien
@ ConorO'Brien Fixed. Infelizmente, não consegui pensar em nada mais curto do que simplesmente adicionar o c=0e não gostaria de trapacear copiando a resposta de Dennis.
hvd 22/05
@ceilingcat Obrigado novamente, eu consegui decolar mais três bytes depois disso. Isso usa um truque na resposta de Dennis (marcada após a edição), mas desta vez, havia passado tanto tempo que eu tinha esquecido tudo e descobri isso sozinho.
hvd