bfcat - codifica un file come programma brainf ***


18

Sfida

Scrivi un programma o una funzione che ha dato una stringa, restituisce un programma Brainfuck valido che, quando compilato ed eseguito come Brainfuck, restituisce quella stringa.

  1. Supponiamo che tutti gli ingressi siano codificati come ASCII.

  2. Supponiamo che il programma BF emesso verrà eseguito in un ambiente con un nastro infinito.

  3. Supponiamo che il puntatore inizi alla cella 0 con ogni cella inizializzata su un valore pari a zero.

  4. Ciascun esempio di seguito rappresenta un possibile output corretto per l'input specificato. In particolare, gli esempi includono nuove linee e spazi extra per aiutare la leggibilità umana. Le soluzioni sono libere di formattare il codice BF emesso in qualsiasi modo.

  5. Il nastro è doppiamente infinito.

  6. Tutte le celle fornite dall'interprete sono esattamente celle a 8 bit. Overflow e underflow si avvolgono in una materia prevedibile e sana.

Esempi

Stringa di spazio

Dato l'input , il tuo programma / funzione potrebbe restituire:

+++++ +++++
+++++ +++++
+++++ +++++
++ .

Punto esclamativo

Dato l'input !, il tuo programma / funzione potrebbe restituire:

+++++ +++++
+++++ +++++
+++++ +++++
+++
.

Due lettere

Dato l'input hi, il tuo programma / funzione potrebbe restituire:

+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++

+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++

++++
.
+
.

Questo è , quindi vince il codice con il minor numero di byte. In bocca al lupo.


10
Altre prove per favore.
Leaky Nun,

1
Quali sono esattamente le linee guida menzionate nella Revisione 9 ?
user8397947

4
Lo sto riaprendo. Penso che le preoccupazioni di Peter siano state affrontate e abbiamo un consenso abbastanza chiaro su ciò che conta come un duplicato, e questa sfida non soddisfa questi criteri.
Martin Ender,

"Avvolgimento di overflow e underflow in modo prevedibile e sano" - quindi anche 127 + 1 va a 0 e -128-1 va anche a 0, giusto? Questa è una possibile maniera prevedibile e sana.
user253751

1
@immibis Exactly.
user8397947

Risposte:


18

Gelatina , 8 byte

O”+ẋp“.>

Provalo online!

Esecuzione del campione

Per l'input hi, questo programma stampa

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++.+++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++>++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++>

(senza avanzamenti di riga) che, a sua volta, stampahi .

Come funziona

O”+ẋp“.>  Main link. Argument: s (string)

O         Ordinal; convert each character in s into its code point.
 ”+       Yield the character '+'.
   ẋ      Repeat '+' k times, for each k in the code points.
     “.>  Yield the string ".>".
    p     Take the Cartesian product of both results.

I tuoi non funzionano con memoria limitata, il mio lo fa.
Leaky Nun,

5
Non proprio. Entrambi archiviamo l'intero output in memoria prima della stampa. Per gli interpreti BF con un nastro abbastanza grande, questo diventerà un problema molto prima del nastro.
Dennis,

Perché non .>appare nell'output?
cat

2
@cat Perché il prodotto cartesiano ( p) è più corto di append a each ( ;€). Questi programmi di uscita raddoppiano la cella dopo la stampa e prima della commutazione. Poiché non rivisitiamo mai la cella, ciò non influisce sull'output.
Dennis,

@Dennis ahh, interessante.
gatto,

55

Brainfuck, 55 51 byte

,[>+++[>+++++++<-]>[<++>>+++<-]<+<[>.<-]>+++.>>-.,]

Provalo online!

Esempio di output per hi(senza gli avanzamenti di riga):

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>

Spiegazione

Questo si sposta sul nastro durante la scrittura del programma. L'ambiente circostante ,[...,]è un loop di input standard. Per ogni personaggio, usiamo quattro celle:

[... x a b c ...]

dov'è xla cella in cui scriviamo l'input.

>+++[>+++++++<-]

Questa parte usa cell aper scrivere a 21in cell btramite una moltiplicazione standard di 3e 7.

>[<++>>+++<-]

Ora lo usiamo 21per scrivere 42in ae 63in cmoltiplicando per 2e 3rispettivamente. Quindi <+<torna alla cella xmentre si trasforma 42in a 43(il punto di codice di +). Ricapitolare:

[... x 43 21 63 ...]

Ora il ciclo di uscita principale:

[>.<-]

Cioè, mentre diminuiamo, xne stampiamo uno +ogni volta.

>+++.

Dopo che abbiamo finito riutilizziamo la +cella, aggiungendo 3per dare ..

>>-.

Infine, ci spostiamo in 63, diminuiamo in 62( >) e produciamo anche quello. La prossima iterazione utilizzerà questa cella come x.


5
Darei una taglia a questo se avessi più rappresentante.
user8397947

34

Brainfuck, 39 33 32 31 byte

-[-[>]<--<--],[[>.<+]>+.--.+<,]

L'algoritmo che posiziona 45 sul nastro è preso dalle costanti Brainfuck di Esolang .

Questa risposta presuppone che l'interprete del programma di output abbia delle celle avvolgenti e limitate; e che ,azzera la cella corrente (implicando che il programma di output viene eseguito senza input). Provalo online!

Per una soluzione (più lunga) che funziona incondizionatamente, vedi la mia altra risposta .

Prova

Per l'input Code Golf, viene generato il seguente output.

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-------------------------------------------------------------------------------------------------------------------------------------------------.,------------------------------------------------------------------------------------------------------------------------------------------------------------.,-----------------------------------------------------------------------------------------------------------------------------------------------------------.,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-------------------------------------------------------------------------------------------------------------------------------------------------.,----------------------------------------------------------------------------------------------------------------------------------------------------.,----------------------------------------------------------------------------------------------------------------------------------------------------------.,

Provalo online!

Come funziona

Iniziamo inserendo l'intero 45 (codice carattere di -) in una cella del nastro. Il seguente codice ottiene questo.

-      Decrement cell 0, setting it to 255.
[      While the cell under the head in non-zero:
  [>]    Advance to the next zero cell.
  <--    Decrement the cell to its left.
  <--    Decrement the next cell to the left.
]

Prima di entrare nel loop, il nastro appare così.

         v
000 000 255

Queste tre celle - -2 , -1 e 0 - sono le uniche che utilizzeremo in questo programma.

Nella prima di ogni iterazione del ciclo, la cella più a destra è, quindi quella cella e la cella centrale vengono decrementate due volte, lasciando il seguente stato.

     v
000 254 252

Nelle successive 126 iterazioni, l'iniziale -decrementa la cella centrale, [>]<salta alla cella più a destra e --<--decrementa la cella centrale e destra. Di conseguenza, 3 viene sottratto dalla cella centrale (modulo 256 ) e 2 viene sottratto dalla cella più a destra.

Poiché 254 ÷ 3 (mod 256) = (254 + 256) ÷ 3 = 510 ÷ 3 = 170 e 252 ÷ 3 = 84 , la cella più a destra viene azzerata prima di quella centrale, lasciando il seguente stato.

     v
000 132 000

Analogamente alla prima iterazione del ciclo, la successiva iterazione ora sottrae 3 dalla cella centrale e 2 dalla cella più a sinistra, posizionando la testa sulla cella più a sinistra.

 v
254 129 000

Le iterazioni successive, come nell'iterazione 126 precedente, sottraggono 3 dalla cella più a sinistra e 2 dalla cella più a destra.

Poiché 254 ÷ 3 (mod 256) = 170 e 129 ÷ 2 (mod 256) non sono definiti, questo viene fatto 170 volte, lasciando il seguente stato.

 v
000 045 000

La cella sotto la testa è zero; il ciclo termina.

Ora siamo pronti per generare output.

,      Read a character from STDIN and put it the leftmost cell.
[        While the leftmost cell is non-zero:
  [        While the leftmost cell is non-zero:
    >.     Print the content of the middle cell ('-').
    <-     Increment the leftmost cell.
  ]      If the leftmost cell held n, the above will print 256 - n minus signs
         which, when executed, will put n in cell 0 of the output program.
  >      Increment the middle cell, setting it to 46 ('.').
  .      Print its content ('.').
  --     Decrement the middle cell twice, setting it to 44 (',').
  .      Print its content (',').
         When executed, since the output program receives no input, the above
         will zero cell 0 of the output program.
  +      Increment the second cell, setting it back to 45 ('-').
  <,     Go back to the leftmost cell and read another character from STDIN.
]      Once EOF is reached, this will put 0 in the leftmost cell, ending the loop.

Perché il BF risultante non si traduce nuovamente nella stringa di input per me? Questo è l' interprete che sto usando, che ha funzionato per le altre risposte.
Insane il

2
Quell'interprete ha molte impostazioni. Per la versione a 32 byte, avreste bisogno di memoria dinamica e fine dell'input:\0 .
Dennis,

10

Brainfuck, 35 13 43 byte

++[>+<------],[[>.>+<<-]>+++.->[<.>-]<--<,]

Questa risposta non fa ipotesi sull'interprete del programma di output. Provalo online!

Per una soluzione più breve (che funziona solo con alcuni interpreti), vedi la mia altra risposta .

Prova

Per l'input Code Golf, viene generato il seguente output.

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.-------------------------------------------------------------------+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.---------------------------------------------------------------------------------------------------------------++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.----------------------------------------------------------------------------------------------------+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.-----------------------------------------------------------------------------------------------------++++++++++++++++++++++++++++++++.--------------------------------+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.-----------------------------------------------------------------------+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.---------------------------------------------------------------------------------------------------------------++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.------------------------------------------------------------------------------------------------------------++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.------------------------------------------------------------------------------------------------------+++++++++++++++++++++++++++++++++.---------------------------------

Provalo online!

Come funziona

Iniziamo inserendo il numero intero 43 (codice carattere di +) nella seconda cella del nastro. Il seguente codice ottiene questo.

++         Increment the first cell twice, setting it to 2.
[          While the first cell in non-zero:
  >+         Increment the second cell.
  <------    Decrement the first cell six times.
]

Questo essenzialmente esegue la divisione modulare 2 ÷ 6 (mod 256) . Poiché (2 + 256): 6 = 258 ÷ 6 = 43 , il risultato è 43 , come previsto.

Ora siamo pronti per generare output.

,      Read a character from STDIN and put it the first cell.
[        While the first cell is non-zero:
  [        While the first cell is non-zero:
    >.     Print the content of the second cell ('+').
    >+     Increment the third cell.
    <<-    Decrement the first cell.
  ]      If the first cell held n, the above prints n plus signs
         and puts n in the third cell.
  >+++   Add three to the second cell, setting it to 46 ('.').
  .      Print its content ('.').
  -      Decrement, setting it to 45 ('-').
  >      Advance to the third cell.
  [      While the third cell is non-zero:
    <.     Print the content of the second cell ('-').
    >-     Decrement the third cell.
  ]      If the first cell held n, the above prints n minus signs,
         thus negating the plus signs and zeroing the cell of the output program.
  <--    Subtract 2 from the second cell, setting it back to 43.
  <,     Go back to the first cell and read another character from STDIN.
]      Once EOF is reached, ',' will put 0 in the first cell, ending the loop.

Oh amico! Non puoi spezzare il meme barrato-44-is-44, dai! Comunque il tuo tentativo di sconfiggerlo è fallito miseramente perché non sembra colpito, sembra che ci sia un po 'di sporcizia sul mio schermo (PHP, forse?): P
gatto,

2
Qualsiasi cosa per evitare quel commento ...
Dennis,


4

05AB1E, 12 11 byte

vyÇ`'+ׄ.>J

spiegato

v             # for each char in input string
 yÇ`          # convert to its ascii value
    '+×       # push the char '+' that many times
       „.>J   # push string ".>" and join with the plus signs
              # implicitly print combined string

Provalo online

Salvato 1 byte grazie a @Adnan


'+×invece di F'+}salvare un byte.
Adnan,

1
@Adnan: grazie! Stavo cercando un comando "ripeti".
Emigna,

4

Java, 98 byte

class a{String A(char[]b){String z="";for(char B:b){for(int c=B;c-->0;)z+="+";z+=".>";}return z;}}

Strings non sono altro che immutabili char[]s con un sacco di metodi di utilità, quindi usiamo l'array!

Ungolfed:

class a {
    void A(char[] b) {
        for (char B : b) {
            for (int c = B; c-- > 0;)
                 System.out.print('+');
            System.out.print(".>");
        }
    }
}

Programma autonomo equivalente lungo 138 byte:

interface a{static void main(String[]A){for(char b:A[0].toCharArray()){for(int B=b;B-->0;)System.out.print('+');System.out.print(".>");}}}

Bonus:

interface a{static void main(String[]A){for(char b:new java.util.Scanner(new java.io.File(A[0])).useDelimiter("\\Z").next().toCharArray()){for(int B=b;B>0;B--)System.out.print('+');System.out.print(".>");}}}

Questa app da 207 byte in realtà codifica un file come programma BF, proprio come indicato nel titolo.


2
Sono solo io o il modo in cui il programma non modificato è rientrato sembra fantastico?
user8397947

Realizzato proprio prima di pubblicare che la mia risposta è fondamentalmente una versione ridotta del tuo.
Insane il

2

Vitsy, 19 17 byte

I\[&'>.+'i1-\Du]Z

I                     Get the length of the input stack.
 \[            ]      Pop n, repeat this block of code n times.
   &                  Push a new stack and move to it.
    '>.+'             Push the string '+.>' to the stack.
         i            Pop an item from the input stack and push it to the current
                      program stack.
          1-          Subtract one from the top program stack item.
            \D        Duplicate the '+' in the stack that many times.
              u       Merge the current program stack with the previous.
                Z     Output the entire current stack as a string.

Nota che questa risposta è una delle poche volte che io abbia mai usato Ie u. : D

Provalo online!


2

O , 13 byte

i{'+n#*".>"}d

Spiegazione:

i              Read standard input into a string and push it onto the stack.
 {         }d  For each character in the string...
  '+           Push "+".
    n#         Convert the character (n) to its ASCII code.
      *        Multiply the "+" by the character code to get the number of +'s needed.
       ".>"    Push the string ".>".
               In O, the stack is printed after execution, so this prints out the result.

2

K6, 16 byte

,/{|">.",x#"+"}'

uso

,/{|">.",x#"+"}'"some string"

Spiegazione

  {           }'  For each character in the string...
         x#"+"    Repeat "+" as many times as the character's ASCII code.
        ,         Combine that with...
    ">."          The code to print it and move on.
   |              But we put the string together backwards...so now it gets reversed.
,/                Combine all the substrings into one BIG string.

Explanation plz: D
Addison Crump,

@VTCAKAVSMoACE Fatto! :)
kirbyfan64sos il

2

Python 3, 43 byte

lambda s:''.join('+'*ord(c)+'.>'for c in s)

Python mette un numero di vantaggi equivalenti al codice ASCII di ciascun personaggio, seguito da .> per stampare e passare alla cella successiva. Il brainfuck aumenta fino al valore corretto, stampa e passa alla cella successiva.

Uscita per hi(con le nuove righe per chiarezza):

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>

L'output di quel programma:

hi

2

Perl, 25 byte

s/./"+"x ord($&).".>"/eg

uso

echo -n hi | perl -pe 's/./"+"x ord($&).".>"/eg'

Spiegazione

Utilizza un'operazione di sostituzione dell'espressione regolare per sostituire ogni carattere in ogni riga indicato sull'input standard con un numero +calcolato dal valore ordinale di quel carattere, quindi emette .>per stampare e passare al carattere successivo.

Utilizza il -pflag perl per leggere automaticamente l'input e stampare il risultato, aggiungendo 1 extra al byte.


2

Java, 91 byte

String b(char[] f){String k="";for(char b:f){for(int u=b;u>0;u--)k+="+";k+=".>";}return k;}

Puntelli a Dorukayhan per avermi battuto :)


Non puoi semplicemente rimuovere il boilerplate e cambiare tutti i nomi delle variabili e rivendicarlo come una nuova risposta.
Leaky Nun,

@LeakyNun Non l'ho fatto, ma potrei se volessi.
Insane il

In che modo questa risposta è diversa dalla risposta a cui sei collegato?
Leaky Nun,

@LeakyNun Downvote e vai avanti
Insane

2

C, 72 64 60 byte

main(c){for(;c=~getchar();)for(;printf(~c++?"+":".>")^2;);}

Versione non golfata:

main( c )
{
    for ( ; c = ~getchar( ); )
        for ( ; printf( ~c++ ? "+" : ".>" ) ^ 2; );
}

Compilare e testare con:
gcc -o bfcat bfcatgolf.c && cat 1.txt | ./bfcat > o.txt && beef o.txt

risultati


Perché è cl'inverso bit a bit di getchar, soprattutto se si inverte di nuovo l'inversione?
gatto,

@cat restituisce c = ~getchar( )0 su EOF. c = ~getchar( )e ~c++sono semplicemente più brevi di ~( c = getchar( ) )ec--
Jacajack il

2

CJam, 12 byte

Converte ciascun carattere nel suo valore ASCII e incrementa la cella corrente di quel numero di volte prima di stamparlo. Dato che abbiamo un nastro infinito, possiamo semplicemente spostarci a destra dopo aver elaborato ogni carattere.

q{i'+*'.'>}%

Provalo online!


2

Lua, 67 66 61 byte

Basta iterare su ogni carattere nell'argomento e stampare una riga per ognuno con n +s seguito da .>dove si ntrova il valore di questo carattere nella tabella ASCII.

Utilizza gmatch come consigliato da @LeakyNun nel commento per il salvataggio di 1 byte sulla soluzione gsub

for c in(...):gmatch"."do print(("+"):rep(c:byte())..".>")end

Vecchia soluzione con gsub

(...):gsub(".",function(c)print(c.rep("+",c:byte())..".>")end)

Vecchio 67

(...):gsub(".",function(c)print(string.rep("+",c:byte())..".>")end)

Per eseguirlo, basta salvarlo come file ( golf.luaad esempio) ed eseguirlo con lua golf.lua "hi". Per hi, dovrebbe produrre

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>

Come lo uso? Basta incollarlo nel REPL attempt to index a nil valuee f = ...dare lo stesso, e function f ... endunexpected symbol near ':'
cat il

@cat Basta salvarlo in un file ed eseguirlo come lua file.lua "argument", aggiornerò il post per dare istruzioni.
Katenkyo,

Come funziona? è ...un identificatore con argv?
gatto,

1
@cat ...contiene i valori nella tabella argdecompressa. Ciò significa che corrisponderà sempre a arg[1]meno che non venga utilizzato in una chiamata di funzione come ultimo parametro, quindi spenderà.
Katenkyo,

n=...for n:gmatch"."do print(("+"):rep(c:byte())..".>")endper 48 byte
Leaky Nun,

1

J, 28 byte

[:;[:('.>',~'+'#~])"0[:]3&u:

Abbastanza semplice. 3&u:converte i caratteri in codici carattere. Il resto è solo ripetere '+'quel numero di volte, quindi concatenarsi con .>alla fine di ogni riga e ;appiattire il risultato.

Alcuni risultati

   bf =: [:;[:('>.',~'+'#~])"0[:]3&u:
   bf 'hi'
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>.
   bf ' !'
++++++++++++++++++++++++++++++++>. +++++++++++++++++++++++++++++++++>.
   bf ' ~'
++++++++++++++++++++++++++++++++>.
                 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>.


1

In realtà, 13 byte

O`'+*".>"@`MΣ

Provalo online!

La strategia usata qui è la stessa di molte altre soluzioni: per ogni carattere, emettere abbastanza +s per incrementare una cella a zero inizializzazione nell'ordinale ASCII corretto, emetterla con .e passare alla cella successiva con> .

Spiegazione:

O`'+*".>"@`MΣ
O              list of ordinals (technically this is Unicode code points, but code points 0-127 are the same for Unicode and ASCII)
 `'+*".>"@`M   for each ordinal:
  '+*            push a string containing that many +s
     ".>"@       push ".>" and swap (putting it before the +s)
            Σ  concatenate all the strings (if "[", "]", and "," weren't meaningful characters in BF, this technically wouldn't be necessary)

1

Mouse-2002, 27 byte

(?'l:l.^(l.^"+"l.1-l:)".>")

Funziona in teoria e secondo la documentazione del linguaggio, ma l'implementazione di riferimento dell'interprete di Mouse sembra avere un bug in cui l'input della stringa aggiunge un ', quindi per aquesto output

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>+++++++++++++++++++++++++++++++++++++++.>

Che a sua volta produce a'. Questo può o non può andare bene, quindi eccone uno lungo 39 byte che non viene 'mai emesso e quindi è probabilmente più non valido.

(?'l:l.39=l.0=+0=^(l.0>^"+"l.1-l:)".>")

Il che dà il giusto risultato nell'impianto di riferimento. fintanto che non ci sono 's :)

Ha spiegato:

(              ~ while (true) {
  ?' l:        ~   l = getchar() 
  l. ^         ~   if (! (l) ) { break }
  (            ~   while (true) {
    l. ^       ~     if (! (l) ) { break }
    "+"        ~     puts("+")
    l. 1 - l:  ~     l-- // l = l - 1
  )            ~   }
  ".>"         ~   puts(".>")
)              ~ }

1

Fattore, 58 byte

[ [ [ 43 ] ""replicate-as ".>"append ] { } map-as ""join ]

Funziona come:

[ 
  [ 
    [ 43 ] "" replicate-as  ! ``+'' * code point, clone-like a string ""
    ".>" append             ! append ".>"
  ] 
  { } map-as                ! for each char in string and clone-like an array { }
  "" join                   ! join array of str into str by ""
]

Poiché Factor viene fornito con un interprete Brainfuck, è semplice da testare.

bfcat.factor

USING: sequences ;
IN: bfcat

: string>brainfuck ( s -- bf )
  [ [ 43 ] "" replicate-as ".>" append ]
  { } map-as "" join ;

bfcat-tests.factor

USING: tools.test bfcat brainfuck ;
IN: bfcat.tests

{ "a"  } [ "a"  string>brainfuck get-brainfuck ] unit-test
{ "ab" } [ "ab" string>brainfuck get-brainfuck ] unit-test
{ "+++++++++++++" } [ "+++++++++++++" string>brainfuck get-brainfuck ] unit-test
{ "Code Golf" } [ "Code Golf" string>brainfuck get-brainfuck ] unit-test

produzione

Unit Test: { { "a" } [ "a" string>brainfuck get-brainfuck ] }
Unit Test: { { "ab" } [ "ab" string>brainfuck get-brainfuck ] }
Unit Test: {
    { "+++++++++++++" }
    [ "+++++++++++++" string>brainfuck get-brainfuck ]
}
Unit Test: {
    { "Code Golf" }
    [ "Code Golf" string>brainfuck get-brainfuck ]
}

Sìì! passano tutti.


1

Rubino, 40 38 byte

gets.chop.each_byte{|o|puts"+"*o+".>"}

Non conosco il rubino ma so che puoi usare putsinvece di print, poiché il formato dell'output non è significativo fintanto che è brainfuck valido e brainfuck non si preoccupa degli altri personaggi
cat

@cat oh non sapevo che bf ignora altri personaggi, grazie!
CocoaBean,

1

Sidef , 38 byte

Ehi, la stessa lunghezza di Ruby! solo che Sidef non è Ruby: D

read().bytes.each{|c|say"+"*c;say".>"}

Leggi alcuni caratteri, quindi per ogni byte fai quella cosa.


1

GNU Bash, 100 85 byte

while IFS= read -rn1 c;do printf '+%.0s' $(seq 1 $(printf %d \'$c));echo '.>';done<$1

Grazie @cat per avermi salvato 15 byte!

Postramble

  1. Presuppone che la stringa di input sia rappresentata così com'è in un file passato come primo argomento.
  2. Uso: bash bfcat.sh <path to file containing string>
  3. Utilizzo (con nome pipe): bash bfcat.sh <(echo -n '<string>')

Ungolfed

while IFS= read -r -n1 c # Read file byte by byte [1]
do
    n=$(printf "%d" \'"$c") # `ord` of a char in bash [2]
    printf '+%.0s' $(seq 1 $n) # emit character $n times [3]
    echo '.>' # Emit output and shift command for bf. I love infinite memory.
done <"$1"

Riferimenti in versione Ungolfed

  1. Leggi il file byte per byte

  2. ord di un personaggio in bash

  3. emette carattere $ n volte


1
Ho migliorato parte della formattazione e delle cose nella tua risposta e rimosso le informazioni ridondanti dai collegamenti. Sentiti libero di annullarlo se non ti piace. Inoltre, è GNU Bash, non GNU / Bash come GNU / Linux. :)
cat

1
Suggerimenti per il golf (non sono un giocatore di golf bash):, read -rn1sbarazzarsi degli spazi dopo ;, sbarazzarsi dello spazio done <"$1"per salvare un totale di 9 byte
gatto

1
@cat Sembra fantastico! Ho davvero bisogno di prendere l'abitudine di modificare-> anteprima-> modifica -> ...
Yeow_Meng

1

ES6, 119 115 byte

f=s=>{a='';for(i in[...s]){b=s[c='charCodeAt'](i)-(s[c](i-1)|0);a+=(b>0?'+'.repeat(b):'-'.repeat(-b))+'.'}return a}

Salvati 4 byte, grazie a @Leibrug


1
Puoi assegnare charCodeAta qualche var (diciamo c) e usarlo in questo modo: s[c](i)per accorciare di 1 byte, e anche rimuovere alcuni caratteri (ho trovato 3: spazio prima [...s], sostituisci OR logico con uno bit a bit e punto e virgola prima return).
Leibrug,

1

Sesos (non concorrenziale)

hexdump:

0000000: 28cbf6 02e83d 655bae 243901                       (....=e[.$9.

Size   : 12 byte(s)

Provalo online!

assembler

add 43,fwd 1,get
jmp
  jmp,sub 1,rwd 1,put,fwd 1,jnz
  add 46,put,add 16,put
  get

0

Rubino, 26 byte

gsub(/./){?+*$&.ord+'.>'}

+ 1 byte per l' popzione della riga di comando. Per esempio, ottenere il codice Brainfuck per ABC xyzte può essere eseguito

$ ruby -p -e 'gsub(/./){?+*$&.ord+".>"}' <<< "ABC xyz"

e prendi

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>

0

Haskell 50 byte

f[]=[]
f(x:y)=replicate(fromEnum x)'+'++".>"++f y
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.