Scrivi righe in detenzione


63

introduzione

Cattive notizie ragazzi - avete ottenuto la detenzione. Il tuo insegnante di inglese non capisce questo sito e vuole che tu "smetta di fare matematica con i tuoi doickey digitali, questa è una lezione di inglese!"

Ti ha condannato a scrivere il suo detto preferito sulla lavagna 25 volte, il che darà un totale di 100 righe sulla lavagna.

The eighteen-hundreds were a time for rum.
The nineteen-hundreds were a time for fun.
The two-thousands are a time to run
a civilized classroom.

Fortunatamente per te, sei un avido lettore (per non parlare di un esperto golfista di codice)! Hai letto un trucco che potrebbe toglierti facilmente.

foxtrot

(Foxtrot di Bill Amend)

Sfortunatamente per Jason, non ha funzionato. Ma hai un'idea migliore! Dal momento che il tuo insegnante di inglese pensa che stai facendo matematica, se lasci tutti i numeri fuori dal tuo programma, potrebbe funzionare! Vuoi anche mantenere il tuo programma il più breve possibile perché sei uno studente pigro e non vuoi scrivere molto alla lavagna.

Scrivi un programma conforme alle seguenti regole:

  • Il programma deve stampare le 4 righe sopra 25 volte. Le linee devono essere emesse in quell'ordine, ripetendo. Totale esattamente 100 linee di output (va bene una riga finale alla fine o una riga iniziale all'inizio va bene).
  • Non puoi usare i personaggi 0123456789. Il tuo insegnante viene confuso dalla matematica e ti chiamerà!
  • È possibile utilizzare qualsiasi importazione e libreria esterna senza contare le importazioni. Il tuo insegnante di inglese non conosce la programmazione. Jason avrebbe potuto risparmiare un sacco di lavoro non scrivendo #include <stdio.h>e non vuoi fare i suoi stessi errori!
  • Punteggio del programma per byteconteggio. Il punteggio più basso vince!

2
Se il testo avesse letto "1900s", scrivere l'output sarebbe stato leggermente più complicato.
Ingo Bürk,

30
al comix: non sta stampando \ n's, e il loop da 1 è piuttosto imbarazzante (come contro C natura) ...
VX

11
@VX Bill Amend è un duro da molto tempo Pascal, e ogni volta che scrive C diventa abbastanza evidente.
soffice

5
Sembra molto simile a uno dei miei vecchi insegnanti di inglese.
Kaz Wolfe,

2
Vietare + avrebbe avuto senso qui, ma forse sarebbe stato troppo difficile.
Pharap,

Risposte:


9

CJam, 109 107 106 104 103 byte

0000000: 22 0c 20 4f 18 41 e4 d8 a5 f3 95 cf 5e 2b cb 1c  ". O.A......^+..
0000010: 44 64 2f bf 28 23 e2 47 4e 4e 77 73 fc 43 09 a2  Dd/.(#.GNNws.C..
0000020: 09 0b fb 18 29 e8 e8 49 5d fc 00 da b8 70 b6 3e  ....)..I]....p.>
0000030: 0c 24 d7 5a 5b 28 1c 45 2e 90 63 86 04 5c 3e 95  .$.Z[(.E..c..\>.
0000040: 4b ae 66 22 48 48 2a 62 46 47 2b 62 22 54 0a 20  K.f"HH*bFG+b"T. 
0000050: 2d 2e 22 27 7b 2c 57 25 7c 66 3d 7b 28 2f 29 2a  -."'{,W%|f={(/)*
0000060: 7d 5a 2a 43 44 2b 2a                             }Z*CD+*

Quanto sopra è un dump xxd reversibile.

analisi

È possibile generare ed eseguire il codice sopra eseguendolo nell'interprete online :

"bxyyeighxrum.yninexfun.ytwo-thousands abto run
a civilized classroom.y
The xteen-hundreds webfor bre a time ""T
 -."'{,W%|f#31bHH*b:c`'\2*/'\*"HH*bFG+b""T
 -."`"'{,W%|f={(/)*}Z*CD+*"]:+~

Per vedere il codice generato (senza eseguirlo), rimuovere il finale ~.

Per contare il numero di byte (un carattere è un byte in ISO-8859-1), sostituire il finale ~con a ,.

Versione stampabile (122 byte)

"bxyyeighxrum.yninexfun.ytwo-thousands abto run
a civilized classroom.y
The xteen-hundreds webfor bre a time "{(/)*}Z*CD+*

Dopo aver premuto la stringa (S), viene eseguito quanto segue:

{    }Z*        " Repeat 3 times:     ";
 (              "     Q := S.shift()  ";
  /             "     T := S.split(Q) ";
   )            "     R := T.pop()    ";
    *           "     S := T.join(R)  ";
        CD+*    " S *= 12 + 13        ";

Moar golf

Dopo aver premuto la stringa non stampabile (U), viene eseguito quanto segue:

HH*b                        " U := U.base(17 * 17) ";
    FG+b                    " U := U.base(15 + 16) ";
        "T\n -."            " P := 'T\n -.'        ";
                '{,W%|      " P |= 'zyx...\0'      ";
                      f=    " U[i] -> P[U[i]]      ";

Questo spinge la stringa della versione stampabile. Il resto del codice funziona come prima.


Usando il codice, ottengo questo codice generato che è di 144 byte. Sto facendo qualcosa di sbagliato ?
Ottimizzatore

La codifica UTF-8 comporterebbe un conteggio di byte più elevato, sì. Con ISO-8859-1, il conteggio dei byte è 109. È possibile sostituire ~con ,per verificare.
Dennis,

2
Ho ottenuto il risultato esatto dell'ottimizzatore, ma aggiungendo l' ]:+~ho fatto funzionare. Perché non lo aggiungi al tuo codice?
Luminoso

1
@ user23013: l'interprete Java rispetta $ LANG per l'I / O. Internamente, CJam ha solo caratteri a 16 bit.
Dennis,

3
In realtà non devi unicodificare la tua soluzione poiché senza compressione stessa è solo 124 byte, battendo tutti gli altri.
Ottimizzatore

77

JavaScript (ES6) 164

B='teen-hundreds were a time',alert(B.replace(/./g,
"The eigh"+B+" for rum.\nThe nine"+B+" for fun.\nThe two-thousands are a time to run\na civilized classroom.\n"))

Test nella console FireFox / FireBug.


19
Questo è geniale!
Ottimizzatore

1
Sì, sostituendo ogni carattere con la stringa più grande. Fare 25 copie della stringa più grande.
Ottimizzatore

1
@Optimizer That is genus :)
FryAmTheEggman,

3
@Malvolio In effetti la sezione ripetuta è di 30 caratteri. E potrei mostrare un'enorme sequenza di tentativi, aggiungendo e tagliando parole e sostituendo i sostituti prima di trovare questa semplice soluzione.
edc65,

1
@IsmaelMiguel Penso che intendi qualsiasi browser ES6. Problema: al momento della pubblicazione di questa sfida, le stringhe di modello non erano implementate in nessun browser: Firefox era il primo - rel 34, dic primo 2014 - quindi Chrome, marzo 2015. Ma anche senza stringhe di modello il tuo misurino sarebbe 153, meglio del mio . Dovresti pubblicarlo come risposta.
edc65,

34

Python: 188 173 160 153

a="teen-hundreds were a time"
print"The eigh%s for rum.\nThe nine%s for fun.\nThe two-thousands are a time to run\na civilized classroom.\n"%(a,a)*len(a)

Non ho molto pitone, ma questo mi sembra piuttosto breve.

Modifica: Quindi mi sbagliavo, non era affatto corto! Grazie per l'assistenza nei commenti: D


1
Potresti perdere la nuova riga e rientrare nel ciclo for per salvare un paio di byte.
Holloway,

1
@Geobits, lo faccio 157
Holloway,

1
@Geobits stai correndo su una macchina Windows? Le codifiche di linea in Windows sono spesso \ r \ n anziché solo \ n. Questo potrebbe essere il motivo per cui mostra 157 byte per noi, ma 160 per te.
Rob Watts,

2
Questo è solo 160 . Probabilmente stai saltando i tre \a \ncausa della fuga ...
Ottimizzatore

1
È possibile spostare il valore per bin print: %ha una precedenza superiore a *.
FryAmTheEggman,

29

CJam, 151 140 135 132 130 128 byte (Tweetable)

"TeighYrum.TnineYfun.Ttwo-thousands are a time to run
a civilized classroom.""YT"["teen-hundreds were a time for ""
The "]erAF+*

Provalo qui

Sono in grado di abbreviare questo fino a 110 byte convertendolo in unicode, ma dal momento che non sta battendo l'altra soluzione unicode, preferirei non metterlo :)


23
Ehi, cosa :Dci fa quell'emoticon lì ?! Stai messaggiando i tuoi amici durante la detenzione? Vai all'ufficio del preside!
Maniglia della porta

2
@Doorknob: D: P
Ottimizzatore

Forse potresti creare un Talias .\nThe , quindi rimuovere la riga aggiuntiva che questo produce dall'inizio della stringa di output (il mio cjam-fu non è abbastanza buono da capire se puoi farlo facilmente)

@professorfish che finisce per consumare più byte di quanti ne risparmi. mothereff.in/… *% 28Y % 2F% 28% 40 \
Ottimizzatore

Nitpicking: l'utilizzo dei 128 byte superiori di una tabella codici compatibile ASCII non ha nulla a che fare con Unicode.
Dennis,

23

PHP, 0 byte



È possibile utilizzare qualsiasi importazione e libreria esterna senza contare le importazioni.

Per eseguire questo codice, è necessario importare una libreria chiamata data://text/plain,<?php...classroom.\n";con questo:

<?php require_once 'data://text/plain,<?php
  for($i=ord("z");$i>ord("a");$i--)
    echo "The eighteen-hundreds were a time for rum.
The nineteen-hundreds were a time for fun.
The two-thousands are a time to run
a civilized classroom.
";'; ?>

E devi aver allow_url_includeabilitato nel tuo php.ini.

Niente più numeri o estensioni, grazie a Dennis.


9
Il mio primo istinto è stato quello di urlare qualcosa sulle scappatoie, ma poiché questa risposta è in realtà autonoma, penso che sia un modo intelligente di usare PHP per sfruttare una scappatoia creata deliberatamente per le risposte di Python. Dato che stai già tradendo, potresti semplicemente usare require_once "data://text/plain,The eighteen-hundreds...";, che non richiede sh , non usa numeri ed è ancora 0 byte.
Dennis,

10
Valuterò questo per la creatività, ma non accetterò questo.
hmatt1,

14

Rubino, 185 180 176 byte

EDIT: interpolazione di stringhe, grazie @britishtea

È il mio primo golf in assoluto, e io non sono un grande rubista (ma certamente amo Ruby). Comunque, è così (abbreviato, suggerimento di Doorknob).

t=' were a time for '
s="The eighteen-hundreds#{t}rum.
The nineteen-hundreds#{t}fun.
The two-thousands are a time to run
a civilized classroom."
s.split.size.next.times{puts s}

1
Puoi giocare a questo verso il basso sostituendo alcune delle parole / gruppi di parole ricorrenti con interpolazione di stringhe.
britishtea,

3
+1 per aver notato che ci sono (quasi) 25 parole nella stringa
Digital Trauma,

2
s.split.size.nextsalva 5 caratteri (non è necessario specificare lo spazio su cui dividere).
Maniglia della porta

Non conosco Ruby, ma non sarebbe (s.split.size+1).timespiù corto di 1 byte?
Seequ,

1
@Sieg non può usare numeri!
rjdown,

13

Java 249 231 230 222

La mia prima risposta! Perché non iniziare usando la lingua che conosco così bene.

class c{public static void main(String[]g){for(int a='!';a++<':';out.println("The eighxrum.\nThe ninexfun.\nThe two-thousands are a time to run\na civilized classroom.".replaceAll("x","teen-hundreds were a time for ")));}}

Ungolfed

import static java.lang.System.*;
class c
{
    public static void main(String[]g)
    {
        for(int a='!';a++<':';out.println("The eighxrum.\nThe ninexfun.\nThe two-thousands are a time to run\na civilized classroom.".replaceAll("x","teen-hundreds were a time for ")));
    }
}

9
Benvenuto! Puoi sbarazzartene publicper la tua classe e abbreviare argsun singolo personaggio. Potresti anche fare a++<':'invece di incrementarlo separatamente. Poiché il PO non conta le importazioni, puoi risparmiare un po 'di più con import static java.lang.System.*;, quindi non è necessario scrivere System.più tardi (dove conta). In questo modo sono arrivato a circa 230. Potresti voler dare un'occhiata alla pagina dei suggerimenti Java se non l'hai già fatto.
Geobits,

@Optimizer Grazie! Non ho visto lo sciopero sopra.
Luminoso

@Luminosa NP :)
Ottimizzatore

@Geobits Grazie! Apparentemente, puoi anche inserire il codice direttamente nel loop stesso. Non ho aggiunto o rimosso nulla, ma penso che in questo modo sembri più golfato.
Luminoso

4
L'abuso di loop è piuttosto comune. Se avessi più dichiarazioni nel corpo, potresti metterne una all'esterno e il resto all'interno per salvare un singolo personaggio (poiché hai comunque bisogno di un punto e virgola all'esterno). Molti golf finiscono per essere un grande giro in quel modo. Inoltre, "sembra più golfato" è una ragione totalmente valida per fare qualsiasi cosa anche se non salva: P
Geobits

11

C 171

a='a';b="teen-hundreds were a time for ";main(){for(;a++<'z';)printf("The eigh%srum.\nThe nine%sfun.\nThe two-thousands are a time to run\na civilized classroom.\n",b,b);}

All'inizio, ho provato la versione semplicistica (189 byte), che era migliore dell'altra soluzione C ...

main(a){for(a='a';a<'z';++a)printf("The eighteen-hundreds were a time for rum.\nThe nineteen-hundreds were a time for fun.\nThe two-thousands are a time to run\na civilized classroom.\n");}

che in seguito ho ottimizzato un po '...


1
Huh, è carino. Non ho realizzato che le variabili statiche con i letterali stringa assegnati loro implicitamente abbiano tipo char *.
FireFly,

@FireFly GCC si compila bene sul apresumibilmente perché predefinito int, che può accettare un charvalore. Non mi piace bse non lo chiamo un char[]pensiero. VX, quale compilatore stai usando?
Level River St,

bè inttroppo ma contiene il puntatore alla stringa letterale. È completamente ok in GCC (ho sulla mia macchina 4.8.2).
VX,

1
for(a='a';++a<'z';)
Seequ,

9

JavaScript, ES6, 174 172 154 byte

Usando il replacetrucco di @ edc65 . Grazie!

alert((d="teen-hundreds were a time").replace(/./g,`The eigh${d} for rum.
The nine${d} for fun.
two-thousands are a time to run
a civilized classroom.
`))

Funziona solo con gli ultimi Firefox (34 e successivi) a causa dell'uso delle stringhe di template.


@Nijikokun Sai che causerà 30 ripetizioni anziché 25, giusto?
Ottimizzatore

Immagino che ff 34 sia beta o qualcosa del genere dato che sono l'ultimo (appena controllato) ed è 33 e non funziona lì
Sammaye,

8

BrainFuck ( 1.597 caratteri )

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

Questo può ancora essere ulteriormente approfondito, se qualcuno è interessato.

È possibile verificarlo e confermare che fornisce l'output corretto nel rispetto di tutte le regole.


5
Che cos'è questo? Ti avevo detto di scrivere frasi, non casini casuali! Non ci sono nemmeno parole qui!
Riking

5
Ummm .. Penso che l'obiettivo sia usare il minor numero di personaggi. Hai sicuramente vinto l'anti-goal :-)
Carl Witthoft il

7

Perl - 145

Sono felice di vedere così tante risposte! Ecco una soluzione Perl.

$s="teen-hundreds were a time for";print"The eigh$s rum.
The nine$s fun.
The two-thousands are a time to run
a civilized classroom.
"for b..z

7

Dal momento che odia così tanto la matematica, perché non Mathematica (177)

   a = "teen-hundreds were a time for "; Do["The eigh" <> a <> "rum.
   The nine" <> a <> "fun.
   The two-thousands are a time to run a civilized classroom." // Print, {StringLength@a}]

6

Javascript ES6, 198 193 byte

m=Math;alert("The eighteen-hundreds were a time for rum.\nThe nineteen-hundreds were a time for fun.\nThe two-thousands are a time to run\na civilized classroom.\n".repeat(~~(m.exp(m.PI)+m.E)))

Il tuo insegnante non vuole alcun numero, ma dato che sono un insegnante di inglese, non hanno idea di cosa Math.floor(Math.exp(Math.PI)+Math.E)significhi.

Più facilmente:

alert("The eighteen-hundreds were a time for rum.\n\
 The nineteen-hundreds were a time for fun.\n\
 The two-thousands are a time to run\na civilized\n classroom.".repeat(Math.floor(Math.exp(Math.PI)+Math.E)))

Deve essere eseguito nell'ultimo Firefox


1
Manca una nuova riga alla fine, quindi la prima e l'ultima riga vengono aggiunte dando 75 righe
edc65,

Premierò +1 per aver piegato le regole con il riferimento di XKCD di e ^ pi, ma con + e invece di -pi ... Bravo!
WallyWest,

-4 byte:with(Math)alert("long string here".repeat(exp(PI)+E|[]))
nderscore

Oh bene, dimentica la matematica:(q='aaaaa'.length)*q
edc65,

Dimentica anche il commento di @ edc65! Usa questo "\x18".charCodeAt():! (codifica la freccia verso l'alto e risparmierai un sacco!)
Ismael Miguel,

6

Javascript - 178 byte 176 byte

Il mio primo golf, ho pensato di provarlo con un po 'di operatori, non è andato come sperato, ma vabbè!

c="teen-hundreds were a time for "
b=!!c
alert(Array((b+b+b<<b+b)+b<<b).join("The eigh"+c+"rum.\nThe nine"+c+"fun.\nThe two-thousands are a time to run\na civilized classroom.\n"))

Dato che sono già in detenzione e ovviamente ho problemi a comportarmi da solo ... Javascript - 71 byte

Questo probabilmente mi metterà nei guai più profondi, ma, se sono già atterrato in detenzione, E sto pianificando di ingannare la mia detenzione, apparentemente mi manca un buon giudizio su come dovrei comportarmi in classe. Forse se riesco a tirarne uno sopra il mio insegnante, posso tirarne uno su tutti gli altri giocatori di golf là fuori.

b=+true;alert( Array((b+b+b<<b+b)+b<<b).join($('code')[+!b].innerHTML))

Presto! Utenti Chrome / IE 11 / Firebug, apri le tue console ADESSO e provalo.

(Per favore, non farmi del male troppo, ho pensato che fosse divertente)


1
Il 72 è divertente. Il 176 è molte volte sbagliato: Array (25) .join () fornisce 24 ripetizioni e manca una riga alla fine della frase. Tutto sommato 24 * 3 = 72 righe invece di 100 (ragazzo pigro!)
edc65

AUGH, ok riparato. Ora 178 e 71.
Sidney,

1
Puoi salvare 2 byte aggiungendo te uno spazio finale in "een-centinaia ... per".
Luminoso

Cosa sta facendo il secondo codice?
solo il

1
@justhalf, utilizza JQuery, una libreria JavaScript comune che apparentemente utilizza la rete SO. $ È in realtà una funzione che, tra molte altre cose, richiede molto lavoro nella selezione degli elementi DOM. Usando $ ('<selector>'), che in questo caso è tutti gli elementi con il tag 'code', ottengo un oggetto contenente tutti gli elementi. Usando [+! B] ottengo il valore intero di false, che è zero, quindi seleziono lo 0 ° indice, che sembra essere il primo blocco di codice dell'OP, che in realtà è il detto preferito dagli insegnanti.
Sidney,

5

C # - 229 216 byte

usingFTW gratis !

using c=System.Console;
class S{static void Main(){var a="teen-hundreds were a time";for(int b=a.Length,i=b-b;i++<b;)c.Write("The eigh"+a+" for rum.\nThe nine"+a+" for fun.\nThe two-thousands are a time to run\na civilized classroom.\n");}}

Alternativo, stesso conteggio byte (più usingabuso, però)

using i=System.Int32;
using c=System.Console;
class S{static void Main(){var a="teen-hundreds were a time";for(int b=new i();b++<a.Length;)c.Write("The eigh"+a+" for rum.\nThe nine"+a+" for fun.\nThe two-thousands are a time to run\na civilized classroom.\n");}}

4
~~ (╯ ° □ °) ╯︵ ┻━┻
William Barbosa,

Puoi aggiungere "for" aa
FryAmTheEggman il

@FryAmTheEggman la stringa è lunga 25 caratteri, la sta usando per ottenere discretamente il numero 25. Tuttavia, può scambiare questo metodo semplicemente sottraendo i caratteri l'uno dall'altro ( ':'-'!'== 25), che è più corto di a.Lengthe consentirà di essere incluso come suggerisci. (In alternativa, fai come sembrano le altre risposte e fai un giro tra !e :, divertente come abbiamo scelto tutti gli stessi caratteri)
VisualMelon

@VisualMelon Whoops, hai perfettamente ragione.
FryAmTheEggman,

1
Pensavo di poterlo fare visto che gli utilizzi non vengono nemmeno conteggiati, OP ha chiarito questo?
William Barbosa,

5

Befunge-93, 268 260 256 (dimensione della griglia: 72x6 = 432)

#v"K">:!#@_v>$"enin">,,,,::-" rof emit a erew sderdnuh neet">:#,_$::!!-#
, ,,,"The "<|\!\%-"\^"::%-" #":-!!:
   -"#-"-::$_ "hgie"^v1"two-thousands are a time to run"
$_$  "nuf"v"rum"
v1-"##",,,<      >:#,_"moorssalc dezilivic a"1
_# < ^,,\-"AK."$_,#!:

Questa è la prima volta che gioco a golf, quindi ho pensato di provare una lingua che non era già stata usata per questo problema, dato che non avrei aggiunto altro. Poiché è compatibile con Befunge-93 (si adatta a una griglia 80x25 e utilizza solo le istruzioni di Befunge-93), dovrebbe funzionare anche in Befunge-98. Per ogni evenienza, ho anche evitato di far passare il puntatore su caratteri non di istruzione diversi dallo spazio. Non riuscivo a ricordare se la specifica in realtà definiva quei personaggi come non operativi e non avrò demoni nasali nel mio codice.

Non puoi davvero annullare il codice Befunge. La cosa chiave da notare qui è che Befunge spinge i caratteri nello stack come i loro valori ASCII, rendendo relativamente semplice fare riferimento ai numeri senza fare letteralmente riferimento a loro. L' "K"angolo in alto a sinistra è 75, riferito al numero di ripetizioni per il numero di clausole "the" per ripetizione; Uso il modulo e qualche altra astuzia su (copie di) questo numero per determinare quale percorso prendere attraverso la stampa su ogni giro. ::-è un bel linguaggio per zero, utile per stringhe con terminazione zero; Lo uso due volte qui.

A volte il puntatore deve passare attraverso un punto in cui sto definendo una stringa, quindi le scelte specifiche dei caratteri utilizzati per ottenere determinati numeri in alcuni punti.

La cosa bella di molti interpreti di Befunge è che puoi guardare il puntatore che sfreccia intorno alla griglia, oltre a vedere quali valori sono nello stack. In questo modo puoi scorrere e vedere come funziona il programma, più o meno! Ti consiglio di usare http://befungius.aurlien.net/ se non hai il tuo interprete Befunge preferito.

Questo probabilmente può essere ridotto un po '(o molto) di più. Per favore, mi dia un feedback! Se devo fornire una spiegazione migliore, qualcuno mi faccia sapere; Sono nuovo di questo.

Modifica : rasato alcuni byte eliminando il reindirizzamento non necessario all'ultima riga quando termina il programma (posizionando semplicemente @dove si trovava ^prima).

Un'altra modifica : rasato alcuni byte in più punti, principalmente con l'inganno. (Aggiunte anche le dimensioni della griglia, come sembra essere la tendenza con le risposte di Befunge.)


Ehi Kasran, benvenuto nello scambio di stack di codegolf! Questa risposta è fantastica. La tua spiegazione è buona e ti sei collegato a un interprete di Befunge che è davvero utile per lingue strane per cui non tutti hanno un compilatore (le persone fanno comunemente cose come "esegui questo qui").
hmatt1,

Befunge è un linguaggio davvero difficile e devi tenere a mente le dimensioni del codice stesso durante la scrittura. Il tuo codice ha un bell'aspetto e funziona. Ma ridurrebbe le dimensioni se salvi re a time da qualche parte?
Ismael Miguel,

Non sto usando istruzioni o comportamenti specifici di Funge-98 che conosco, ma da quando ho scritto questa risposta ho appreso che alcuni comportamenti dell'interprete di Befungius non sono standard - vale #a dire usare a un'estremità di una riga per saltare il personaggio all'altro capo (in CCBI , per esempio, il #giusto salta lo spazio infinito tra esso e il personaggio all'altro capo), che interrompe questo programma. Non mi sono preso la briga di tornare e risolvere questo argomento con questo in mente.
Kasran,

Ci sono alcune 1cifre, che non sono consentite
Jo King

4

Pyth 135 136 140

*ltG%"The eigh%srum%snine%sfun%stwo-thousands are a time to run\na civilized classroom.\n"*hhZ("teen-hundreds were a time for "".\nThe 

Nota lo spazio finale.

Usa praticamente lo stesso trucco di @Geobits e dei suoi amici commentatori nella risposta di Python per costruire la stringa. Ora usa anche una parte di questa risposta .

Questo utilizza la variabile integrata G, che contiene abcdefghijklmnopqrstuvwxyze ne ottiene uno in meno della sua lunghezza per produrre i 25 output.


1
Questo sembra essere 136 byte anziché 135
Ottimizzatore

1
@Optimizer Mi dispiace, dovrei leggere i miei appunti: ho dimenticato lo spazio finale quando l'ho incollato lì: S
FryAmTheEggman

4

Rubino - 152 141

puts"The eight#{e="een-hundreds were a time for "}rum.
The ninet#{e}fun.
The two-thousands are a time to run
a civilized classroom.
"*(?X-??)

http://repl.it/2Om/6


1
Uso intelligente dei letterali dei personaggi di 1.8! Potresti essere in grado di utilizzare String#*per ripetere le righe 25 volte anziché Integer#times.
britishtea,

@britishtea - ha funzionato a meraviglia :)
Mikey,

1
Potresti radere qualche byte in più non assegnando prima le linee. Lo spazio tra put e una stringa letterale è facoltativo ( puts"hi"è legale).
britishtea,

Assegnare e all'interno dell'interpolazione è un bel tocco.
Wayne Conrad,

3

Python, 165 byte

h="hundreds were a time for "
t="The "
for i in h:print t+"eighteen-"+h+"rum.\n"+t+"nineteen-"+h+"fun.\n"+t+"two-thousands are a time to run\na civilized classroom."

Ha funzionato davvero bene che la lunghezza di h è 25, che non era intenzionale. =)


3

Python 2 - 143

Una risposta sciocca:

from this import i
a="teen-hundreds were a time for ",".\nThe "
print"The eigh%srum%snine%sfun%stwo-thousands are a time to run\na civilized classroom.\n"%(a+a)*i

Si noti che il conteggio completo è 162. Ho lasciato fuori tutto from this import i.

Utilizza sostituti simili alla mia strategia Pyth, ma non ho potuto resistere alla pubblicazione di questo dopo aver scoperto l'esilarità dell'importazione da questo :)


+1 Per l'uso di from this import i! Come lo sapevi?
Decadimento beta

1
@BetaDecay In realtà ero annoiato e ho deciso di leggere lo zen di Python, quindi sono andato dal mio interprete e ho scritto import this. Poi ho pensato: "Cos'altro potrebbe esserci nel thismodulo?" Così ho chiamato dir(this). Ecco, insieme a un dizionario, una stringa confusa e una "!"variabile, c'era una costante numerica ... uguale a 25.
FryAmTheEggman

3

PHP (175 157156 byte; 152 con unix EOF):

Non è la soluzione più giocata a golf, ma sicuramente fa il lavoro ed è più piccola di alcuni tentativi.

Ecco il codice:

$a=a;$f='re a time';$r="teen-hundreds we$f for";while($a++<z)echo"The eigh$r rum.
The nine$r fun.
The two-thousands a$f to run
a civilized classroom.
";

Vecchia versione:

$a=a;while($a++!=z)echo"The eighteen-hundreds were a time for rum.
The nineteen-hundreds were a time for fun.
The two-thousands are a time to run
a civilized classroom.
";

Questo funziona perché php esegue il ciclo dei caratteri e controlliamo solo se non lo è ze ci fermiamo.

(Una curiosità è che quando arriva php z, va a aa.)


3
La convenzione generale qui è quella di contare i newline come un solo byte, a meno che forse la tua lingua non sia così testarda da accettare solo CRLF, il che non è il caso di PHP.
nyuszika7h

3

Python 2 - 155

Nota: poiché i personaggi di controllo non vengono visualizzati su SE, l'ho sostituito con\x19.

a,b='\nThe ','teen-hundreds were a time for '
print(a+'eigh'+b+'rum.'+a+'nine'+b+'fun.'+a+'two-thousands are a time to run\na civilized classroom.')*ord('\x19')

Versione base 64:

YSxiPScKVGhlICcsJ3RlZW4taHVuZHJlZHMgd2VyZSBhIHRpbWUgZm9yICcKcHJpbnQoYSsnZWln
aCcrYisncnVtLicrYSsnbmluZScrYisnZnVuLicrYSsndHdvLXRob3VzYW5kcyBhcmUgYSB0aW1l
IHRvIHJ1bgphIGNpdmlsaXplZCBjbGFzc3Jvb20uJykqb3JkKCcZJyk=

Per quanto riguarda l'importazione, penso che potresti risparmiare un po ' from string import *o comunque sia chiamato in Python
FireFly

1
Puoi spostare "teen" in b.
FryAmTheEggman,

2
È possibile rimuovere le []parentesi nella prima riga, che crea implicitamente una tupla e quindi la decomprime.
Maniglia della porta

Puoi anche spostareord('d')//len('aaaa') to before the string so you don't have to bracket it.
FryAmTheEggman il

1
@Dennis L'ultima modifica dell'OP consente nuove linee guida.
Decadimento beta

3

LiveScript - 181

p=(a,b)->"The #{a}teen-hundreds were a time for #b.\n"
each console.log,map (->(p \eigh \rum)+(p \nine \fun)+'The two-thousands are a time to run\na civilized classroom.'),[\A to\Y]

Importazioni richieste:

{each, map} = require 'prelude-ls'

Se si desidera eseguirlo in Node.js, installare LiveScript( not livescript ) e prelude-lspacchetti da npm, sostituire alertcon console.loged eseguire lsc prog.ls, dove prog.lscontiene il programma.


13
Vedi regole: "Non puoi usare i personaggi 0123456789"
Paolo R

2
Bella cattura, fissa.
nyuszika7h

2

T-SQL: 206

Utilizza un cross join su cinque righe per generare 25 righe selezionando la frase. Le interruzioni di riga sono importanti per l'output.

with c as(SELECT\ N FROM(VALUES(\),($),($),($),($))A(B))SELECT REPLACE('The eigh$rum.
The nine$fun.
The two-thousands are a time to run
a civilized classroom.','$','teen-hundreds were a time for ')FROM c a,c b

2

Bash, 151 byte

Praticamente una porta diretta della tua risposta

t="teen-hundreds were a time for"
for i in {a..y};{
echo "The eigh$t rum.
The nine$t fun.
The two-thousands are a time to run
a civilized classroom."
}

2

C, 196 caratteri

Questo non è un compito facile per il buon vecchio C. Factoring il modello "The% steen-centinaia ..." mi fa risparmiare due interi personaggi.

Spazio bianco per chiarezza, includere non conteggiato.

#include <stdio.h>
main(){
  for (char*p="The %steen-hundreds were a time for %s.\n",
           *s="The two-thousands are a time to run\na civilized classroom.",
           *q=p;
       *q++ - 'a';
       puts(s))
   printf(p,"eigh","rum"), printf(p,"nine","fun");
}

2

Ruby, 145

?K.upto(?c){puts"The eigh#{x="teen-hundreds we#{t="re a time "}for "}rum.
The nine#{x}fun.
The two-thousands a#{t}to run
a civilized classroom."}

Spiegazione

  • Utilizzare String#uptoper stampare le linee 25 volte. La gamma"K".."c" è di 25 caratteri.
  • Utilizzare l'interpolazione di stringhe di base per abbreviare le linee.

2
#{a="The "}ti sta effettivamente costando più personaggi! #{a}è della stessa lunghezza diThe
Mikey,

2

Racchetta 173

(let([x"teen-hundreds were a time for "])(for([z(+ #xa #xf)])(displayln(~a"The eigh"x"rum.\nThe nine"x"fun.\nThe two-thousands are a time to run\na civilized classroom."))))

Ungolfed:

(let ([x "teen-hundreds were a time for "])
  (for([z(+ #xa #xf)])
    (displayln (~a "The eigh"x"rum.\nThe nine"x"fun.\nThe two-thousands are a
     time to run\na civilized classroom."))))

2

C, 215 203 199 byte

main(a){a<<='\xC'+'\xD';while(a>>=!!a)printf("The eighteen-hundreds were a time for rum.\nThe nineteen-hundreds were a time for fun.\nThe two-thousands are a time to run\na civilized classroom.\n");}

Ungolfed

main(a)
{
  a<<='\xC'+'\xD';
  while(a>>=!!a)
    printf("The eighteen-hundreds were a time for rum.\nThe nineteen-hundreds were a time for fun.\nThe two-thousands are a time to run\na civilized classroom.\n");
}

Ho usato lo spostamento dei bit per scorrere senza alcun numero.

a<<='\xC'+'\xD' imposta a su 0b1 [25 zeri]

a>>=!!a cambia a destra di un bit per ogni volta che ripetiamo il ciclo

Modifica: a equivale a argc, quindi il suo valore è già 1 quando il programma viene eseguito senza argomenti. Modificato a>>='\xB'-'\xA'a a>>=!!'\xA'4 byte in meno. Inoltre, il testo è stato visualizzato solo 24 volte. Aggiustato. Rimosse le parentesi extra in while.

Modifica 2: modificato !!'\xA'in !!a. Sembra funzionare e salva 4 byte


1
È possibile utilizzare putsper salvare più byte.
Spikatrix,

2

Rant, 191 byte

Non è la soluzione più breve, ma comunque interessante. Ho scritto una subroutine per scrivere le prime tre righe, e l'ho progettata in modo che chiamandola con un argomento vuoto restituisse una stringa lunga 25 caratteri. Passo quindi la sua lunghezza al ripetitore.

[pin:][$[_:a]:The [arg:a][sync:;ordered]{thousands a|teen-hundreds we}re a time ][r:[len:[$_:]]]{[step:][$_:eigh]for rum.\N[$_:nine]for fun.\N[step:][$_:two-]to run\Na civilized classroom.\N}

Ungolfed:

[pin:]
[$[_:a]:The [arg:a][sync:;ordered]{thousands a|teen-hundreds we}re a time ]
[r:[len:[$_:]]]
{
    [step:]
    [$_:eigh]for rum.\N
    [$_:nine]for fun.\N
    [step:]
    [$_:two-]to run\N
    a civilized classroom.\N
}

Provalo online

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.