Codice golf per i pigri


10

Il vostro obiettivo in questo codice di golf è quello di prendere due stringhe, languagee code (se il codice golfed hai scritto per questo è più righe, allora questa variabile sarebbe multilinea.) , E un intero, bytes. Rappresentano le variabili per un linguaggio di programmazione, il numero di byte necessari e il codice stesso.

Dopodiché, lo formatterai come fa un golfista di codice.

La variabile di output è una stringa multilinea chiamata answer.

Puoi utilizzare stringhe multilinea su:

Se cerchi Stack Overflow , dovresti essere in grado di trovare più linguaggi di programmazione che lo supportano.

Ecco un modello del markdown dell'output. La codevariabile si trova in un blocco di codice e c'è un'intestazione di secondo livello.

## {language}, {bytes} bytes

     {code}

Ecco come sarebbe l'output quando incollato in un parser Markdown.

{lingua}, {byte} byte

    {code}

Si presume che le variabili siano già compilate come lingua in cui è stata codificata la voce di golf del codice, il numero di byte necessari e il codice effettivo per esso.

Ecco un altro esempio dell'output come codice, questa volta con le variabili compilate:

## JavaScript, 1337 bytes

document.getElementById("foo").innerHTML = bar;

Ecco la versione come blockquote:

JavaScript, 1337 byte

    document.getElementById("foo").innerHTML = bar;

I byte possono essere tolti dal tuo codice se usi un modo per impostare il testo di un <p>elemento in HTML dall'id result, come il seguente codice JavaScript:

document.getElementById("result").innerHTML = answer;

Assicurati di includere anche la <p id="result"></p>sezione HTML di JSFiddle affinché funzioni.

punteggio

Come tutte le domande sul , il codice che utilizza il minor numero di byte è il migliore.


3
Sarà {code}mai un codice multilinea?
Adnan,

8
"Le variabili verranno compilate come la lingua in cui hai codificato la tua voce di golf del codice, il numero di byte necessari e il codice effettivo per esso." Sono l'unico a interpretarlo come una variazione di quine?
primo

2
Dal momento che le risposte stanno risolvendo due problemi completamente diversi, lo sto mettendo in attesa come poco chiaro. Si prega di chiarire se language, bytese codesono input o se questa è una variante di quine in cui tali elementi dovrebbero corrispondere al codice di risoluzione stesso. (E in tal caso, se è consentita la lettura diretta o indiretta di quel codice sorgente e se sono consentiti quine built-in.)
Martin Ender

2
Potresti anche chiarire la domanda di Adnan se l'input codestesso può contenere avanzamenti di riga?
Martin Ender,

2
@Peanut sono confuso. Possiamo presumere codeche non sarà multilinea o no? Si prega di indicare che nel testo della sfida
Luis Mendo l'

Risposte:



8

Java, 70 byte

String A(String[]b){return"## "+b[0]+", "+b[1]+" bytes\n\n    "+b[2];}

Presuppone b[0]è il nome della lingua, b[1]è il conteggio dei byte ed b[2]è il codice.

La sua compilazione costa 9 byte, risultando in un programma non autonomo di 79 byte:

class a{String A(String[]b){return"## "+b[0]+", "+b[1]+" bytes\n\n    "+b[2];}}

Il programma monolitico equivalente è lungo 103 byte:

interface a{static void main(String[]A){System.out.print("## "+A[0]+", "+A[1]+" bytes\n\n    "+A[2]);}}

Quello monolitico funziona con argomenti da riga di comando, assumendoli proprio come il programma non autonomo:

  • Il primo argomento è il nome della lingua
  • Il secondo argomento è il conteggio dei byte
  • Il terzo argomento è il codice

Java (espressione lambda), 56 48 byte

(b)->"## "+b[0]+", "+b[1]+" bytes\n\n    "+b[2];

Questo è un java.util.function.Function<String[], String>.


Nessuno di questi programmi / funzioni gestisce stringhe multilinea. Per fare ciò, è sufficiente sostituire b[2]e A[2]con b[2].replace("\n","\n ")e A[2].replace("\n","\n ")- così facendo si aggiungono 23 byte.


In questo momento non sono vicino a un computer per confermarlo, ma non puoi usare \to qualcosa per sostituire i 4 spazi dopo le due nuove linee?
R. Kap

@ R.Kap A volte l'uso delle schede anziché degli spazi crea un disastro su SE.
user8397947

Ah, capisco. Quindi il conteggio dei byte prende in considerazione \te non 4 spazi?
R. Kap

3
Perdere i genitori sulla lambda; puoi salvare due byte con solo b->.
Brian McCutchon,

2
Cosa succede se esiste più di una riga di codice?
Neil,

5

V , 24 byte

Si noti che c'è uno spazio finale alla fine.

Questo programma presuppone che {code}non sarà su più righe.

Op ha chiarito, "codice" può essere una stringa multilinea. Questa versione da 24 byte funziona:

2é#á $á,JA bytes
vGî4é 

Poiché questo contiene un carattere non stampabile, ecco la versione leggibile:

2é#á $á,JA bytes
<esc>vGî4é<space>

Dov'è <esc>il carattere letterale di fuga, ad es 0x1B.


1
Sembra sempre una lotta costante tra Jolf e V ...: 3
Conor O'Brien,

4

Python 3.5, 40 33 byte:

( -7 byte grazie ad alcuni chiarimenti da Mego )

lambda*f:'## %s, %s bytes\n\n\t%s'%f

Una funzione lambda anonima che accetta input come argomenti posizionali nel formato <function name>(String, Number, String)e genera una stringa su più righe.

Provalo online! (Ideone)


2
È possibile radere più byte se si effettua l'elenco dei parametri *fe si rilascia la tuplechiamata.
Mego,

@Mego Purtroppo, ciò non funziona, come TypeError: not enough arguments for format stringogni volta che lo eseguo in questo modo.
R. Kap

Funziona bene quando lo provo - devi prendere argomenti posizionali invece di un argomento elenco. Inoltre, è possibile eliminare lo spazio tra il #e il %.
Mego,

@Mego Wow, è così strano, perché quando lo provo in PyCharm con Python 3.5.1, ottengo un errore. Questo mi ha confuso così tanto. Inoltre, #è necessario lo spazio tra la e la lambda, o almeno così penso.
R. Kap

@Mego È aggiornato.
R. Kap

4

JavaScript (ES6), 56 byte

(l,b,c)=>`## ${l}, ${b} bytes

`+c.replace(/^/gm,`    `)

Inoltre, per le risate, ecco una risposta che si formatta per me:

JavaScript (ES6), 68 byte

f=_=>`## JavaScript (ES6), ${`${f}`.length+3} bytes\n\n    f=${f};`;

Stampa il risultato di f().


@PatrickRoberts Spiacenti, in realtà non ho verificato la lunghezza, l'ho solo copiato e incollato, quindi in seguito ho aggiunto 6 byte per il (ES6). (Perché Cᴏɴᴏʀ O'Bʀɪᴇɴ si è solo preso la briga di cambiare la lunghezza?)
Neil

4

C #, 40 38 byte

(a,b,c)=>$"## {a}, {b} bytes\n\n\t"+c;

C # lambda dove input e output sono stringhe.


C #, 59 byte

(a,b,c)=>$"## {a}, {b} bytes\n\n\t"+c.Replace("\n","\n\t");

Con la gestione di una risposta multilinea.


C #, 71 byte

La soluzione da 38 byte che si stampa da sola

()=>$"## C#, 38 bytes\n\n\t"+@"(a,b,c)=>$""## {a}, {b} bytes

\t""+c;";

Provali online


3

Mathematica, 40 byte

Print["## ",#,", ",#2,"bytes

    ",#3]&

Funzione anonima. Prende la lingua, il conteggio dei byte e il programma come input e stampa il corpo su STDOUT.


2

Jolf, 24 22 byte

"## ¦i, ¦j Ξ/u3

    ¦

Non c'è molto da spiegare qui. ¦significa input interpolato.

Provalo qui! L'output per l'input nel link è:

## Jolf, 24 bytes

    some filler code I think

L'input è come:

name

number

"code"

1

MATL , 28 27 byte

1 byte salvato grazie al suggerimento di @ NinjaBearMoneky

35tOj', 'j' bytes'10t4Z"j&h

Provalo online!

Il blocco di codice deve essere su una sola riga.

Spiegazione

35t           % Push 35 (ASCII for '#') twice
0             % Push 0. When converted to char, it will be displayed as a space
j             % Input string (language name)
', '          % Push this string
j             % Input string (byte count)
' bytes'      % Push this string
10t           % Push 10 (ASCII for linefeed) twice
4Z"           % Push string containing four spaces
j             % Input string (code)
&h            % Concatenate everything into a string. Implicitly display

0

Lisp comune, 57 byte

(lambda(L b c)(format()"## ~A, ~A bytes~%~%    ~A"L b c))

Inoltre, per divertimento, qui sotto c'è un frammento di codice che stampa un'intestazione per se stesso.

Lisp comune, 146 byte

#1=(PROGN
(SETF *PRINT-CIRCLE* T)
(LET ((S (FORMAT NIL "~S" '#1#)))
  (FORMAT NIL "## Common Lisp, ~A bytes~%~%    ~A" (LENGTH S) S)))


0

hashmap , 29 byte.

"## "i", "h" bytes.\n\n    "i

(Ho scritto quel post con il programma, ma ho dovuto scappare \ n in \\ n)
Spiegazione:

"## "                         Push string
     i", "                    Push input and string
          h" bytes.\n\n    "i Push input as number and string, then the input.

0

CJam , 26 23 byte

Grazie a @NinjaBearMonkey per la rimozione di 3 byte!

'#_Sl',Sl" bytes"N_S4*l

Il blocco di codice deve essere su una sola riga.

Provalo online!

Spiegazione

'#_S       e# Push character "#" twice, then a space
l          e# Read line from input
',S        e# Push a comma, then a space
l          e# Read line from input
" bytes"   e# Push this string
N_S4*      e# Push newline twice, then four spaces
l          e# Read line from input. Implicitly display 

23 byte:'#_Sl',Sl" bytes"N_S4*l
NinjaBearMonkey il

@NinjaBearMonkey Grazie! Modificato. Questa idea ha salvato un byte anche per l'altra mia risposta
Luis Mendo,

0

Pyke, 25 byte

"##"Q", "z" bytes"skd4*z+

Provalo qui!

O

Pyke, 0 byte

Provalo qui! - fai clic sul pulsante Copia risposta;)

EDIT - È solo una caratteristica del sito Web, è un imbroglio (o almeno lo considererei così) perché non analizza mai un AST e il programma web probabilmente non è considerato parte della lingua a causa della sua scarsa interazione con la lingua (anche se sta eseguendo l'interprete Pyke)


Cosa fa funzionare la versione a 0 byte?
Hayak

Puoi aggiungerlo alla risposta? Non lo conto, ma puoi ancora tenerlo lì.
Hayak

Ehi, @muddyfish, puoi separarli in due risposte?
Hayakam

@haykam se questo ha lo scopo di accettare una risposta, preferirei di no, poiché non credo che la soluzione a 0 byte sia considerata come l'utilizzo di Pyke e che si senta troppo formosa
Blue

Non accetterò quella risposta.
Hayakam

0

Perl 5, 35 byte

Un programma completo, che accetta input come argomenti della riga di comando in ordine inverso. Richiede -M5.01, che è gratuito.

say pop.', '.pop.' bytes

    '.pop

0

Emacs Lisp, 97 byte

(lambda(l c)(format"## %s, %s bytes\n\n%s"l(string-bytes c)(replace-regexp-in-string"^""    "c)))

Inoltre, poiché a volte può essere difficile sfuggire alle virgolette e cosa no, un esempio di utilizzo che copia la stringa negli appunti. (Segna la regione e usa M-:)

Emacs Lisp, 184 byte

(kill-new ((lambda(l c)(format"## %s, %s bytes\n\n%s"l(string-bytes c)(replace-regexp-in-string"^""    "c)))"Emacs Lisp"(buffer-substring-no-properties(region-beginning)(region-end))))
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.