Vetrina di lingue


508

Appunti

  • Questo thread è aperto e sbloccato solo perché la community ha deciso di fare un'eccezione . Si prega di non utilizzare questa domanda come prova che è possibile porre domande simili qui. Si prega di non creare ulteriori domande .

  • Questo non è più un , né le lunghezze dei frammenti sono limitate dal conteggio dei voti. Se conosci questo thread da prima, assicurati di familiarizzare con le modifiche.

Questo thread è dedicato a mostrare funzionalità interessanti, utili, oscure e / o uniche che i tuoi linguaggi di programmazione preferiti hanno da offrire. Questa non è né una sfida né una competizione, ma uno sforzo di collaborazione per mostrare il maggior numero possibile di linguaggi di programmazione.

Come funziona

  • Tutte le risposte dovrebbero includere il nome del linguaggio di programmazione nella parte superiore del post, preceduto da a #.

  • Le risposte possono contenere uno (e solo uno) factoide, ovvero un paio di frasi senza codice che descrivono la lingua.

  • A parte il factoide, le risposte dovrebbero consistere in frammenti di codice, che possono (ma non devono essere) programmi o funzioni.

  • Non è necessario che i frammenti siano correlati. In effetti, i frammenti troppo correlati potrebbero essere ridondanti.

  • Dal momento che questo non è un concorso, tutti i linguaggi di programmazione sono i benvenuti, ogni volta che sono stati creati.

  • Le risposte che contengono più di una manciata di snippet di codice dovrebbero utilizzare uno snippet di stack per comprimere tutto tranne il factoid e uno dei snippet.

  • Quando possibile, dovrebbe esserci una sola risposta per linguaggio di programmazione. Questa è una wiki della comunità, quindi sentiti libero di aggiungere frammenti a qualsiasi risposta, anche se non l'hai creata tu stesso. Esiste uno snippet di stack per la compressione dei post , che dovrebbe mitigare l'effetto del limite di 30.000 caratteri.

Le risposte che precedono queste linee guida dovrebbero essere modificate. Aiutate ad aggiornarli secondo necessità.

Risposte correnti, in ordine alfabetico per nome della lingua

$.ajax({type:"GET",url:"https://api.stackexchange.com/2.2/questions/44680/answers?site=codegolf&filter=withbody",success:function(data){for(var i=0;i<data.items.length;i++){var temp=document.createElement('p');temp.innerHTML = data.items[i].body.split("\n")[0];$('#list').append('<li><a href="/a/' + data.items[i].answer_id + '">' + temp.innerText || temp.textContent + '</a>');}}})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><base href="http://codegolf.stackexchange.com"><ul id="list"></ul>

Risposte:


413

matematica

Potresti voler leggere questo dal basso verso l'alto dal momento che è l'ordine in cui è stato scritto e alcune spiegazioni faranno riferimento a frammenti precedenti o assumeranno spiegazioni da più in basso.

L'elenco sta crescendo abbastanza a lungo. Ho iniziato a rimuovere frammenti meno interessanti e ora inizierò a saltare frammenti. Consulta la cronologia delle revisioni per un elenco completo di frammenti fino a 41. Per alcune gemme vere, controlla i frammenti 81 , 64 , 44 , 23 , 19 , 12 e 8 .

Lunghezza frammenti 143 e 144

Finalmente ... lo stavo aspettando da un po '(e ci sto giocando da tanto tempo, quindi non devo aspettare ancora). Ho accennato in precedenza che puoi anche equazioni numericamente e che puoi anche risolvere equazioni differenziali. Volevo mostrare un esempio non banale di questo.

Considera un doppio pendolo su un'asta (cioè un pendolo attaccato ad un altro). Ogni asta ha una lunghezza unitaria e ciascuno dei due pesi pendolo ha una massa unitaria. Ho anche usato la gravità unitaria per abbreviare l'equazione. Il seguente frammento di 143 caratteri risolve le equazioni di moto lagrangiane per tale sistema (in termini di angoli dei pendoli e momento angolare). Una derivazione può essere trovata in questo PDF , sebbene sia un esercizio abbastanza diretto se hai familiarità con la meccanica lagrangiana.

È abbastanza illeggibile, perché ho dovuto giocare molto a golf:

d@t@t;NDSolve[{#''@t==-#4#2''[t]Cos@d-##3#2'@t^2Sin@d-Sin@#@t&@@@{{θ,φ,1,.5},{φ,θ,-1,1}},θ@0==2,φ@0==1,θ'@t==φ'@t==0/.t->0},{θ,φ},{t,0,60}]

La cosa bella è che Mathematica mostra immediatamente una trama in miniatura di come appaiono approssimativamente le soluzioni:

inserisci qui la descrizione dell'immagine

Va bene, ma è un po 'zoppo. Vogliamo sapere che aspetto ha effettivamente il movimento della pendola. Quindi ecco uno snippet di 144 caratteri, che anima la pendula mentre traccia la traiettoria del pendolo inferiore:

Graphics@{Line@{{0,0},p=θ~(h={Sin@#@#2,-Cos@#@#2}&)~t,p+φ~h~t},White,{0,0}~Circle~2.2}~Show~ParametricPlot[θ~h~u+φ~h~u,{u,0,t}]~Animate~{t,0,60}

L'animazione risultante è simile al seguente:

inserisci qui la descrizione dell'immagine

Ho dovuto imbrogliare leggermente: se tracci oltre t = 30, ParametricPlotper impostazione predefinita usa troppi punti trama e la linea diventa piuttosto frastagliata. Ma la maggior parte delle dinamiche interessanti si verificano dopo quel tempo, quindi ho usato l'opzione PlotPoints -> 200per rendere la seconda metà dell'animazione più fluida. Non è nulla di sostanzialmente diverso, e la prima metà sembrerebbe comunque indistinguibile.

Penso che questo sarà il mio ultimo frammento, a meno che non mi venga in mente qualcosa di veramente sconvolgente. Spero ti sia piaciuto!

Lunghezza 100 frammento

GeoGraphics[{GeoStyling[Opacity[0.5]], NightHemisphere[]}, GeoBackground -> GeoStyling["ReliefMap"]]

Stavo pensando ad alcune belle Geofunzioni per lo snippet 100, ma alla fine ho trovato qualcosa di veramente elegante su Tweet-a-Program , che dovevo solo rubare. Quanto sopra genera una bella mappa solare della Terra per l'ora e il giorno attuali, sovrapponendo una forma semi-opaca dell'emisfero notturno su una mappa in rilievo:

inserisci qui la descrizione dell'immagine

Lunghezza frammento 81

CellularAutomaton[{{0,2,3,If[0<Count[#,1,2]<3,1,3]}[[#[[2,2]]+1]]&,{},{1,1}},i,n]

Prometto che è l'ultimo automa cellulare. Ma proprio lì c'è Wireworld in 81 personaggi. Questa volta non ho codificato la regola in un singolo numero, a) perché penso che sarebbe ridicolmente enorme (non mi sono preoccupato di capirlo) eb) per mostrarti l'ennesimo uso di CellularAutomaton. Questa volta, la regola viene semplicemente specificata come una funzione pura, che riceve un vicinato di celle e restituisce il nuovo valore della cella. Questo è un approccio molto più fattibile per gli automi cellulari con più di 2 colori / stati.

Ad ogni modo, ho impostato l'esempio di Wikipedia in i(due orologi che generano segnali e un gate XOR) e l'ho lasciato correre per circa 50 passaggi:

inserisci qui la descrizione dell'immagine

Se sei interessato, la trama e l'animazione effettive potrebbero essere state snippet 77:

ListAnimate[ArrayPlot[#,ColorRules->{0->Black,1->Blue,2->Red,3->Yellow}]&/@w]

Snippet di lunghezza 69

DSolve[r^2*R''[r]+2r*R'[r]-R[r]==0&&(R[r]==1&&R'[r]==2/.r->1),R[r],r]

Torna a qualcosa di utile. Oltre ai normali sistemi di equazioni, Mathematica può anche risolvere sistemi di equazioni differenziali. Quanto sopra è tecnicamente solo un'equazione differenziale con condizioni al contorno, ma puoi anche fornirla come un sistema di tre equazioni. Simile alle funzioni integrative DSolveè per soluzioni esatte mentre NDSolverisolverà il sistema numericamente. Quanto sopra produce un'unica soluzione

{{R[r] -> 1/2 r^(-(1/2) - Sqrt[5]/2) (1 - Sqrt[5] + r^Sqrt[5] + Sqrt[5] r^Sqrt[5])}}

che ora potrebbe essere facilmente utilizzato per ulteriori calcoli o tracciato.

Lunghezza 64 frammento

CellularAutomaton[{224,{2,{{2,2,2},{2,1,2},{2,2,2}}},{1,1}},i,n]

Ti ho promesso più CellularAutomatonmagia! Questo frammento calcola il gioco della vita di Conways con le condizioni iniziali iper i npassaggi e fornisce il risultato per tutti i timestep intermedi.

Qualche parola sui parametri: 2è il numero di stati di cella. {{2,2,2},{2,1,2},{2,2,2}}fornisce i pesi per le 9 celle nel quartiere 3x3. Assicura che la cella stessa sia distinguibile dalla somma degli 8 vicini. {1,1}afferma che la regola CA dipende dalle celle 1 passo in entrambe le direzioni. Infine, 224la regola di aggiornamento effettiva è codificata in un singolo numero. Capire questo numero può essere un po 'complicato, ma c'è un tutorial abbastanza utile nella documentazione . Per automi più complicati, un singolo numero non lo taglierà (perché il numero sarebbe enorme). Forse ci arriveremo domani! ;)

Ad ogni modo, se inserisco una griglia casuale in ie 200 in ne invio il risultato tramite un'animazione ArrayPlot, possiamo vedere che funziona davvero:

inserisci qui la descrizione dell'immagine

Lunghezza 59 frammento

SphericalPlot3D[Re[Sin[θ]Cos[θ]Exp[2I*φ]],{θ,0,π},{φ,0,2π}]

Ricordi il diagramma polare dello snippet 26? Possiamo fare la stessa cosa in 3D! (In effetti, ci sono due funzioni: RevolutionPlot3Dper le polari cilindriche e SphericalPlot3Dper le polari sferiche.) Proprio come Graphics3Dtutti i grafici tridimensionali sono automaticamente ruotabili in Mathematica, quindi non devi preoccuparti di un buon angolo di ripresa frontale. Quanto sopra traccia qualcosa di simile a un'armonica sferica (non del tutto) e sembra:

inserisci qui la descrizione dell'immagine

Lunghezza frammento 52

Manipulate[Plot[x^2a+x*b,{x,-3,3}],{a,.1,3},{b,0,3}]

Questo è piuttosto elegante. Manipulateprende qualsiasi espressione, la parametrizza con un mucchio di variabili e quindi ti dà un widget, dove puoi modificare i parametri e vedere dal vivo come cambia l'espressione. Come espressione di solito avrai una sorta di trama. Ciò è particolarmente utile se stai usando Mathematica nelle lezioni per dimostrare come le famiglie di soluzioni rispondono alla modifica dei parametri. Quanto sopra dimostra come i aei bcoefficienti scalare e spostano una parabola:

inserisci qui la descrizione dell'immagine

Lunghezza frammento 48

Import["http://www.google.com/doodles","Images"]

Importè un comando abbastanza potente. È usato sia per caricare file dal disco che dal web. Conosce molti formati di file diversi e per alcuni di essi (come le pagine HTML) può effettivamente estrarre i dati immediatamente. Quanto sopra scarica tutte le immagini dalla pagina doodle di Google.

Lunghezza frammento 45

EdgeDetect@ExampleData@{"TestImage","Splash"}

Tempo per l'elaborazione di alcune immagini. Mathematica include molti dati di esempio, tra cui immagini (come Lena), trame, modelli 3D e frammenti audio. Innanzitutto, cariciamo uno di quelli:

inserisci qui la descrizione dell'immagine

Vuoi rilevare i bordi? È una singola chiamata di funzione:

inserisci qui la descrizione dell'immagine

Lunghezza 44 frammento

ArrayPlot@CellularAutomaton[110,{{1},0},100]

Alla fine, ho abbastanza personaggi da usare CellularAutomatone anche renderizzare il risultato. :) Per quanto ne so, CellularAutomatonè l'unica funzione in Mathematica relativa alle CA. Stephen Wolfram sembra considerarsi il numero uno quando si tratta di automi cellulari, quindi questa funzione è incredibilmente potente. Quanto sopra mostra praticamente il suo utilizzo più semplice. Questo simula un automa cellulare 1D per 100 passi - e in realtà restituirà lo stato dell'automa in ciascuno di quei passi, quindi il risultato è bidimensionale. La regola è il primo parametro, che può essere specificato in dettaglio tramite elenchi o semplicemente codificato in un singolo numero. Per questo esempio, ho scelto la regola di Turing piuttosto famosa, regola 110 . {{1},0}definisce la condizione iniziale: una singola1davanti a uno sfondo di zeri. Forse CellularAutomatonin futuro mostrerò alcune caratteristiche in più quando avrò più personaggi disponibili: può simulare CA in dimensioni più elevate, usando quartieri più grandi e con più di due stati.

ArrayPlotè un'altra bella utility per la stampa che traccia semplicemente un elenco 2D come una griglia di colori solidi che ne indica il valore. Nel caso più semplice, 0è mappend al bianco e 1al nero. Il risultato dello snippet è:

inserisci qui la descrizione dell'immagine

Lunghezza 43 frammento

HighlightGraph[graph,FindVertexCover@graph]

È passato un po 'di tempo da quando ho citato i grafici. Ci sono molti problemi teorici sui grafici comuni integrati in Mathematica, insieme a strumenti di visualizzazione gradevoli. Quanto sopra, per un dato motivo graph, troverà una copertura minima del vertice del grafico, quindi eseguirà il rendering del grafico con quei vertici evidenziati. Ad esempio, se graphè PetersenGraph[7,2]tornato dallo snippet 18, otteniamo:

inserisci qui la descrizione dell'immagine

Lunghezza 42 frammento

Animate[Plot[Sin[t-x],{x,0,10}], {t,0,10}]

È abbastanza semplice animare le cose in Mathematica (e non devono nemmeno essere immagini). Devi solo dargli l'espressione da valutare per ogni frame e un mucchio di parametri che dovrebbero variare sui frame. Quanto sopra semplicemente anima una trama di un'onda sinusoidale in movimento. L'animazione sarà simile alla seguente GIF:

inserisci qui la descrizione dell'immagine

Lunghezza 40 frammento

SortBy[PlanetData[#, "EscapeVelocity"]&]

SortByfa quello che ti aspetti: ordina un elenco in base ai valori ottenuti mappando una determinata funzione su ciascun elemento dell'elenco. Ma aspetta, la chiamata sopra non contiene affatto un elenco. Da Mathematica 10, esiste il supporto per il curry o l' applicazione parziale per alcune funzioni. Questa non è una caratteristica del linguaggio come nei linguaggi funzionali più puristi, ma è solo implementata manualmente per un sacco di funzioni in cui ciò è spesso utile. Significa che il frammento di cui sopra restituisce una nuova funzione, che accetta solo un elenco e quindi ordina per la funzione specificata. Questo può essere molto utile se questo ordinamento è qualcosa che userai più spesso in tutto il tuo codice.

E sì, c'è un'altra bella *Datafunzione: quanto sopra ordinerà i nomi dei pianeti in base alle velocità di fuga dei pianeti .

Lunghezza 39 frammento

f[1]=1
f[2]=1
f[n_]:=f[n]=f[n-1]+f[n-2]

Ho promesso di rendere la funzione di Fibonacci più efficiente. Questo frammento mostra quanto sia banale la memoria in Mathematica. Si noti che tutto ciò che è cambiato è un ulteriore f[n]=nella terza riga. Quindi, quando fviene richiesto un nuovo valore (diciamo f[3]), f[3]=f[3-1]+f[3-2]verrà valutato. Questo calcola f[2]+f[1], quindi lo assegna a f[3](con =, non con :=!) E alla fine restituisce il valore per la nostra chiamata iniziale. Quindi la chiamata a questa funzione aggiunge una nuova definizione per questo valore, che è ovviamente più specifica della regola generale - e quindi verrà utilizzata per tutte le chiamate future fcon quel valore.

Ricorda che l'altra funzione di Fibonacci ha impiegato 4 secondi per 30 valori? Ciò richiede 3 secondi per 300.000 valori.

Lunghezza 37 frammento

l//.{a___,x_,b___,x_,c___}:>{a,x,b,c}

Nell'ultimo frammento ho menzionato i modelli. Questi sono spesso usati nelle regole , che (tra le altre cose) possono essere usate per modificare strutture che corrispondono ad un certo schema. Quindi diamo un'occhiata a questo frammento.

{a___,x_,b___,x_,c___}:>{a,x,b,c}è una regola. x_con un singolo carattere di sottolineatura è un modello che si riferisce a un singolo valore arbitrario (che potrebbe essere esso stesso un elenco o simile). a___è un modello di sequenza (vedi anche frammento 15), che fa riferimento a una sequenza di 0 o più valori. Nota che sto usando x_due volte, il che significa che quelle due parti dell'elenco devono avere lo stesso valore. Quindi questo modello corrisponde a qualsiasi lista che contiene un valore due volte, chiama quell'elemento xe chiama le tre sequenze di tutto questi due elementi a, be c. Questo è sostituito da {a,x,b,c}- ovvero il secondo xviene eliminato.

Ora //.verrà applicata una regola fino a quando il modello non corrisponde più. Quindi lo snippet sopra rimuove tutti i duplicati da un elenco l. Tuttavia, è un po 'più potente di così: //.applica la regola a tutti i livelli. Pertanto, se lcontiene elenchi (a qualsiasi profondità), verranno rimossi anche i duplicati da tali elenchi.

Lunghezza 36 frammento

f[1]=1
f[2]=1
f[n_]:=f[n-1] + f[n-2]

È tempo di nuove funzionalità linguistiche! Mathematica ha alcune cose carine sulla definizione delle funzioni. Per cominciare, è possibile fornire più definizioni di funzioni per lo stesso nome, per numeri o tipi di argomenti diversi. È possibile utilizzare i modelli per descrivere a quali tipi di argomenti si applica una definizione. Inoltre, puoi anche aggiungere definizioni per singoli valori. Mathematica sceglierà quindi la definizione applicabile più specifica per qualsiasi chiamata di funzione e lascerà non valutate le chiamate non definite. Ciò consente (tra le altre cose) di scrivere funzioni ricorsive in un modo molto più naturale rispetto all'uso di un Ifinterruttore per il case base.

Un'altra cosa da notare sullo snippet sopra è che sto usando entrambi =e :=. La differenza è che il lato destro di =viene valutato solo una volta, al momento della definizione, mentre :=viene rivalutato ogni volta che si fa riferimento al lato sinistro. In effetti :=funziona anche quando si assegnano variabili, che avranno quindi un valore dinamico.

Quindi quanto sopra, ovviamente, è solo una funzione di Fibonacci. E molto inefficiente. Il calcolo dei primi 30 numeri richiede circa 4 secondi sulla mia macchina. Vedremo tra poco come possiamo migliorare le prestazioni senza nemmeno dover eliminare la definizione ricorsiva.

Lunghezza 35 frammento

StreamPlot[{x^2,y},{x,0,3},{y,0,3}]

Un diagramma molto pulito, che genera le linee di flusso di un campo vettoriale 2D. Questo è simile a un normale diagramma vettoriale, in quanto ogni freccia è tangente al campo vettoriale. Tuttavia, le frecce non sono posizionate su una griglia fissa ma unite in linee (le linee di flusso). Il significato di queste linee è che indicano la traiettoria di una particella (in un fluido, diciamo) se il campo vettoriale era un campo di velocità. L'input sopra appare come:

inserisci qui la descrizione dell'immagine

Lunghezza 34 frammento

Solve[a*x^4+b*x^3+c*x^2+d*x==0, x]

Mathematica può anche risolvere equazioni (o sistemi di equazioni, ma al momento abbiamo solo così tanti caratteri). Il risultato sarà, come al solito, simbolico.

{
  {x -> 0}, 
  {x -> -(b/(3 a)) - (2^(1/3) (-b^2 + 3 a c))/(3 a (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3)) + (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3)/(3 2^(1/3) a)}, 
  {x -> -(b/(3 a)) + ((1 + I Sqrt[3]) (-b^2 + 3 a c))/(3 2^(2/3) a (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3)) - ((1 - I Sqrt[3]) (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3))/(6 2^(1/3) a)}, 
  {x -> -(b/(3 a)) + ((1 - I Sqrt[3]) (-b^2 + 3 a c))/(3 2^(2/3) a (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3)) - ((1 + I Sqrt[3]) (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3))/( 6 2^(1/3) a)}
}

Tieni presente che le soluzioni sono fornite come regole , che probabilmente mostrerò più in dettaglio in alcuni frammenti futuri.

Lunghezza frammento 33

Dynamic@EdgeDetect@CurrentImage[]

Grazie a benwaffle per questa idea. CurrentImage[]carica l'immagine corrente della tua webcam. EdgeDetecttrasforma un'immagine in un'immagine in bianco e nero in cui i bordi sono bianchi e il resto è nero (vedere lo snippet 45 per un esempio). Il vero divertimento deriva dal fatto Dynamicche l'espressione si aggiorna da sola. Quindi il risultato di questo sarà effettivamente lo streaming di immagini dalla tua webcam e il rilevamento dei bordi dal vivo su di esse.

Lunghezza 32 frammento

NumberLinePlot[x^2<2^x,{x,-2,5}]

Un tipo piuttosto insolito di trama. Può tracciare un sacco di cose diverse lungo la linea numerica, come punti e intervalli. Puoi anche dargli una condizione e ti mostrerà la regione in cui quella condizione è vera:

inserisci qui la descrizione dell'immagine

La freccia indica che la regione continua all'infinito. I cerchi bianchi indicano che quelli sono intervalli aperti (i punti finali non fanno parte dell'intervallo). Per le estremità chiuse, i cerchi sarebbero riempiti.

Lunghezza frammento 28

Graphics3D@{Sphere[],Cone[]}

Tempo per un po 'di grafica 3D. Quanto sopra rende una sfera e un cono super-imposti con parametri predefiniti, che assomigliano a una sfera di cristallo:

inserisci qui la descrizione dell'immagine

In Mathematica, puoi effettivamente fare clic e trascinare questo piccolo widget per ruotarlo.

Lunghezza del frammento 27

CountryData["ITA", "Shape"]

Di più *Data! CountryDataè abbastanza pazzo. Ottenere la forma di un paese non è nemmeno la punta dell'iceberg. Ci sono così tanti dati sui paesi, probabilmente potresti scrivere un intero libro su questa funzione. Come ... c'è FemaleLiteracyFraction. È inoltre possibile eseguire query su tali dati per diversi punti nel tempo. Per un elenco completo, consultare il riferimento.

inserisci qui la descrizione dell'immagine

Lunghezza 26 frammento

PolarPlot[Sin[5θ],{θ,0,π}]

Tempo per una trama più interessante. PolarPlotè semplicemente un diagramma in coordinate polari. Invece di specificare y per una data x, si specifica un raggio r per un determinato angolo θ:

inserisci qui la descrizione dell'immagine

Lunghezza frammento 25

{{1,5},{2,3},{7,4}}.{8,9}

Finalmente abbiamo abbastanza personaggi per alcuni matematici vettoriali. Quanto sopra calcola la moltiplicazione della matrice di una matrice 2x3 e della riga 2-vettore:

{53, 43, 92}

Snippet di lunghezza 23

Rotate[Rectangle, Pi/2]

Eh. Hehe. Pensi di sapere cosa fa questo. Ma tu no. Rectangledi per sé è solo una funzione denominata. Per ottenere effettivamente un oggetto che rappresenta un rettangolo, dovresti chiamare quella funzione con alcuni parametri. Quindi cosa pensi che accada quando provi a ruotare Rectangle? Questo:

inserisci qui la descrizione dell'immagine

Lunghezza frammento 22

30~ElementData~"Color"

Un'altra delle *Datafunzioni integrate. Sì, per gli elementi chimici, non solo ottieni cose come il loro numero atomico, punto di fusione e nome ... puoi effettivamente ottenere il loro colore a temperatura ambiente. Quanto sopra dà il colore di zinco:

SlateGray

Lunghezza frammento 21

Integrate[E^(-x^2),x]

Abbiamo avuto differenziazione qualche tempo fa. Tempo per l'integrazione. Mathematica è in grado di gestire integrali sia definiti che indefiniti. In particolare, Integrateti fornirà una soluzione esatta e può gestire un sacco di integrali standard e tecniche di integrazione (per risultati numerici, c'è NIntegrate). Se conosci il tuo calcolo, avrai notato che l'integrale gaussiano sopra non ha effettivamente un integrale indefinito in forma chiusa ... a meno che tu non consideri la funzione di errore in forma chiusa, cioè. Mathematica restituisce:

1/2 Sqrt[π] Erf[x]

Lunghezza 20 frammento

"Sun"~StarData~"Age"

Torna ai dati integrati . Ci devono essere almeno due dozzine di *Datafunzioni per tutto ciò a cui potresti pensare. Ognuno di loro prende un identificatore per la cosa per cui desideri che i dati vengano recuperati e una proprietà (o un elenco di proprietà) da recuperare. Quanto sopra è solo uno dei più brevi si può ottenere con Sun, Stare Agetutto l'essere piuttosto breve, perché non vedevo l'ora di mostrare questa caratteristica.

Oh sì, e ho già detto che Mathematica (dal 9) supporta quantità con unità? (Ne parleremo più avanti). Quanto sopra valuta:

Quantity[4.57*10^9, "Years"]

che viene visualizzato come

inserisci qui la descrizione dell'immagine

Lunghezza 19 frammento

MandelbrotSetPlot[]

Sì ... funzione molto utile ... La uso sempre . (A volte, il loro desiderio di supportare tutto ciò che è probabilmente calcolabile potrebbe andare un po 'lontano ...)

Grafica Mathematica

A loro difesa, la funzione è un po 'più utile di così: puoi dargli una sezione particolare del grafico che vuoi tracciare.

Lunghezza 18 frammento

PetersenGraph[7,2]

Da Mathematica 8, capisce cosa sono i grafici, quindi viene fornito con ogni sorta di funzioni relative alla teoria dei grafi. E non era Mathematica se non includesse un sacco di built-in. Quanto sopra genera i dati del grafico per un grafico di Petersen generalizzato . Produce la struttura dati effettiva che può essere manipolata, ma Mathematica mostra immediatamente i dati del grafico ... graficamente:

Grafica Mathematica

Lunghezza frammento 17

Plot[x^x,{x,0,2}]

Finalmente abbastanza personaggi per fare qualche complotto. Quanto sopra è in realtà solo l'esempio più semplice di un diagramma unidimensionale. Prometto di sfoggiare trame più fresche in seguito

Grafica Mathematica

Lunghezza frammento 15

{##4,#,#2,#3}&

Questo mostra due delle funzionalità più potenti (e anche utili per il golf). L'intera cosa è una funzione pura senza nome , paragonabile a lambdas in Python o Procs in Ruby. Le funzioni pure sono semplicemente terminate da a &. Questo operatore ha una precedenza molto bassa, quindi di solito include quasi tutto ciò che ne rimane. Si fa riferimento agli argomenti di una funzione pura #, a volte seguiti da altre cose. Il primo argomento è #o #1, il secondo è #2e così via.

L'altra caratteristica è Sequences. Questi sono fondamentalmente come simboli in altre lingue. Una sequenza è come una lista senza la lista attorno ad essa - è letteralmente solo una sequenza di valori, che può essere usata in liste, argomenti di funzioni ecc. ##In particolare è una sequenza di tutti gli argomenti di pura funzione. ##2è una sequenza di tutti gli argomenti a partire dalla seconda. Quindi, se abbiamo chiamato la funzione sopra fe la abbiamo chiamata come

f[1,2,3,4,5]

Vorremmo

{4,5,1,2,3}

quindi la funzione ruota gli argomenti di input di 3 elementi a sinistra. Si noti che ##4a 4,5cui si fa riferimento sono stati appiattiti nell'elenco.

Lunghezza 12 frammento

D[x^y^x,x,y]

Differenziazione parziale. Ddifferenzierà la prima espressione in successione rispetto agli altri argomenti, dandoti come risultato un'espressione simbolica. Quindi quanto sopra è d² (x ^ y ^ x) / dxdy (dove i d sono parziali), che Mathematica riferisce di essere

x^y^x (y^(-1 + x) + y^(-1 + x) Log[x] + x y^(-1 + x) Log[x] Log[y]) + 
  x^(1 + y^x) y^(-1 + x) Log[x] (y^x/x + y^x Log[x] Log[y])

Lunghezza frammento 9

Exp[I*Pi]

Non abbiamo ancora fatto nessuna complessa aritmetica! Come puoi vedere, in πrealtà era solo un alias per Pi. Ad ogni modo, quanto sopra restituirà effettivamente il numero intero -1 .

Lunghezza 8 frammento

Sunset[]

Si. Parla di folli built-in. Senza parametri che in realtà ti danno un oggetto datetime del prossimo tramonto nella posizione corrente. Prende anche parametri per altre date, altre posizioni, ecc. Ecco come si presenta in questo momento:

inserisci qui la descrizione dell'immagine

Lunghezza frammento 7

9!/43!!

Questo frammento mostra alcune cose interessanti.

Mathematica non ha solo un operatore fattoriale incorporato !, ma ha anche un doppio fattoriale !!(che moltiplica ogni altro numero da ngiù a 1). Inoltre, supporta numeri interi di precisione arbitraria. Il valore 43!!verrà valutato esattamente, fino all'ultima cifra. Inoltre, anche i numeri razionali saranno valutati esattamente. Quindi, poiché sia ​​il numeratore che il denominatore all'interno sono numeri interi, Mathematica ridurrà il più possibile le frazioni e quindi ti presenterà

128/198893132162463319205625

Ovviamente, puoi usare i float quando vuoi, ma in generale, se il tuo input non contiene float, il risultato sarà esatto.

Lunghezza 4 frammento

Here

È giunto il momento di iniziare con la ricchezza di folli incorporati di Mathematica. Quanto sopra fa quello che dice sulla scatola e (per me) valuta GeoPosition[{51.51, -0.09}].

Lunghezza frammento 3

x-x

Giusto per mostrare il Factoid originale : quanto sopra funziona anche se xnon è stato ancora definito e si tradurrà effettivamente 0in quel caso.

Lunghezza 2 frammento

3x

Moltiplicazione tramite giustapposizione! Se è chiaro che un identificatore termina e ne inizia un altro, non è necessario uno *spazio bianco o addirittura per moltiplicarli insieme. Funziona praticamente con tutto, comprese stringhe e variabili che non hanno ancora valori. Molto comodo per giocare a golf. ;)

Lunghezza 1 frammento

π

Indovina un po ', sono Pi. E in effetti, non è una rappresentazione approssimativa in virgola mobile, è esattamente Pi - quindi tutti i tipi di funzioni complesse e trigonometriche in cui viene utilizzato produrranno risultati esatti se noti.

factoid

Mathematica può eseguire manipolazioni simboliche, quindi le variabili non hanno bisogno di valori per lavorare con esse.


19
Lo snippet 23 è piuttosto curioso. Se lo facessi Translate[Scale[Rectangle, 80], {0, 0, 100}], la grande parola Rectanglesembrerebbe fluttuare davanti al tuo monitor?
Calvin's Hobbies,

53
@ Calvin'sHobbies Ho appena provato ... ho scelto un sfortunato zoffset ... mi ha colpito in faccia.
Martin Ender,

45
Il sito web ufficiale di Mathematica dovrebbe assolutamente collegarsi a questo.
Caridorc,

7
@ durron597 Mantenendolo come un simbolo e rendendo tutte le tue funzioni trigonometriche e complesse consapevoli di cosa fare con un π.
Martin Ender,

16
Quando ho visto che il leggendario Martin Büttner aveva pubblicato una risposta a Mathematica, sapevo di non avere alcuna possibilità di vincere un concorso di popolarità. Signore, sei un vero mago.
Alex A.

187

Il famigerato linguaggio di programmazione di Shakespeare

Shakespeare Programming Language è stato creato nel 2001 da due studenti svedesi, Karl Hasselström e Jon Åslund, e combina, come proclamano gli autori ,

l'espressività di BASIC con la facilità d'uso del linguaggio assembly.

Le risposte vanno dall'alto verso il basso. Inoltre, è comune vedermi riferirsi a frammenti precedenti o precedenti.

( link per me stesso: modifica )

factoid:

Il codice di Shakespeare ricorda, come ci si aspetterebbe, un gioco di Shakespeare, in cui le variabili sono personaggi del gioco e il loro valore cambia quando vengono "insultati" o elogiati ".

Lunghezza frammento 1:

I

Il codice di Shakespeare è diviso in Atti, e gli atti sono essi stessi divisi in Scene, per causalità "da saltare a". Definire un atto Act Isignifica che sarà il primo pezzo del codice da eseguire, per esempio, ma non solo.

Snippet di lunghezza 2:

as

Utilizzato in un confronto tra due "caratteri".

Snippet di lunghezza 3:

day

Ormai, potresti avere la sensazione che SPL sia molto prolisso. E strano. E non hai ancora visto niente. day, in SPL, è 1. Vengono considerati tutti i nomi "positivi" e "neutri" 1, così come tutti quelli "negativi" -1.

Snippet di lunghezza 4:

rich

Che cosa è rich? Un aggettivo. In SPL, gli aggettivi fanno moltiplicare per due il valore del nome a cui sono associati. Vedi l'implementazione sullo snippet 14.

Snippet di lunghezza 5:

Act I

Implementazione del primo frammento. A tutti gli atti può essere assegnato un titolo, ad esempio Act I: Hamlet must die!, poiché tutto ciò che segue il numero romano viene ignorato dal parser.

Snippet di lunghezza 6:

better

Ogni lingua ha condizioni e SPL non fa eccezione. Ad eccezione del fatto che questo è un linguaggio con una sintassi lunga (e l'ho già detto strano?), Le sue dichiarazioni condizionali saranno lunghe. Chiedere a Ofelia Juliet Am I better than you?è come avere la if (Ophelia > Juliet)maggior parte delle lingue "normali". E, naturalmente, puoi chiedere il contrario: Am I not better than you?è l'equivalente di if (Ophelia < Juliet). E puoi già indovinare come =viene tradotto in SPL: as good as- utilizzo dello snippet di codice 2.

Tuttavia, good/betternon è l'unico modo per fare confronti in questa lingua shakesperiana, puoi usare qualsiasi aggettivo. Lo stesso principio dello snippet 3 si applica anche qui, con aggettivi "positivi" che hanno il valore >, mentre quelli "negativi" significano <.

Lunghezza frammento 7:

Juliet:

Questa è l'invocazione di una variabile; dopo questo, le sue istruzioni / dichiarazioni / qualunque cosa seguiranno.

Una limitazione di SPL è che ha un numero limitato di variabili: Romeo, Giulietta, Amleto, Ofelia, MacBeth e così via sono alcuni esempi di "personaggi" che appariranno in un programma shakesperiano.

Lunghezza frammento 8:

[Exeunt]

[Exeunt]viene posizionato quando tutti i "personaggi" escono dallo "stage". Spero di poter approfondire un po 'più avanti l'interazione tra i personaggi. Generalmente è l'ultima istruzione di qualsiasi programma SPL, sebbene [Exeunt]non sia specificamente il "carattere" terminale della lingua. Per un altro esempio, vedi lo snippet 27.

Snippet di lunghezza 9:

as bad as

Nove personaggi solo per rappresentare un semplice =- usando lo snippet 2. Ho già detto che SPL è strano? Vedi lo snippet 30 per esempi. (e sì, c'è più di un modo per produrlo)

Snippet di lunghezza 10:

difference

Un modo elegante di rappresentare -, una sottrazione. Puoi eseguire operazioni matematiche su SPL, anche se probabilmente avrai bisogno di un'intera giornata per farlo bene.

Factoid (dato che sono riuscito in qualche modo a raggiungere dieci frammenti di codice, facciamo una pausa e facciamo un altro factoid su SPL)

Se vuoi eseguire il tuo codice shakesperiano in tutto il suo splendore, c'è questo sito - lo sto ancora testando, dal momento che l'ho scoperto nemmeno cinque minuti fa. C'è anche un modo per tradurlo in C usando un traduttore .

Un altro sito per l'esecuzione del codice SPL è questo che funziona traducendo internamente il codice SPL in un altro linguaggio esoterico: Oracle PL / SQL.

Lunghezza frammento 11:

[Exit Romeo]

Sì! Finalmente posso parlare dell'interazione tra i personaggi! Per cambiare il suo valore o interagire con gli altri, un "personaggio" deve essere sul palco - entrare con [Enter Romeo]. Se un personaggio è indirizzato ma non è presente, c'è un errore di runtime e il programma si arresta. Perché, in SPL, il valore delle variabili è impostato dalla quantità di nomi con cui sono elogiati - o insultati - dagli altri personaggi sul palco. Sento che dovrei fare un esempio per chiarire un po 'di confusione che la mia spiegazione zoppa può creare, ma forse è meglio ritardare qualche frammento.

Lunghezza frammento 12:

Remember me.

SPL è piuttosto "semplice", va bene - ma ha pile! Quando, per esempio, Romeo dice a Juliet di "ricordarlo", in realtà sta dicendo alla sua amata di spingere il valore di Romeo nel suo stack. Interrompere il valore viene fatto con Recall your happy childhood!, o, o Recall your love for me, fondamentalmente, qualsiasi frase che inizia con Recall- il resto è solo una svolta artistica, come lo snippet 22.

Lunghezza 13 frammento

Let us return

Il modo shakesperiano di avere un goto. Ed è qui che gli Atti e le Scene sono utili. Se Romeo lo dice a Juliet we shall return to Act II(sì, ancora, ci sono molti modi per scriverlo), il programma passerà a quella parte specifica del codice. È anche visto accanto a dichiarazioni condizionali.

Lunghezza frammento 14

my little pony

Sì, era una serie negli anni '80. Ecco qui 2*1. Perché? Perché a ponyè un nome (in qualche modo) positivo ed littleè un aggettivo. Quindi, ricordando i frammenti 3 e 4, abbiamo little = "2 *"e pony = "1".

Lunghezza frammento 15

Speak thy mind!

In un programma SPL, vedrai questo (o Speak your mind!, che è lo stesso) molto . Questo in pratica genera il valore di ciascun "carattere" in cifre, lettere o quant'altro, a seconda del set di caratteri utilizzato dal computer. C'è anche Open your mind.quello che fa quasi la stessa cosa, anche se emette solo in forma numerica.

Lunghezza 16 frammento

You are nothing!

Quando qualcuno ti dice questo nella vita reale, ti sentirai depresso. Quando Ofelia lo dice ad Amleto nella programmazione shakespeariana, Amleto si sente senza valore. Cosa significa questo? Quello Hamlet = 0.

Lunghezza frammento 17

Ophelia, a wench.

In una sceneggiatura, prima che inizi la riproduzione effettiva, i personaggi devono essere presentati. Nella maggior parte dei linguaggi di programmazione, anche le variabili devono essere dichiarate prima dell'uso. Visto che SPL è un linguaggio di programmazione che ricorda una sceneggiatura, ecco come dichiarare le sue variabili, affermando quali sono quelle che appaiono durante il programma.

Ma cosa significa "una donna"? Significa che è un nome di tipo di dati specifico (e interessante)? Beh ... odio deluderti, ma non significa nulla: tutto dopo la virgola viene ignorato dal parser, il che significa che puoi mettere lì la dritta più oltraggiosa che ti viene in mente.

Lunghezza 18 frammento

lying sorry coward

-4per tutte le creature terrene. Perché? A causa 2*2*(-1) = -4.

Lunghezza 19 frammento

Romeo:
 Remember me.

Alla fine!!! Posso finalmente emettere un'istruzione di sintassi completamente corretta (anche se breve)! È così che usi lo snippet 12: prima dichiari chi sta parlando, poi nella riga successiva scrivi il "dialogo". Normalmente, solo due "personaggi" sono sul palco, per evitare di rendere il parser triste e confuso. Quando hai bisogno di un altro "personaggio", ne prendi uno dal palco e lo sostituisci con quello nuovo.

Lunghezza 20 frammento

cube of thy codpiece

Volevo elaborare un po 'di più per questo, ma, a dire la verità, le cose che mi vengono in mente sono ancora troppo brevi per questo frammento. E quindi ti porto questo, che finisce per essere -1- perché (-1) 3 = -1 (ed codpieceè un sostantivo "negativo", dato che sono scomodi e tutti). SPL capisce alcune operazioni aritmetiche più elaborati come un po ' elevamento a potenza e radici quadrate.

Factoid (ancora un altro, dal momento che abbiamo raggiunto un altro traguardo)

Il "Hello World Program" di Shakesperian ha 89 righe e più di 2400 caratteri, come mostrato qui .

Lunghezza frammento 21

Listen to your heart.

Nel frammento 15 hai emesso qualcosa; qui, inserisci un numero per il programma. Se vuoi inserire un personaggio, userai Open your mind.invece. E, inutile dirlo, questo valore verrà memorizzato nel "personaggio" con cui si parla.

Lunghezza frammento 22

Recall your childhood!

Con questo, l'interruzione di un numero intero da uno stack viene eseguita, come spiegato nello snippet 12. Quando, per esempio, Ofelia dice ad Amleto la frase sopra menzionata, fa sì che Amleto prenda un numero intero dal suo stack e assuma quel valore.

Ovviamente, finché la parola recallinizia la frase, puoi riempire il resto con qualsiasi cosa desideri la tua mente shakesperiana creativa.

Snippet di lunghezza 23

Are you better than me?

Implementazione dello snippet 6. Quando un "personaggio" pone una domanda del genere a un altro, ciò che sta facendo equivale a if (x > y)linguaggi di programmazione più comuni. Il seguito di queste istruzioni deve essere ritardato fino a quando non avrò più caratteri disponibili.

Lunghezza 24 frammento

[Enter Romeo and Juliet]

Sì, i "caratteri" possono entrare in coppia. Non è necessario che un "personaggio" entri nel palco, seguito da un altro.

Lunghezza frammento 25

remainder of the quotient

25 caratteri solo per scrivere a %. 25 personaggi per avere il resto di una divisione. E usarlo? Bene, questo è ancora più grande - vedi frammento 75.

Lunghezza 26 frammento

Let us return to scene II.

Eccolo, a gotoin SPL, che funziona come ci si aspetterebbe in un linguaggio di programmazione. Una cosa è: puoi saltare tra le scene nello stesso atto e tra gli atti; ma non puoi saltare tra le scene in diversi atti.

Lunghezza del frammento 27

[Exeunt Ophelia and Hamlet]

Quando più di un "personaggio" lascia il palco, invece di Exit, e mantenendo la tradizione con la natura teatrale di SPL, viene usata la parola latina "Exeunt". A volte può essere sostituito solo dallo snippet 8.

Lunghezza frammento 28

Scene I: Ophelia's flattery.

Dichiarare una scena. Come puoi già aspettarti se hai affrontato me, l'importante è il Scene I, il resto è lanugine artistica.

Sono stati realizzati alcuni compilatori (come questo che compila da SPL a C, scritti in Python ) che invece si riferiscono al testo dopo la numerazione dell'Atto / della Scena. Mentre più logico (dopo tutto, durante una commedia, con i personaggi che dicono linee come "torniamo all'Atto I" può essere considerato sciocco), mi sto attenendo al modo originale.

Lunghezza frammento 29

You pretty little warm thing!

Sì, un'altra costante (dal momento che abbiamo bisogno di più personaggi per eseguire operazioni aritmetiche). Questo è uguale a 8, perché 2*2*2*1 = 8.

Lunghezza 30 frammento

You are as cowardly as Hamlet!

Dire questo, ad esempio, a Romeo, significa che Romeo = Hamlet. Come lo snippet 9.

Factoid (sì, un altro punto di riferimento raggiunto!)

Questo linguaggio è stato creato per un incarico in un corso di analisi della sintassi, pertanto gli autori non hanno creato alcun compilatore SPL. Inoltre: sembra che gli autori di SPL abbiano reciso i loro legami con la loro creazione, dal momento che nulla sembra essere stato modificato nella lingua dal 2001 ...

Lunghezza frammento 31

Am I as horrid as a flirt-gill?

Sì, lo so, è un po 'ripetendo lo snippet 23, sebbene, qui, stiamo confrontando il "personaggio" che parla con un "flirt-gill" (di, se preferisci, if (Ophelia == -1)). La cosa è...

Lunghezza 32 frammento

If so, let us return to scene I.

... ora posso presentare thenSPL, il condizionale jump-to e il modo shakesperiano di implementare i loop. Ad esempio, puoi fare in modo che Romeo assuma il valore 0, aumenti il ​​suo valore mentre fa qualche altra attività e si ferma quando raggiunge i 10, procedendo successivamente con il programma.

Lunghezza frammento 33

If not, let us return to scene I.

Solo un promemoria che, invece, possiamo invece procedere ad un'altra scena se la condizione per cui abbiamo testato è falsa .

Lunghezza 34 frammento

Open your mind! Remember yourself.

Due istruzioni di fila, yippie! Il primo legge un personaggio, il secondo lo inserisce nello stack di memoria dell'altro personaggio.

Lunghezza 35 frammento

Act I: Death!

Scene I: Oh, shit.

Il modo corretto di dichiarare un atto e una scena. Aggiungi poltiglia artistica con gusto.

Lunghezza 36 frammento

Thou art as sweet as a summer's day!

Un altro modo di dire che il "personaggio" con cui viene parlato riceverà il valore 1, perché le giornate estive sono piacevoli e piacevoli.

Lunghezza 37 frammento

Art thou more cunning than the Ghost?

Ophelia questa domanda ai mezzi Hamlet, traducendo questo per un linguaggio di programmazione meno leggibile, if (Hamlet > the Ghost). È di nuovo lo snippet 23, sì - ma ti mostra che non è necessario chiedere ai "personaggi" se sono migliori l'uno dell'altro: anche qualsiasi altra domanda funzionerà.

Lunghezza 38 frammento

[Enter the Ghost, Romeo and the Ghost]

Sì, sto chiamando un "personaggio" due volte, perché volevo che il programma mi desse un errore. Chiamare un "personaggio" che è già sul palco, o dire a uno che è assente di uscire, causerà un grande dolore al parser / compilatore.

Lunghezza 39 frammento

the sum of a fat lazy pig and yourself!

L'istruzione completa ha un aspetto migliore di questo, te lo darò, ma ... ecco la nostra prima operazione aritmetica! Cosa significa tutto, in realtà? Bene, pigè un animale sporco (anche se gustoso), quindi equivale a -1, ha due aggettivi, che significa fat lazy piguguale 2*2*(-1) = -4. Ma che dire yourself? È un pronome riflessivo, non un nome né un aggettivo. Bene, ricorda che SPL si basa su dialoghi tra "personaggi"; quindi, si yourselfriferisce all'altro "personaggio" sul palco. Quindi, arriviamo alla fine e scopriamo che "la somma di un grasso maiale pigro e te stesso" è, in realtà -4 + x,.

Lunghezza 40 frammento

the sum of a squirrel and a white horse.

Sì, un'altra somma, ma questa è più semplice dello snippet 39. Questo è semplicemente 1 + 2- 3, se la mia matematica è corretta.

Factoid (ancora con me dopo questi quaranta frammenti di lanugine artistica? Ti meriti un premio.)

SPL, nella sua versione 1.2.1, può essere scaricato qui .

Lunghezza del frammento 41

Juliet:
 Speak thy mind!

[Exit Romeo]

A volte, i "personaggi" vengono chiamati sul palco solo per cambiare il loro valore - che, in una vera commedia, sarebbe qualcosa di piuttosto bizzarro. Comunque, qui, Juliet fa stampare alla sua amata Romeo il suo valore memorizzato, dopo di che esce dal palco.

Lunghezza 42 frammento

Speak YOUR mind! You are as bad as Hamlet!

Ancora una volta due istruzioni in una riga (possiamo avere più, ma la lunghezza del frammento non lo consente ancora); qui abbiamo un "personaggio" che dice a un altro di produrre il suo valore e assumere qualunque valore abbia Amleto. Confondere? Mayhap.

Lunghezza 43 frammento

Am I as horrid as a half-witted flirt-gill?

Giulietta che chiede questo non significa che abbia poca stima (anche se potrebbe accadere nella vita reale); è semplicemente un altro if, come i frammenti 23 e 37. Oh, quasi dimenticavo: questo si traduce in if (Juliet == -2).

Lunghezza 44 frammento

You are as evil as the square root of Romeo!

Sì, le radici quadrate sono cattive, non lo sapevi? Ad ogni modo, questa istruzione è abbastanza semplice da capire cosa fa: attribuisce il "carattere" che viene pronunciato al valore della radice quadrata del valore memorizzato in Romeo.

Lunghezza frammento 45

Hamlet:
 Art thou more cunning than the Ghost?

Snippet 37 correttamente scritto con il personaggio che sta parlando la linea.

Lunghezza 46 frammento

the product of a rural town and my rich purse.

Va bene ... comunque, SPL potrebbe essere l'unica lingua al mondo che ti consente di moltiplicare le città con le borse. Ciò significa (2*1)*(2*1)che, se non sbaglio, è uguale a 4.

Lunghezza frammento 47

Romeo:
 Speak your mind.

Juliet:
 Speak YOUR mind!

Ti do questo: potrebbe essere uno dei dialoghi più bizzarri della storia. Ma è quello che ottieni quando scegli una strana lingua da mostrare. Romeo e Giulietta si dicono l'un l'altro, in breve, di esprimere i loro valori.

Lunghezza frammento 48

You lying fatherless useless half-witted coward!

Traducendo direttamente, 2*2*2*2*(-1). -16, giusto?

Lunghezza frammento 49

Scene V: Closure.

Hamlet:
 Speak your mind!

[Exeunt]

Un esempio di come terminare un programma in SPL. Puoi dichiarare una scena appositamente per essa (anche se non è richiesta), quindi Amleto chiede a un altro "personaggio" di emetterne il valore, quindi tutti escono dal palco. E sì, è necessario che tutti scendano dal palco.

Lunghezza frammento 50

Othello, a young squire.
Lady Macbeth, an old fart.

Più presentazione "carattere", prima delle istruzioni adeguate. Come sempre, l'unica cosa che conta per il compilatore è Othelloe Lady Macbeth, quindi il resto della linea è in palio ...

Ancora una cosa: i "personaggi" non devono essere collegati tra loro per apparire in un programma SPL - quindi puoi avere Romeo, Otello e Amleto nella stessa commedia.

Factoid (mezzo secolo di queste cose? Accidenti! Dopo questo penso che odierò William Shakespeare ...)

Il traduttore da SPL a C, menzionato qualche tempo fa e sviluppato dai creatori di SPL, era basato su Flex e Bison .

Snippet di lunghezza 51

Othello:
 Recall your great dreams. Speak your mind!

(Così stufo di Romeo, Giulietta e Amleto ... portiamo Otello, per cambiare!)

Recall, come puoi immaginare, è la chiave qui. Il "personaggio" che Otello sta affrontando prenderà un valore dal suo stack, assumerà quel valore e, successivamente, lo produrrà.

Lunghezza frammento 52

Thou art as pretty as the sum of thyself and my dog!

Un'altra somma. Sbadiglio. Supponendo che questo sia indirizzato ad Amleto, significa che Hamlet = Hamlet + 1. Or Hamlet += 1. Or Hamlet++.

Snippet di lunghezza 53

Romeo:
 You are as vile as the sum of me and yourself!

Ah, sì, qualcosa che ho dimenticato di menzionare prima: i "personaggi" parlanti possono menzionarsi sulla propria linea.

Lunghezza 54 frammento

Juliet:
 Is the sum of Romeo and me as good as nothing?

Un altro esempio dello snippet precedente, incluso in una condizione. Quindi quello che abbiamo qui è if (Romeo + Juliet == 0).

Lunghezza frammento 55

Juliet:
 You are as lovely as the sweetest reddest rose.

Quindi, qui, Juliet sta lodando il "personaggio" con cui sta parlando (supponiamo che sia Romeo, per l'amor di Shakespeare), dichiarando che lui / lei è 4. Sì, un'altra assegnazione di valori.

Lunghezza 56 frammento

Othello:
 You lying fatherless useless half-witted coward!

Snippet 48 correttamente eseguito, con un "personaggio". Se sei troppo pigro per scorrere verso l'alto (come sarei io), questo significa che quello che viene insultato riceve il valore -16.

Lunghezza 57 frammento

Romeo:
 If not, let us return to Act I. Recall thy riches!

Ho già spiegato come funzionano le condizioni su SPL su base generale; tuttavia, è necessaria un'analisi più approfondita. Non abbiamo elsequi: per esempio, in questo esempio, se la condizione non fosse riuscita, il programma tornerebbe all'Atto I; ma se fosse vero, continuerebbe con l'istruzione successiva, che è un Recall- un pop dallo stack, cioè.

Lunghezza frammento 58

Romeo:
 You are as disgusting as the square root of Juliet!

Afferrare lo snippet 44 e presentare come devono essere presentate le istruzioni. Se questo fosse un dialogo tra Romeo e Otello, allora potremmo tradurlo in Java come Othello = Math.sqrt(Juliet).

Lunghezza 59 frammento

Othello:
 You are as vile as the sum of yourself and a toad!

OK, se Otello stesse parlando con Romeo, ciò equivarrebbe a Romeo+(-1); Romeo--, in breve. Abbastanza semplice, vero? Questo è SPL per te.

Lunghezza 60 frammento

Is the quotient between the Ghost and me as good as nothing?

In breve, if (The Ghost/Hamlet == 0)supponendo che l'io appartenga ad Amleto.

Lunghezza frammento 61

Thou art as handsome as the sum of yourself and my chihuahua!

Dopo aver rimosso gli strati e gli strati di parole e insulti, noti che SPL è praticamente una cosa di base, senza funzioni e cose interessanti. Quindi abbiamo un sacco di funzioni aritmetiche sul corpo del programma. Quindi, se questo fosse indirizzato a Giulietta, sarebbe equivalente a Juliet++.

Lunghezza frammento 62

twice the difference between a mistletoe and a oozing blister!

Sì, sì, più operazioni aritmetiche. All'incirca, questi 62 byte di SPL possono essere tradotti in 2*(1-2*(-1)). Sarebbe un linguaggio da golf davvero fantastico, vero? Giusto.

Lunghezza frammento 63

You lying stupid fatherless rotten stinking half-witted coward!

Snippet 48 emesso -16, questo è pari a -64: 2*2*2*2*2*2*(-1).

Lunghezza 64 frammento

your coward sorry little stuffed misused dusty oozing rotten sky

Da quello che ho capito di SPL, questo è perfettamente legittimo. Hai un sacco di aggettivi offensivi che procede un nome "positivo". Dal momento che gli aggettivi non hanno alcuna distinzione speciale se sono negativi o meno (il loro unico valore è moltiplicare il numero alla loro destra per due), possiamo avere frasi completamente stupide come questa. Ciò equivale a 256. Perché 2*2*2*2*2*2*2*2*1=256.

Lunghezza frammento 65

You are nothing! You are as vile as the sum of thyself and a pig.

Hmm, così tanto odio, vero? Quindi, ciò che abbiamo qui è equivalente a y=0; y=y+(-1);Probabilmente avrebbe potuto essere "giocato a golf" You are a pig!, ma eh.

Lunghezza frammento 66

You are as beautiful as the difference between Juliet and thyself.

Quindi, sottrarre Juliet da te stesso, eh? Questo è abbastanza semplice da decodificare: Romeo=Juliet-Romeo;supponendo che si tratti di Romeo.

Lunghezza 67 frammento

Juliet:
 Am I better than you?

Romeo:
 If so, let us proceed to Act V.

Come funzionano la maggior parte delle condizioni su SPL. Provi l'espressione e, se è vero (o no: vedi snippet 33), salti a un'altra parte del programma; altrimenti, passerai alla frase successiva.

Lunghezza frammento 68

The Ghost:
 You are as small as the sum of yourself and a stone wall!

Sì, sì, sto diventando un po 'monotono. Ma SPL è così. Come ho affermato un po 'prima, le sue espressioni sono un misto di operazioni aritmetiche. Quindi, questo è ancora un altro incremento - poiché stone wallè un "nome" neutrale.

Snippet di lunghezza 69

Thou art as disgusting as the difference between Othello and thyself!

Invece di una somma, abbiamo la sottrazione tra due personaggi, Otello e chiunque si parli.

Lunghezza frammento 70

You are as handsome as the sum of Romeo and his black lazy squirrel!

Torniamo alle aggiunte, sì - chiamami formulaico, eh. Lo traduciamo in Romeo + 2*2*1.

Lunghezza frammento 71

Scene I: Dialogues.

[Enter Juliet]

Othello:
 Speak your mind!

[Exit Juliet]

Una scena può essere piccola come questa. Julietentra sul palco, Otello le dice di produrre il suo valore memorizzato, quindi scende di nuovo dal palco.

Lunghezza 72 frammento

twice the difference between a mistletoe and an oozing infected blister!

Un'altra operazione aritmetica - perché SPL è pieno di loro. Possiamo tradurre questo in 2*(1-2*2*(-1)).

Snippet di lunghezza 73

You are nothing! Remember me. Recall your unhappy story! Speak your mind!

Quattro istruzioni di fila ?! Sono abbastanza orgoglioso di me stesso, in realtà. Comunque, supponiamo che questo sia un dialogo tra Romeo e Giulietta (e sta parlando): questo significa che il valore di Giulietta inizia da 0; quindi, Juliet spingerà il valore di Romeo nella sua memoria, lo aprirà e lo produrrà nella sua forma inserita. Semplice vero?

Lunghezza frammento 74

You are as sweet as the sum of the sum of Romeo and his horse and his cat!

Sì, sì, esempio noioso, lo so. Ma questo è X = (Romeo + 1) + 1.

Lunghezza frammento 75

Is the remainder of the quotient between Othello and me as good as nothing?

Bene, questo è piuttosto semplice. Se le tue abilità di decodifica non funzionano correttamente, si traduce in if (Othello % X == 0).

Lunghezza 76 frammento

Thou art as rich as the sum of thyself and my dog! Let us return to scene I.

Il salto dallo snippet 26 con un'espressione prima di esso. A gotosu SPL non si trova sempre vicino a una condizione, può essere così - e, naturalmente, questo tipo di gotosarà sempre trovato alla fine di un atto o di una scena, poiché le istruzioni dopo non verranno mai compilate / eseguite. La prima istruzione è piuttosto semplice: x=x+1.

Lunghezza 77 frammento

[Exit Hamlet]

[Enter Romeo]

Juliet:
 Open your heart.

[Exit Juliet]

[Enter Hamlet]

Quindi, abbiamo Juliet e Amleto sul palco; ma abbiamo bisogno del valore di Romeo. Quindi, al fine di risparmiare il compilatore da un brutto mal di testa, in primo luogo rimuoviamo Amleto dal palcoscenico (anche se potrebbe essere stato Juliet a salire), diciamo a Romeo di salire sul palco, Juliet gli dà un'istruzione per produrre un numero (vedi la spiegazione dello snippet 21), poi Romeo esce dal palco e Amleto ritorna. Abbastanza semplice e diretto.

Lunghezza frammento 78

The Ghost:
 Speak thy mind.

Lady Macbeth:
 Listen to thy heart! Remember thyself.

Quindi, The Ghost (il defunto padre di Amleto) sta dicendo a Lady Macbeth di produrre il suo valore, mentre ordina a The Ghost di leggere un numero e inserirlo nel suo stack.


32
Questo è incredibilmente interessante e la tua immagine del profilo si adatta perfettamente, sembra esattamente come immagino che sarebbe un programmatore SPL.
overactor

3
@overactor Non so se essere insultato o orgoglioso di essere paragonato a un Gumby. ^ _ ^
Rodolfo Dias il

9
Stranamente questo NON è l'esempio più oscuro da leggere qui ... e sembra essere legato per "il meno pratico".
HRRambler,

6
ROFL ecco +1 per aiutarti lungo la strada - Ancora una volta fino alla breccia Rodolfo!
HRRambler

3
@RodolfoDias Puoi iniziare. Sto aspettando di vederli. Hai 120 voti positivi.
ghosts_in_the_code

176

Piet

factoid

Piet è un linguaggio di programmazione in cui il codice sorgente è costituito da immagini. Il flusso del programma inizia con il pixel in alto a sinistra e si sposta attorno all'immagine tra pixel e gruppi di pixel fino al termine.

Per leggibilità, i programmi Piet sono comunemente visualizzati in una versione ingrandita. In tal caso, il termine codelviene utilizzato per descrivere un gruppo di pixel dello stesso colore che corrispondono a un singolo pixel nell'immagine di origine.

Per questa sfida, poiché Piet non utilizza i caratteri, verrà utilizzato un codice per voto per i programmi di esempio.

1 Codel

1 Codel

Questo è un programma valido, non fa nulla e termina. Il flusso di controllo inizia nel pixel in alto a sinistra (solo) e non ha via d'uscita, il che termina il programma.

In questo caso il pixel può essere di qualsiasi colore per lo stesso effetto.

2 codici

2 codici

Questo leggerà continuamente i caratteri da stdin e manterrà un totale parziale dei loro valori unicode (anche se non viene fatto nulla con questo totale e non viene visualizzato).

Il flusso di Progam si muove avanti e indietro tra i 2 codici, poiché l'unica via di uscita da ciascuno è nell'altra. I comandi nel piet vengono eseguiti dal movimento da un codice o regione in un altro, a seconda della differenza di tonalità e leggerezza delle 2 regioni. Il inputè il comando lo spostamento a destra da sinistra a e poi la addè da destra a sinistra. Al primo addcomando, non accadrà nulla poiché nello stack è presente un solo valore e la specifica dice che i comandi senza valori sufficienti disponibili vengono ignorati.

Questo programma è un ciclo che non finirà mai, poiché la maggior parte dei programmi piet avrà dimensioni estremamente ridotte, dal momento che ci vogliono almeno alcuni codici per "intercettare" correttamente il flusso del programma e terminarlo.

3 codici

3 codici

Questo è un programma base di tipo eco, leggerà un carattere alla volta da stdin e lo stamperà su stdout.

Ancora una volta questo è un ciclo infinito. Il programma inizia viaggiando da sinistra a destra, il che fa inputpoi output. Il programma continuerà a fluire nella stessa direzione ogni volta che può. Al codice verde chiaro l'unica uscita è iniziare a tornare indietro nell'altro modo. Quando si viaggia da destra a sinistra, tenta di eseguire subtracte addcomandi, ma lo stack è vuoto, quindi diventano non operativi.

4 codici

4 codici

Stampa da 2 a stdout a tempo indeterminato.

Funzionalmente non è un programma particolarmente interessante, ma ora che finalmente abbiamo un numero composto di codici possiamo mostrare un flusso leggermente più avanzato rispetto a sinistra-destra. Quando il flusso del programma tenta di uscire da un codice, prova prima la direzione corrente. Se non è in grado (in questo caso a causa del bordo dell'immagine) ruota di 90 gradi in senso orario e tenta di uscire di nuovo. In questo caso, il programma gira in senso orario 1 codice alla volta, inserendo push1 nello stack due volte, inserendo addquelli insieme, quindi outputil risultato.

5 codici

5 codici

Legge ripetutamente un carattere alla volta dallo stdin e tiene traccia della somma dei loro valori unicode.

Questa è essenzialmente la stessa funzionalità della versione 2-codel, ma questa sfida è mostrare il linguaggio e una delle cose più belle di Piet è come puoi avere immagini di aspetto diverso che fanno la stessa cosa.

Qui vediamo per la prima volta il codice bianco, che consente al flusso del programma di scorrere attraverso di esso senza eseguire le istruzioni. I codici magenta e blu fanno tutto il lavoro qui. Viaggiare dal blu al rosso non fa nulla perché attraversa il codice bianco nel mezzo. I 2 rossi solo pushil numero 1 sulla pila e popindietreggiano mentre viaggia da sinistra a destra, poi da destra a sinistra attraverso di loro, quindi attraverso il codice bianco, quindi non viene eseguita alcuna istruzione.

6 codici

6 codici

Ancora una volta, ripetendo le funzionalità precedenti con un aspetto diverso. Questo è un altro programma di eco che legge un personaggio alla volta da stdin a stdout.

Qui vediamo il nostro primo codel nero. Il flusso del programma non può inserire un codice nero, quindi dal codice magenta chiaro in alto a destra il programma non si chiuderà a destra a causa del bordo dell'immagine, non riuscirà a uscire in basso a causa del codice nero e rimbalzerà a sinistra nel codice rosso . I codici blu e verde sono puramente decorativi, il programma non li inserirà mai.

7 codici

7 codici

Ancora un altro programma di eco con un aspetto diverso.

Qui vediamo i nostri primi blocchi di codice più grandi della dimensione 1. Nel piet, qualsiasi blocco contiguo di codici dello stesso colore viene trattato come un singolo blocco. La dimensione del blocco non ha importanza se non quando si esegue l' pushistruzione, quindi questo programma viene trattato esattamente come la versione a 3 codici, tranne che con colori diversi.

8 codici

8 codici

Legge un numero da stdin e invia il quadrato a stdout, ripetutamente.

Il flusso di controllo è un modello di base in senso orario, proprio come nel programma a 4 codici. Partendo dall'alto a sinistra, le operazioni in ordine sono input, duplicate(spinge una copia in più del valore superiore dello stack sulla pila), multiply, output. Quindi è pushil valore 1 nella pila, scorre attraverso il bianco in modo che non venga eseguito alcun comando, quindi si popallontana da quella pila quando si sposta dal codice in basso a sinistra a in alto a sinistra. Questo lo riporta all'inizio del programma con uno stack vuoto e si ripete.

9 codici

9 codici

Aggiunge 1 + 2 = 3, quindi termina.

Ora che abbiamo un programma con più di 2 codici in entrambe le dimensioni, possiamo finalmente impostare una regione che intrappolerà il programma e lo terminerà invece di eseguire il ciclo per sempre. La prima operazione che si sposta dal codice rosso alla regione rosso scuro è una pushdi 1, quindi il programma ruota e scorre verso il basso nel codice rosso chiaro al centro ed è pushun valore di 2. Esegue il flusso dal rosso chiaro al giallo chiaro addun'operazione. La barra gialla chiara in basso fa terminare il programma poiché non è possibile che fuoriesca poiché tutti gli angoli sono bloccati.


I programmi 1 e 2 stanno rapidamente diventando brutti e poco interessanti, quindi da questo punto in poi mi concentrerò su numeri che consentono almeno alcuni codici in ciascuna direzione.

12 codici

12 codici

Finalmente un programma che fa qualcosa che potrebbe essere considerato utile (anche se è ancora un po 'lungo). Legge 2 numeri dallo stdin in sequenza, quindi emette la loro somma e lo fa ripetutamente.

Il programma scorre da sinistra a destra attraverso le 4 barre colorate che compongono 2 inputsseguite da un addcomando. Quindi si sposta nel codice in basso a destra ed esegue un output, quindi torna a sinistra attraverso la regione bianca.

Questo avrebbe potuto essere fatto in 8 codici, ma dato che abbiamo lo spazio extra possiamo fare qualcosa che sia un po 'ispirato da un vecchio display TV senza segnale.

15 codici

15 codici

Legge un numero dallo stdin e genera il suo 'quadrato.

Questo utilizza un paio di trucchi per ottenere un aspetto un po 'simmetrico in un programma che effettivamente fa qualcosa. La barra rossa più a sinistra ha un colore diverso sul codice inferiore rispetto al resto, sfruttando il fatto che (almeno per me) queste 2 tonalità di rosso sembrano molto simili. il programma si sposterà dalla regione rossa più chiara a destra nel codice azzurro, e poi dritto attraverso la metà del programma al verde chiaro sul lato destro in cui è intrappolato. Svolge input, duplicate, multiply, e outputle operazioni.

Il codice rosso più scuro, insieme ai codici verde medio nella parte superiore e inferiore della colonna centrale, sono decorativi e il programma non li raggiungerà mai.

20 codici

20 codici

Legge i numeri dallo stdin fino a quando non viene letto uno 0, a quel punto emette la somma di tutti i numeri immessi ed esce.

Finalmente abbiamo abbastanza spazio per fare il controllo del flusso sotto forma pointerdell'operazione. I 4 codici nella parte superiore eseguono input, duplicatee notoperazioni, quindi un'altra notoperazione che si sposta dal magenta in alto a destra al giallo a 2 codici sotto di esso. L' notoperazione estrae il valore superiore dallo stack e invia un 1 se il valore superiore era uno 0 e un 1 altrimenti. Pertanto, un doppio notsostituisce qualsiasi valore diverso da zero con un 1. Spostandosi dalla barra gialla verso il blu scuro, esegue pointerun'operazione che estrae il valore superiore dalla pila e sposta il puntatore di direzione in senso orario per molte volte.

Se il valore superiore è 1 (ovvero non abbiamo inserito uno zero) il puntatore di direzione punterà a sinistra, spostandosi sui codici magenta per addun'operazione (che verrà ignorata la prima volta a causa di un solo valore nello stack) e poi attraverso il bianco torna all'inizio del programma.

Se il valore massimo dello stack è zero nell'operazione del puntatore, il puntatore di direzione non cambierà e il programma continuerà verso il basso. Spostandosi nella banda blu più chiara, poplo 0 inserito fuori dallo stack, lasciando solo la somma dei numeri accumulati. Lo spostamento nella barra ciano in basso comporterà outputtale somma, e quindi terminerà poiché il flusso del programma è intrappolato.

25 codici

25 codici

Conto alla rovescia! Legge un numero da stdin, quindi stampa un conto alla rovescia su 1 per stdout un numero alla volta. Ad esempio, se viene letto 5, verrà stampato 54321.

La prima operazione dal ciano al giallo è la input. Quindi il giallo è dove inizia il programma "loop". Giallo> Magenta> Blu è un duplicatequindi un output, quindi stampa il valore più alto nella pila ma ne conserva una copia. Scendendo destra, abbiamo pushil valore 1 nello stack poi effettuare una subtraction, diminuendo il nostro valore immesso 1. Il prossimo è duplicate, note un'altra notpassando dal magenta chiaro in basso a destra al giallo scuro accanto. Questo è lo stesso controllo zero / diverso da zero del programma precedente. Spostarsi a sinistra nel codice azzurro esegue pointerun'operazione, che si sposterà a sinistra nel ciano scuro per terminare il programma se abbiamo finito, o fino al giallo per riavviare il nostro loop senza l'input iniziale ma il valore originale è diminuito di 1.

Tutti e 3 i codici rossi sono decorativi e possono essere di qualsiasi colore.

30 codici

30 codici

Generatore di Fibonacci. Stampa i termini della sequenza di Fibonacci su stdout e non si ferma.

Questa è la prima introduzione rolldell'operatore, nonché la prima volta che una dimensione della regione maggiore di 1 viene utilizzata con l' pushoperatore per ottenere un valore specifico nello stack.

Come sempre inizia in alto a sinistra spostandosi a destra. Le prime 2 fanno funzionare pushuno 1 nello stack e poi outputda quando la sequenza di Fibonacci inizia con due 1, ma il ciclo del programma principale stamperà 1 solo una volta. Quindi sono pushaltri 2 1 nello stack per finire nel magenta scuro in alto a destra per avviare il ciclo del programma principale.

Spostandoci verso il basso sul lato destro duplicatee outputstampando il termine successivo della sequenza, quindi di duplicatenuovo per ottenere una copia del valore attuale della sequenza. Muovendosi a sinistra nella parte inferiore si eseguono 2 pushoperazioni. Poiché la regione rosso-chiaro in basso a destra ha una dimensione di 3 codici, la prima pushspingerà un 3 sulla pila anziché un 1.

Passare al blu chiaro è rollun'operazione. Questo fa uscire i primi 2 valori dallo stack ed esegue un numero di tiri pari al primo valore saltato, ad una profondità pari al secondo valore saltato. In questo caso, eseguirà 1 tiro a una profondità di 3. Un tiro a profondità nprende il massimo valore dello stack (il nostro valore corrente duplicato) e lo seppellisce nposizionandolo in profondità. Il nostro stack ha solo 3 punti in questo momento, quindi seppellirà il valore più alto in fondo.

Salire ancora una volta esegue addun'operazione sommando il valore della sequenza corrente con il valore della sequenza precedente. Il nostro stack ora ha il prossimo (nuovo attuale) valore di sequenza in alto e l'ultimo valore al di sotto di esso. Il programma ora si sposta attraverso il bianco nel magenta scuro per ricominciare il ciclo.

Il motivo giallo nel mezzo non viene mai utilizzato.

54 codici

54 codici

Stampa "ciao!" a stdout

Non è un messaggio particolarmente lungo, ma la stampa in piet richiede uno spazio sorprendente. La stampa viene eseguita utilizzando valori unicode e gli interi vengono inseriti nello stack utilizzando le dimensioni della regione in uscita. Dal momento che abbiamo un numero molto limitato di codici per questa sfida, usiamo un po 'di matematica per arrivare alla gamma stampabile che vogliamo.

Il programma inizia con un pushdi 5 dalla regione ciano a sinistra. Da qui, scorre lungo la parte superiore con 6 duplicateoperazioni per adescare la pila con un mazzo di 5 secondi. Il prossimo è push1, subtractper mettere un 4 in cima allo stack, quindi 2 multiplyoperazioni per mettere 4 * 5 * 5 = 100 in cima allo stack. Quindi a duplicateper 2 100s.

Ora il programma rimbalza sul nero e inizia a lavorare verso sinistra lungo il fondo. Pushoperazioni di 3 e 2 e poi a rollper seppellire i 2 100 sotto un 5. Il prossimo è push1, sottrarre e aggiungere per ottenere 100 + 5-1 = 104 in cima alla pila, che è unicode "h". Le successive 2 operazioni sono push1 e pointerper aggirare l'angolo e iniziare a muoversi proprio lungo il centro, quindi outputstampare "h".

Il prossimo è add100 + 5 = 105 in cima alla pila e outputper stampare "i". Lo stack ora contiene due 5. Push1, add, multiplydà (1 + 5) * 5 = 30. Finalmente push3 e addper 33, e outputper il finale "!". Il programma passa quindi attraverso lo spazio bianco rimanente per finire nel verde a destra.


5
Ah sì, lo stavo aspettando :)
Sp3000,

In che modo differisce da un linguaggio di caratteri 2D? È solo il modo in cui comunichi i valori delle celle.
JDługosz,

25
@jdlugosz Molti linguaggi di programmazione esoterici, quando si arriva ad esso, sono solo alcuni comandi di base di manipolazione dello stack con un modo unico di codificare i comandi. Personalmente penso che codificarli in un'immagine sia un'idea chiara.
Spencer,

13
Se stiamo parlando di equivalenza funzionale, potresti chiedere "In che modo differisce da una macchina di Turing?" ma poi potresti porre la stessa domanda a un gatto, al pianeta Giove o ad una qualsiasi delle altre lingue ...
trichoplax,

3
L'esempio di 9 codici sembra un mini-pokeball. Bello.
The_Basset_Hound il

154

> <> (Pesce)

(Nota: alcuni frammenti si basano su frammenti precedenti, quindi, a differenza della maggior parte delle risposte, ho deciso di metterli dal primo all'ultimo.)

factoid:

Come Befunge,> <> è un linguaggio 2D basato su stack. Ciò significa che le istruzioni non vengono eseguite in modo lineare come la maggior parte delle lingue tradizionali: il flusso del programma può essere su, giù, a sinistra o a destra!

Lunghezza frammento 1:

X

Xè un comando non valido in> <>, quindi something smells fishy...viene stampato il messaggio di errore . In realtà, questo è l'unico messaggio di errore in> <>, sia che la causa sia divisione per zero o che cerchi di far apparire uno stack vuoto.

Snippet di lunghezza 2:

1n

Il flusso del programma in> <> inizia da in alto a sinistra ed è inizialmente verso destra. 1spinge un 1 nella pila, quindi lo nstampa come un numero (anziché come un carattere ASCII). Ma i programmi> <> sono toroidali, il che significa che il puntatore dell'istruzione si avvolge quando raggiunge la fine di una linea. Quindi, dopo aver terminato n, premiamo un 1, stampiamo, finiamo all'inizio, premiamo un 1, stampiamo ... e finiamo per stampare 1s per sempre!

Snippet di lunghezza 3:

"o;

Ecco l' "analisi delle stringhe, viene oemessa come carattere ASCII e ;termina il programma. Ma cosa fa effettivamente il programma nel suo insieme?

Bene, prima iniziamo l'analisi delle stringhe, spingendo tutti i caratteri che vediamo nello stack fino a quando non troviamo una chiusura ". Spingiamo un o, poi un ;... e riavvolgiamo il puntatore dell'istruzione all'inizio. Ma ora siamo in un "modo che si fermano all'analisi delle stringhe, e, infine, eseguiamo la oe ;come normale per stampare la cima della pila (la ;) e terminare.

Sì, abbiamo appena usato lo stesso carattere virgolette per iniziare e terminare una stringa!

Snippet di lunghezza 4:

42n;

Sulla base di ciò che abbiamo visto finora, potresti aspettarti che questo spinga 42, produca come numero e termini. Ma tutte le istruzioni in> <> sono singoli caratteri, quindi questo in realtà spinge un 4 e un 2 , quindi emette la parte superiore dello stack come un numero (solo il 2) e termina.

Snippet di lunghezza 5:

<v
;>

Ricorda,> <> è un linguaggio 2D. Ciò significa che ci devono essere modi per cambiare la direzione del flusso del programma!

Come Befunge, un modo per farlo è tramite le frecce >^v<. Per illustrare come funzionano, diamo un'occhiata al programma sopra:

  • Il flusso del programma è inizialmente verso destra
  • < fa scorrere il programma verso sinistra - andiamo a sinistra e ci spostiamo verso v
  • v fa scorrere il programma verso il basso - scendiamo al >
  • > fa scorrere il programma verso destra - andiamo a destra e ci spostiamo sul ;
  • Alla fine, terminiamo.

Snippet di lunghezza 6:

";"00p

Un'altra caratteristica interessante di> <> è che è riflessiva: il programma può modificare il proprio codice sorgente al volo!

Qui spingiamo a ;, seguito da due zero. ppoi apre i primi tre elementi y, x, v( yessendo la parte superiore della pila) e posti vnella posizione x,y. In altre parole, pin questo programma mette un punto e virgola nella posizione 0,0, trasformando il codice in ;;"00p. Ciò consente quindi al programma di terminare, poiché il puntatore dell'istruzione ora si avvolge ed esegue il nuovo posizionamento ;.

Lunghezza frammento 7:

\7*n;
6

A differenza di Befunge,> <> ha anche i mirror ( \/|_#) che riflettono la direzione del flusso del programma. Quindi qui:

  • Inizia verso destra, ma ciò \ci riflette verso il basso
  • Spingere un 6 e avvolgere
  • Colpisci il retro del \e rifletti verso destra
  • Premere un 7
  • Moltiplica i primi due della pila
  • Emetti e termina

Spostarsi orizzontalmente attraverso uno _specchio o verticalmente attraverso uno |specchio non è consentito.

Lunghezza frammento 8:

"r00g>o<

Molto probabilmente il più semplice> <> quine se è consentito lanciare un errore. Le due nuove istruzioni qui sono:

  • r: Inverte la pila
  • g: Get - pop y, xe spingere il carattere x,ynello stack (controparte p)

Usando il trucco di avvolgimento delle stringhe di prima, il programma preme inizialmente, r00g>o<quindi preme di nuovo la prima citazione. Lo stack viene quindi invertito, dando <o>g00r. Dopodiché spingiamo il carattere a 0,0, il ", per dare <o>g00r". Alla fine, intercettiamo una otra due frecce, emettendo la parte superiore della pila fino a quando non rimane più nulla e otteniamo un errore.

Snippet di lunghezza 9:

x0\>
\1n>

x(lettere minuscole) sposta il puntatore dell'istruzione in una direzione casuale e il programma mostra questa funzionalità stampando bit casuali per sempre. Prova a seguire le frecce e gli specchi per capire come funziona! (Non dimenticare di controllare tutte e quattro le direzioni, comprese quelle su e sinistra)

Snippet di lunghezza 10:

;a comment

Non c'è sintassi di commento in> <> - non ne ha bisogno. Scrivi quello che vuoi ovunque e assicurati che non venga eseguito come codice!

Lunghezza frammento 11:

1!X2!X+!Xn;

!è un trampolino che salta le istruzioni. È particolarmente utile se utilizzato con ?un trampolino condizionale che fa apparire la parte superiore dello stack ed esegue l'istruzione successiva se l'elemento saltato è diverso da zero. Vedremo come funziona in seguito.

Il codice sopra stampa 3 saltando su Xs, eseguendo solo 1! 2! +! n;.

Lunghezza frammento 12:

01v
ao>:@+:n

Stampa i numeri di Fibonacci per sempre a partire dal secondo 1, uno su ogni riga. I nuovi comandi sono:

  • a: Push 10, necessario per newline. a-fspingere da 10 a 15 rispettivamente.
  • :: Parte superiore dello stack duplicata
  • @: Ruota i primi tre elementi della pila, ad es [5 4 3 2 1] -> [5 4 1 3 2].

Traccia per le prime iterazioni:

inserisci qui la descrizione dell'immagine

Snippet di lunghezza 13:

i:d=?v
l?!;o>

Un programma "tac" che legge in una riga di input e lo emette invertito. Grazie a @tomsmeding per lo snippet.

=apre i primi due elementi e preme 1 se sono uguali, 0 altrimenti. La prima riga continua a leggere in input fino a quando non viene trovato il carattere ASCII 13 (ritorno a capo), a quel punto passa alla seconda riga.

Il l?!;oloop è un costrutto importante in> <> che genera l'intero stack. Diversamente >o<, non causa errori. È così che funziona:

  • l spinge la lunghezza della pila
  • Controlliamo la lunghezza con ?:
    • Se la lunghezza era diversa da zero, !viene eseguita l'istruzione successiva , saltando la;
    • Se la lunghezza era zero, non eseguiamo e non terminiamo a !causa di;

Si noti che in realtà non si verifica alcun output fino a quando si preme il ritorno a capo.

Snippet di lunghezza 14:

32.

   X67*n;

Oltre a cambiare la direzione del flusso del programma, puoi effettivamente spostare il puntatore delle istruzioni ovunque tu voglia!

.pop y, xe teletrasporta il puntatore di istruzione x,y, mantenendo direzione. Si noti, tuttavia, che è necessario spostarsi su un quadrato prima di dove si desidera andare: il puntatore dell'istruzione viene aggiornato prima dell'esecuzione dell'istruzione successiva. Quindi qui il puntatore dell'istruzione finisce sull'invalido X, ma tutto va bene poiché il puntatore si sposta su 6prima di continuare l'esecuzione.

.rende possibile convertire la maggior parte dei programmi> <> in una linea, ma perché dovresti perdere il divertimento del 2D? :)

Lunghezza frammento 15:

01+:aa*=?;:nao!

Stampa i numeri 0su 99, uno su ogni riga. Questo programma dimostra un uso accurato del !trampolino - per garantire che lo 0 iniziale venga premuto una sola volta.

Lunghezza frammento 16:

"r00g!;oooooooo|

Un quine corretto che non genera errori, ispirato al quine nella pagina esolang .

Se ti chiedi come modificare il quine precedente (snippet n. 8) in modo che non causi un errore e pensi "perché non aggiungo solo un sacco di oistruzioni?", Allora potresti rendertene conto per ogni ocosa che aggiungi , devi produrne un altro o! Questo quine risolve ordinatamente il problema mettendo uno |specchio all'estremità, che consente a ciascuno odi essere utilizzato due volte .

Se passiamo alle virgolette singole (che sono anche per l'analisi delle stringhe), allora un quine alternativo che non usa gè

'r3d*!;oooooooo|

Lunghezza frammento 17:

b2,63,.

   17,n;

Abbiamo add ( +), sottrazione ( -), moltiplicazione ( *), modulo ( %) ... ma per quanto riguarda la divisione? È lì, ma poiché /è già uno specchio, è stato assegnato il ,simbolo alla divisione . È interessante notare che la divisione è divisione float , non divisione intera!

Il programma sopra esplora alcuni comportamenti indefiniti cercando di saltare a 11/2, 6/3. L' intero Python sembra a posto se la prima coordinata non è un numero intero (anche se salta nel punto sbagliato), ma soffoca se la seconda non lo è.

Lunghezza frammento 18:

123456${{$}nnnnnn;

Abbiamo visto rche inverte la pila e @che ruota i primi tre elementi. Ecco alcuni altri comandi che spostano gli elementi nello stack:

  • $: Scambia i primi due elementi
  • {: Sposta l'intero stack a sinistra
  • }: Sposta l'intero stack a destra

Per mostrare come funziona, ecco la traccia del programma:

123456 ------> 123465 ------> 234651 ------> 346512 ------> 346521 ------> 134652
       $ Swap        { L shift      { L shift       $ Swap        } R shift

Quindi usciamo, dando 256431.

Lunghezza frammento 19:

"reward"4[roooo]oo;

Fino ad ora ho detto "la pila", "la pila" ...

Sebbene la maggior parte dei programmi utilizzi solo uno stack,> <> può effettivamente avere più stack! Ecco le istruzioni pertinenti:

  • [: Apre xe sposta gli xelementi superiori in un nuovo stack
  • ]: Rimuove lo stack corrente e sposta i suoi valori nello stack sottostante.

Ecco la traccia per il programma sopra:

       [r e w a r d]       Push "reward"
4[     [r e] [w a r d]     Move four elements to a new stack
r      [r e] [d r a w]     Reverse the current stack
oooo   [r e] []            Output "ward"
]      [r e]               Remove the current stack, no values to move
oo     []                  Output "er", giving "warder" altogether

Si noti che semplicemente spingendo rewarde poi emettendolo di nuovo con ooooooverrebbe stampato drawer, a causa della natura "first in, last out" delle pile.

Snippet di lunghezza 20:

aa*5+\
7a*2+\
oo;  \

Una caratteristica poco nota di> <> è che, come Python, le barre rovesciate possono essere utilizzate per la continuazione della linea in molti casi. *

Il codice sopra è funzionalmente uguale a

aa*5+7a*2+oo;

* Dichiarazione di non responsabilità: il motivo per cui funziona o meno potrebbe essere per un motivo completamente diverso

Snippet lunghezza 22:

1&fv ;n&<
&1->:0=?^:&*

Oltre agli stack,> <> ha anche dei registri (uno per ogni stack) che possono essere utilizzati per memorizzare i valori. La chiamata &per la prima volta sposta il valore superiore dello stack nel registro e l'esecuzione di &nuovo sposta il valore indietro. Questo può essere molto utile quando si accumula un valore, ad esempio somme e fattoriali.

Il programma sopra calcola il fattoriale di f(15), stampando 1307674368000. Ecco la traccia per fsostituita con 4:

inserisci qui la descrizione dell'immagine

Lunghezza frammento 24:

"Hello, World!"rl?!;of0.

Abbiamo abbastanza caratteri per il programma preferito da tutti! Qui usiamo il .teletrasporto per il circuito di uscita.

Snippet di lunghezza 25:

0i:0(?v$a*$"0"-+!
   ;n~<

Sfortunatamente> <> consente di leggere da STDIN solo un carattere alla volta, il che rende la lettura in numeri un po 'complicata. Per input composto da cifre 0-9, questo programma è essenzialmente atoi, convertendo una stringa di cifre da STDIN in un numero sullo stack (che viene quindi stampato).

Un'altra nota è che su EOF, ispinge -1 nello stack. Ciò semplifica il controllo di EOF confrontandolo con 0 utilizzando (o "minore di".

Utilizza anche questo frammento ~, che apre e scarta l'elemento superiore dello stack.

Snippet lunghezza 33:

i>:nao:1=?;\
 ^  ,2v?%2:/
 ^+1*3<

Fino ad ora, la maggior parte dei frammenti sono stati relativamente lineari o erano solo semplici esempi che dimostravano la funzionalità di <<>. Ora posso fare un esempio che evidenzia quanto sia facile visualizzare il flusso del programma in> <> con un programma ben strutturato.

Il programma legge un singolo carattere ASCII ed esegue l' 3x+1algoritmo sul suo punto di codice (In> <>, i caratteri sono sostanzialmente numeri interi). Ogni passaggio dell'algoritmo viene stampato fino a quando non si preme 1.

Ecco una traccia per le prime iterazioni con input a(codice 97):

inserisci qui la descrizione dell'immagine

Lunghezza 44 frammento:

a&>i:0(?v"+"$\
/&^?=0l< "a*"/
\:1+&2p/\0
n
;

Non mi sento di aver reso pgiustizia al comando, dopo averlo usato solo una volta nel frammento n. 6, quindi ecco una diversa funzione Atoi. Cosa c'è di bello in questo? Il programma scrive l'espressione necessaria per calcolare il numero mentre legge l'input!

Quindi, per un input simile 573, dopo che tutti i caratteri sono stati letti, la fine della terza riga sarà simile \0a*5+a*7+a*3+a 573!

Ancora una volta, si suppone che l'input sia solo cifre. Traccia GIF qui .

Lunghezza frammento 74:

>i:'A'(?v:'N'(?v:'['(?v\
  :'a'(?v:'n'(?v:'{'(?v\
^      o<    +d<  -d-d<o

Se sei riuscito a venire qui, potresti essere d'accordo con me quando dico che questo è un programma ROT13 molto leggibile. Dato un carattere c1, troviamo il primo carattere c2in AN[an{, tale che c1 < c2, quindi, applichiamo l'offset appropriato aggiungendo / sottraendo d(13). Si noti che [e {sono i caratteri direttamente dopo Ze zrispettivamente.

Provalo nella console e guarda le lettere trasformarsi mentre scrivi!

(È anche possibile reindirizzare l'input, ma poiché mi manca il controllo EOF, :0(?;si fermerà con un errore quando tenta di stampare -1 come carattere)


Un'idea per lo snippet 13: i:d=?v NEWLINE o;!?l<- stampa la riga di input all'indietro
tomsmeding il

12
Vorrei poter dare più voti, ora sono ispirato a iniziare a studiare> <> ...
Robobenklein,

6
+1 per iniziare dall'alto e scendere (e anche solo perché è divertente da leggere).
mbomb007,

5
@ mbomb007 è un peccato, però, che l'ordine non possa andare a sinistra / a destra e andare a
capo in

Il tuo frammento di lunghezza 8 sarebbe un vero quine se scrivessi something smells fishy...nella riga successiva.
wizzwizz4,

148

C - modifica

Grazie per i voti! Rispetto ad altre lingue e cosa possono fare in byte limitati, C sembra obsoleto, pignolo e troppo dipendente dallo sviluppatore. Sotto molti aspetti: i linguaggi di script e di livello superiore con gestione automatica della memoria sono molto più espressivi e più rapidi nella produzione di quanto lo sarà mai il C.

Quindi perché la caratteristica C?

Il segreto nascosto dietro tutti quei linguaggi di scripting è che gli interpreti sono probabilmente scritti in C (o più recentemente, C ++ o Java). I primi compilatori C ++ sono stati effettivamente compilati in codice C. In effetti, fino a quando non c'è un mercato per un compilatore diretto, di solito è più conveniente scrivere un compilatore per generare C, quindi compilarlo.

Se stai lavorando su piattaforme molto piccole, forse anche senza un sistema operativo disponibile, probabilmente stai lavorando in C. In questi giorni, praticamente ogni apparecchio ha un microcontrollore incorporato, senza dubbio programmato in C. Quando ne hanno bisogno piccolo e veloce, C è la strada da percorrere. (Anche FORTH, per i masochisti.)

Conoscere C ti porta il più vicino possibile al metallo senza entrare nell'assemblatore e ti aiuta in altre lingue. Hai una buona idea di come funzioni probabilmente una funzione virtuale C ++. Sai quando scrivi quelle funzioni ricorsive pass-by-value in PHP, internamente sta facendo molta allocazione e copia della memoria, quindi provi istintivamente il pass-by-reference. Callback e riferimenti non impazziscono gli sviluppatori C, forse Haskell lo fa.

Come hanno menzionato Kernighan e Ritchie nella prefazione del classico linguaggio di programmazione C , 2a edizione, C non è un grande linguaggio e non è ben servito da un grande libro. Sto cercando di seguire questo consiglio: gli esempi fanno doppio, triplo o più dovere, se possibile.

Tutti i frammenti sono almeno compilabili da soli. Quelle che sono collegabili ed eseguibili sono indicate come tali. So che questo non è un requisito, ma rende più semplice il tentativo di spiegare il framework richiesto per far funzionare qualsiasi frammento di codice.

Ho anche cercato di assicurarmi che ogni frammento di codice fosse il più corto possibile in modo da non introdurre spazi extra solo per riempire una certa lunghezza. Nei casi in cui il codice è rientrato, i rientri non sono inclusi nella lunghezza, ma solo un carattere per ogni nuova riga.

factoid

C rocce.

Lunghezza 0 frammento

Il programma di riproduzione automatica più breve del mondo http://www.ioccc.org/1994/smr.hint

Lunghezza 1 frammento

;

C fa una distinzione tra compilazione e collegamento. Molte entità in C sono appena compilate e collegate in un secondo momento - un esempio sono tutte le librerie statiche e dinamiche.

Altre entità sono appena incluse e non generano alcun codice da sole.

Il punto e virgola sopra verrà sicuramente compilato in codice oggetto e non farà nulla!

Lunghezza 2 frammento

x;

C, essendo un vecchio linguaggio di programmazione, ha subito diverse iterazioni. Il primo in uso diffuso fu sviluppato da Kernighan e Ritchie e abbreviato K&R. K&R C è noto per fare molte ipotesi sul tuo codice se non le fornisci esplicitamente.

In particolare, in K&R C, si presume che il codice sopra sia un intero globale xinizializzato su 0. La compilazione in modalità K&R produrrà un file oggetto che fornisce qualsiasi programma che lo collega a questa variabile per il suo uso.

Lunghezza frammento 3

??/

C è così diffusa che deve fornire funzionalità di compatibilità per sistemi che non hanno tutti i caratteri che utilizza. Quanto sopra è una trigrafia per la barra rovesciata, che viene utilizzata in C come carattere di continuazione della linea. Quanto sopra verrà compilato, probabilmente con un avviso che non esiste una riga seguente.

Una cultura comune in C consiste nell'ignorare gli avvisi di compilazione e molte basi di codice di grandi dimensioni invariabilmente hanno alcuni o più avvisi quando vengono creati.

Lunghezza 4 frammento

f();

Sempre con K&R, quanto sopra viene "compilato" per indicare, al momento della compilazione, che "Esiste, con un collegamento globale, una funzione fda fornire in seguito, che accetta un numero fisso ma non specificato di argomenti e restituisce un numero intero".

Nota le differenze fondamentali tra questo e f;.

Lunghezza 5 frammento

s="";

K&R C è noto per essere veramente perdonatore. Al momento della compilazione, questo codice fornirà un numero interos per il collegamento globale che viene inizializzato all'indirizzo iniziale di una stringa vuota (credo). K&R gestisce tranquillamente tutte le coercizioni, incluso il troncamento se un numero intero non è abbastanza grande da contenere l'indirizzo.

Sono costrutti come questi che hanno generato molti bug difficili da trovare e hanno fornito molta ispirazione nelle competizioni IOCCC.

Lunghezza 6 frammento

o=042;

Un gotcha di timer anche vecchi, uno 0 iniziale in un numero letterale significa che le cifre seguenti sono nella base ottale. Il codice sopra, al momento della compilazione, fornirà un numero intero oper il collegamento globale inizializzato al decimale 34.

Questa caratteristica di C ha morso molti sviluppatori che si sforzano di riempire i loro numeri per renderli allineati bene e persino!

Lunghezza frammento 7

f(){f;}

Il codice sopra è una funzione con un corpo. Ma che cosa fa? Recupera l'indirizzo della funzione e non fa nulla con essa! In genere ciò che la funzione restituirà non è definito. Codice non sensato come questo spesso può essere compilato senza preavviso.

Lunghezza 8 frammento

main(){}

Questo rappresenta il codice compilabile e collegabile più breve in C. Mentre nelle versioni moderne di C, le funzioni di solito non possono essere definite implicitamente, per ragioni storiche per cui questa restrizione è attenuata main.

Questa meraviglia di un programma, che non fa altro che restituire 0, verrà compilata in dimensioni non trascurabili e verrà collegata in varie routine di runtime C. Puoi compilare e collegare con verbosità impostata su full per vedere cosa sta succedendo sotto il cofano.

Lunghezza frammento 9

#define Z

Un pilastro dei file di intestazione C è la #definedirettiva preprocessore. I programmi C vengono compilati in varie fasi e in una di queste fasi queste definizioni vengono sostituite con i loro valori effettivi.

Quando manca un argomento, C implicherà 1, quindi quanto sopra sostituirà 1ovunque Zsia usato nel codice sorgente.

Quanto sopra verrebbe tipicamente inserito in un file di intestazione e #included come richiesto.

Lunghezza frammento 10

enum{P,Q};

La enumparola chiave fornisce un modo talvolta sicuro per definire una serie di costanti. Come definito, vengono spesso utilizzati nei file di intestazione. Il codice sopra riportato, quando incluso, definirebbe Pun numero intero di 0 e Qdi 1.

Lunghezza 11 frammento

volatile v;

La volatileparola chiave è far sapere al compilatore che una variabile può essere modificata da altri agenti e non fare ipotesi che rimarrà costante tra gli accessi.

Lunghezza 12 frammento

#pragma once

#pragma once è una direttiva preprocessore non standard ma ampiamente supportata per indicare che il file di origine corrente deve essere incluso solo una volta in una singola compilazione.

La tecnica tradizionale e pienamente supportata consiste nell'utilizzare le #includeprotezioni con gli svantaggi del codice aggiunto e dei possibili scontri con i nomi.

Lunghezza 13 frammento

w(){for(;;);}

Esistono numerose convenzioni in C, e una di queste è come rappresentare loop infiniti. In questo caso, for(;;)indica nessuna inizializzazione, nessun controllo di uscita che per impostazione predefinita è 1 che significa vero, ovvero non si interrompe e nessun codice di loop.

A volte è possibile fare tutto all'interno di ()e il ciclo stesso non ha bisogno di un corpo. In questo caso viene aggiunto un punto e virgola fittizio alla fine.

Nel codice sopra, una volta compilato, fornirà una funzione che entrerà in un circuito affollato - uno dei no-no nella progettazione del software - e non tornerà mai più.

Lunghezza frammento 14

int a[]={1,2};

Le matrici in C non necessitano delle lunghezze specificate. Le parentesi quadre vuote []indicano al compilatore di "capirlo da soli". Tuttavia, in C, a differenza di altre lingue, non esiste un modo integrato per impedire l'accesso a un array al di fuori di questi limiti, portando alla metafora "sparati nel piede" per cui C è noto.

Il codice sopra, una volta compilato, fornirà un array mutabile globale adi due numeri interi inizializzati con 1 e 2.

Lunghezza frammento 15

const long k=7;

Lo constspecifer è un'aggiunta successiva a C presa in prestito da C ++. Una domanda di intervista comune è "Ha senso definire una variabile come volatile const?". constinsieme enume inlineintendono ridurre la dipendenza #defineda problemi con la sicurezza dei tipi.

Lunghezza 16 frammento

extern void **q;

externè usato per indicare che una variabile è dichiarata altrove. Il void *tipo è il tipo generico standard in C, il che significa che non è necessario eseguire il cast esplicito o il cast da nelle istruzioni di assegnazione. La **sequenza dell'operatore significa puntatore a un puntatore, che spesso fa esplodere le menti dei neofiti, ma è perfettamente valido e spesso usato C.

Lunghezza frammento 17

double d=4/3-1/3;

Se dovessi stampare quanto sopra, il risultato sarebbe uno e penseresti super! Passare a double d=4/3-2/3;e qual è la risposta? È ancora uno! C sta usando l'aritmetica intera per calcolare 4/3 → 1 e 2/3 → 0 e 1 - 0 → 1!

Lunghezza 18 frammento

main(){puts("!");}

Finalmente arriviamo ad un codice che fa davvero qualcosa! putsè un favorito dei golfisti C perché non richiede un file di intestazione per l'uso.

putsaggiungerà anche un feed di riga all'output. Al contrario, la sua controparte getseliminerà i feed di linea. Non si dovrebbe mai usare getsse non in circostanze molto controllate: non ha protezione per sovraccarichi del buffer ed è la causa principale di molti exploit.

Lunghezza 19 frammento

#include <stdlib.h>

L'inclusione dei file di intestazione è spesso una firma personale degli sviluppatori. Molti includono libe ioindipendentemente dal fatto che siano necessari. Alcuni ordinano i file di intestazione in modo che le lunghezze aumentino o diminuiscano. Più messo <>prima "". Personalmente ho usato questa firma nei miei giorni TA per verificare la presenza di imbrogli tra gli studenti: la stessa firma dell'intestazione? dai un'occhiata più da vicino!

Lunghezza 20 frammento

char*p=(char*)0x300;

C è progettato per essere utilizzato su piattaforme rudimentali di livello molto basso. In alcuni casi potrebbe essere necessario accedere direttamente alle porte mappate memoria speciali.

Nel codice sopra l'indirizzo di una porta è definito come esadecimale 300. Si accede al valore della porta utilizzando *p, come in *p=0xff;per attivare tutti i bit o v=*p;per recuperare il valore corrente.

Lunghezza frammento 21

int w=sizeof(double);

L' sizeofoperatore fornisce la dimensione in byte di un tipo. Con i nomi delle variabili le parentesi non sono richieste ad es double d;int w=sizeof d;.

Lunghezza frammento 22

asm("xorl %ecx,%ecx");

La modalità asmdi utilizzo è definita dal compilatore. Quanto sopra è un esempio di codice in linea gcc Linux su una piattaforma Intel.

L'unico Unix aveva una piccola ma non trascurabile parte del suo codice nell'assemblatore. Anche oggi, se la velocità è di primaria importanza e la portabilità non lo è assolutamente, la vedrai utilizzata.

Su sistemi compatibili, il codice sopra verrà compilato e sarà letteralmente un'istruzione di assemblaggio isolata senza mezzi convenzionali per accedervi! BTW xor R,Rè un linguaggio linguaggio assembly comune per cancellare rapidamente un registro.

Snippet di lunghezza 23

union u{char c;int i;};

A unionfornirà almeno lo spazio sufficiente per l'elemento più grande. Potresti vederlo usato insieme void *a fornire un tipo "opaco" comune in certe librerie. In questo caso, l'unione di solito farà parte di una struttura più grande, con la struttura che ha un campo per identificare il tipo di unione.

Lunghezza 24 frammento

/*INTS*/int i,j,k;//INTS

Il commento originale in C è stato delimitato da /* comment */e preso in prestito il // comment to end of lineformato da C ++.

Lunghezza frammento 25

int main(void){return 1;}

Questa è la versione più conforme dello snippet di lunghezza 8 sopra. Il tipo restituito e i tipi di funzione sono specificati e ha un valore restituito esplicitamente.

La convenzione in C consiste nell'utilizzare un valore di ritorno di 0per successo e 1per fallimento, o se si desidera essere rigorosamente conformi EXIT_SUCCESSe EXIT_FAILUREcome definito in stdlib.h.

Lunghezza 26 frammento

typedef struct{int x,y;}P;

typedefè estremamente utile, in particolare typedef struct,. In termini moderni potresti chiamarlo "orientamento all'oggetto-luce".

Dopo aver incluso quanto sopra, il codice può essere utilizzato Pcome tipo normale nelle dichiarazioni e nelle funzioni, con controllo completo del tipo. A differenza di C ++, tuttavia, non è possibile definire operatori come +, * o <<, quindi "luce-orientamento-oggetto".

Lunghezza del frammento 27

#define C(x,y)(((x)+1)*(y))

C ha una #definesintassi macro conveniente .

Un errore novizio comune è l'omissione di parentesi interne e / o esterne, con conseguenti errori di precedenza dell'operatore difficili da trovare.

Lunghezza frammento 28

struct f{int s:1,e:8,m:23;};

C può definire esplicitamente campi di bit che possono essere assegnati, letti e manipolati come qualsiasi numero intero.

Quanto sopra è un'approssimazione di una struttura di dati IEEE a virgola mobile a larghezza singola.

Lunghezza 36 frammento

f(unsigned x){return!!x&!(x&(x-1));}

In molte lingue, non è necessario preoccuparsi di come sono rappresentati i numeri. In C, devi essere intimamente consapevole della loro rappresentazione interna.

Il miglior esempio di ciò che mi viene in mente è determinare se un numero intero è una potenza di due {1, 2, 4, 8, ...}. Coloro che non hanno familiarità con C eseguiranno cicli e turni e qualsiasi altra cosa per il runtime O (log (n)), non male, ma sopra c'è una funzione che farà lo stesso nel runtime O (1). Lascio che sia un esercizio per il lettore per confermare che funziona, ma lo fa davvero ...

La !!convenzione viene spesso utilizzata per forzare un numero intero da diverso da zero e zero a 1 e 0 rispettivamente. A molti sviluppatori C piace usare questo tipo di trucchi (spesso in contrasto con coloro che apprezzano la chiarezza del codice).

Gli sviluppatori di Super C possono confermare che quanto sopra funzionerà su hardware a complemento e firmato. Per quelli che si chiedono, sei quasi sicuro di lavorare su hardware a due complementi in questo momento. Solo i più fortunati (o sfortunati a seconda della tua prospettiva) devono preoccuparsi di questo!

Lunghezza frammento 48

#include<complex.h>
double complex c=3.0+I*4.0;

C99 include il supporto per numeri complessi. Come puoi vedere dal codice, assume la forma di un modificatore per un tipo reale. Puoi anche usare int complex c=3+I*4;ma internamente si costringe a un tipo a virgola mobile. Il codice sopra verrà compilato in gcc usando gcc -std=c99 -c length-48.c.

Se vuoi vedere più interni, prova a compilare con l'opzione -E. Per la mia versione di gcc, la dichiarazione sopra diventa double _Complex c=3.0+(__extension__ 1.0iF)*4.0;. Si noti che il tipo complesso è un'aggiunta significativa alla lingua, non solo alcune macro economiche.

Questo è solo un teaser, quando arriviamo a più di 125 caratteri, allora possiamo iniziare a divertirci davvero con numeri complessi!

Snippet di lunghezza 51

#include <math.h>
main(){double d=sqrt(sin(3.2));}

Per vari motivi, C non si collega automaticamente alle funzioni matematiche standard come sin, cos, tan, sqrt, ecc. Quindi, se vengono utilizzati, ma non collegati, allo sviluppatore verrà presentato l'errore del linker un riferimento indefinito a 'sqrt' o qualche altro errore.

In gcc, il codice sopra compilerà e collegherà usando gcc length-51.c -lm.

Nota sin(3.2)restituirà un numero negativo, di cui la radice quadrata non è legale nel dominio reale. In C, NaNviene restituito un valore speciale per indicare questo errore, che il programma è libero di ignorare!

In C99, ci sono molte nuove funzioni di gestione delle eccezioni per fornire un controllo molto sicuro e dettagliato di questo tipo di errori matematici, che quasi nessuno usa!

Lunghezza frammento 63

static int w;static int X(int x){static int s=0;s^=x;return s;}

O formattato in modo più sano:

static int w;
static int X(int x)
{
    static int s=7;
    s^=x;
    return s;
}

Come avrai intuito, si tratta della parola chiave staticche ha più di un significato in C.

Nei primi due casi, staticsta dicendo al compilatore che numeri interi we funzioni Xnon sono visibili al di fuori di questo file o unità di compilazione, cioè sono interni.

Queste funzioni non sono pensate per essere chiamate esternamente, quindi potrebbero non verificare la validità degli argomenti e tagliare altri angoli. Poiché hanno un ambito interno, è possibile ridefinire we Xin altri file e di solito saranno separati.

Nell'ultimo caso, staticindica che il numero intero smantiene il suo valore tra le chiamate di funzione. La prima volta che Xviene chiamato, ssarà il suo valore iniziale 7, quando viene eseguito l' OR esclusivo con x, il nuovo valore verrà mantenuto.

Internamente, sebbene dipenda dall'implementazione, la consueta organizzazione della memoria srisiede nell'heap, memoria specificamente inizializzata, mentre l'argomento xrisiede nello stack. Dove risiedono le variabili è importante se si desidera implementare algoritmi ricorsivi, ad esempio.

Un gotcha in C sono scontri con variabili globali. Fino a quando we Xsono in realtà definiti static, se sono definiti a livello globale da qualche parte, quindi we Xsi riferiranno alle entità globali, invece.

Qui qe wnon può essere inizializzato sullo stesso valore, perché un globale wviene utilizzato per impostare q:

static int q = w;
static int w;

Se wnon esiste un globale , la compilazione dovrebbe fallire.

Qui qe wverrà inizializzato allo stesso valore:

static int w;
static int q = w;

In genere, i progettisti ridurranno gli scontri con i nomi aggiungendo un prefisso o suffisso distintivo alle loro variabili e funzioni globali.

In C99, staticha guadagnato un altro uso, ad esempio, il int Y(int a[static 10]);che significa che esiste una funzione Yche accetta un array di almeno 10 numeri interi.

Lunghezza frammento 74

void f(register int*p,register int*q,register int l){while(l--)*p++=*q++;}

O ben disposti:

void f(register int *p, register int *q, register int l)
{
    while (l--)
        *p++ = *q++;
}

La parola chiave registerfornisce un suggerimento al compilatore che l'utilizzo dei registri hardware sarebbe utile qui. La funzione sopra copierà lnumeri interi da qa p, se possibile utilizzando i registri hardware.

A volte le accelerazioni potrebbero essere significative. Ad esempio, nella famiglia di microprocessori 68K, la linea *p++ = *q++potrebbe essere tradotta in una singola istruzione MOVE.W (Ap)+,(Aq)+rispetto a sei o otto se non la si utilizzava register. Il microprocessore 68K aveva esplicite modalità post-incremento e pre-decremento, quindi lo sviluppatore esperto, se avesse conosciuto la piattaforma, avrebbe adattato il codice usando x++e --yvs. ++xe y--.

In questi giorni i compilatori ignorano per lo più register, oltre a non consentire che vengano presi degli indirizzi (ad es. In quanto sopra &lcauserebbe un errore del compilatore).

Lunghezza 88 frammento

#include<stdio.h>
int f(int x){return(x>1)?x*f(x-1):1;}int main(){printf("%d\n",f(12));}

O con un layout più igienico:

#include <stdio.h>

int f(int x)
{
    return (x > 1)? x * f(x - 1): 1;
}

int main()
{
    printf("%d\n", f(12));
}

Ah, ricorsione! Lo snippet è un programma completo per la compilazione, il collegamento e l'esecuzione. La funzione fcalcola il fattoriale del suo argomento xusando la formula ricorsiva f (x) = x * f (x - 1). I fattoriali si ingrandiscono molto rapidamente, quindi ad esempio f(12)è il valore più grande che puoi ottenere in un intero con segno a 32 bit.

Per un esempio di codice veramente ricorsivo, esamina le implementazioni ingenue della funzione Ackermann .

I compilatori intelligenti possono ottimizzare la funzione, usando il suggerimento inlinee "srotolano" la funzione quando le costanti vengono fornite come argomenti in modo che:

f(12)

diventa:

12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1

Senza alcuna chiamata di funzione richiesta!

Altri compilatori possono riorganizzare la funzione:

int f(int x)
{
    return (x < 2)? 1: f(x - 1);
}

E implementare qualcosa chiamato ricorsione della coda. Questo in effetti sostituisce l'ultima chiamata di funzione a un semplice goto e consente a quella funzione di gestire il ritorno. Il vantaggio è meno thrashing dello stack, codice più veloce e più piccolo.

Nel linguaggio assembly, questo tipo di opportunità di ottimizzazione è davvero facile da individuare e può essere implementato da qualcosa chiamato "ottimizzatore del buco della serratura", che sostanzialmente cerca piccoli schemi e li sostituisce con qualcosa di più veloce e / o più piccolo.

Snippet di lunghezza 117

#include<stdio.h>
int main(int c,char**v){int a,b;sscanf(v[1],"%d%*[\t ,]%d",&a,&b);printf("%d\t%d\n",a,b);return 0;}

O:

#include <stdio.h>

int main(int c, char **v)
{
    int a, b;

    sscanf(v[1], "%d%*[\t ,]%d", &a, &b);
    printf("%d\t%d\n", a, b);

    return 0;
}

C preso in prestito dalle lingue contemporanee all'epoca, il concetto di I / O universale che poteva essere applicato in modo coerente a qualsiasi dispositivo, che fosse console, scheda perforata, nastro, disco o stampante, ma in vero formato C, permetteva allo sviluppatore di creare dichiarazioni molto concise ma potenti.

Nello snippet precedente, prenderà l'input dalla riga di comando, analizzerà due numeri interi separati da spazi, tabulazioni o virgole e li emetterà. Sfrutta un nuovo scanfidentificatore %*[\t ,]che: [\t ,]estrarrà tutte le schede, gli spazi e le virgole e *li ignorerà.

Ricordo di aver rivisto un po 'di codice C ++ in cui lo sviluppatore stava facendo tutto in modo "puro" con C ++ <<e un arsenale di metodi come finde substr. Era almeno una dozzina di righe e non era ancora in grado di gestire le virgole come delimitatori. Ho sostituito tutto quel codice goffo con una sola sscanfriga come sopra!

Snippet di lunghezza 132

#include<stdio.h>
int main(int c,char**v){while(--c){++v;printf("|%s|\n|%5s|\n|%-5s|\n|%.5s|\n|%5.5s|\n",*v,*v,*v,*v,*v);}return 0;}

O:

#include <stdio.h>

int main(int c, char **v)
{
    while (--c)
    {
        ++v;
        printf("|%s|\n|%5s|\n|%-5s|\n|%.5s|\n|%5.5s|\n", *v, *v, *v, *v, *v);
    }

    return 0;
}

Le funzioni printf, sprintf, fprintfspecificatori ecc formato utilizzare per definire la larghezza e imbottitura dell'uscita.

Compilare ed eseguire quanto sopra usando gli argomenti della riga di comando per vedere i vari output:

> main xyz 123456
|xyz|                                                                                                                                                
|  xyz|                                                                                                                                              
|xyz  |                                                                                                                                              
|xyz|                                                                                                                                                
|  xyz|                                                                                                                                 
|123456|                                                                                                                                             
|123456|                                                                                                                                             
|123456|                                                                                                                                             
|12345|                                                                                                                                              
|12345| 

Notare che l' .5output per l'identificatore limita al massimo cinque caratteri, mentre il primo 5assicura che l'output sia di almeno cinque caratteri, -indicando l'allineamento a sinistra. La combinazione di questi imposta l'output a esattamente cinque caratteri.


4
Non credo che ci fosse la necessità di aggiungere un nuovo factoide per ogni votazione :)
Ottimizzatore

28
Una cultura comune in C è quella di ignorare gli avvisi di compilazione , non credo che questo sia vicino alla verità!
Shahbaz,

4
Se si dispone di un progetto di grandi dimensioni e si considerano più compilatori, può essere del tutto inutile tentare di eliminare tutti gli avvisi.
feersum

5
Questo è eccellente
Kik,

4
Sono un programmatore C e non ho paura di Haskell.
Shahbaz,

138

x86 Codice macchina

factoid:

x86 Machine Code è la versione assemblata di x86 Assembly che il processore esegue effettivamente. È stato sviluppato quando la memoria e lo spazio di archiviazione erano costosi ed è stato progettato per essere un po 'retrocompatibile fino all'Intel 8008. Mantenere il codice eseguibile piccolo era uno degli obiettivi e utilizza istruzioni di lunghezza variabile e un'architettura CISC per aiutare raggiungere questo obiettivo (che ha avuto lo svantaggio di rendere più complicato migliorare le prestazioni sui processori moderni). Questo, insieme alla natura spoglia dell'assemblaggio e del codice macchina in generale, offre ai programmi x86 la capacità di essere estremamente compatto.

Lunghezza 1:

Ora per il primo programma:

0xC3

Apri un editor esadecimale, inserisci quel byte e salvalo come test.com.

Ora hai un programma MS-DOS valido che ritorna immediatamente senza fare nulla, poiché 0xC3 è l'istruzione 'RET'. Ciò mostra tuttavia un altro aspetto interessante per giocare a golf con x86: il formato di file .com. Questo formato eseguibile non ha assolutamente intestazione: il file viene semplicemente caricato in memoria a partire dall'indirizzo 0x100 e quindi l'esecuzione viene avviata a 0x100. Questo significa che nessun byte sprecato in metadati!

Lunghezza 2:

Il nostro prossimo programma:

0x4D 0x5A

o "MZ" in ASCII.

Ok, ho barato un po ', non è davvero un programma utile, poiché corrisponde alle istruzioni

DEC     BP
POP     DX

Che non sono effettivamente utili per l'avvio di un programma .com. In effetti, questo è il punto centrale di questi due valori: nessun file .com ragionevole dovrebbe iniziare con loro! I file .com avevano dimensioni limitate a 65280 byte (64 KiB - 0x100), quindi quando sono stati necessari programmi più grandi, è stato necessario sviluppare un nuovo formato. Questo era il formato di file .exe, che ha un'intestazione. Tuttavia, MS-DOS doveva mantenere l'estensione .com su alcuni componenti per la compatibilità con le versioni precedenti, quindi aveva bisogno di un modo per rilevare se un file .com era davvero un file .exe. Hanno scelto la puntura "MZ" come questo numero magico, e fino ad oggi, se apri un file .exe (o .dll) di Windows in un editor esadecimale, vedrai che iniziano con quei due byte. Mi diverte che anche il più moderno programma Windows inizi con un limite di compatibilità degli anni '70.

Lunghezza 3:

Ora per un ciclo infinito:

41 E2 FD

Che si traduce in

start:
inc cx
loop start 

Questo programma incrementa il valore di CX (che sarà> 0 per cominciare), quindi esegue l'istruzione loop. Loop è un eccellente esempio di istruzione CISC poiché combina 3 semplici operazioni in un'unica operazione speciale: diminuisce il valore di CX, controlla se è 0 e salta all'etichetta di destinazione in caso contrario. Esistono anche forme di loop che controllano altri flag oltre alla fine quando CX è 0. Avremmo potuto fare semplicemente "jump start" per un loop infinito di 2 byte, ma questo era più interessante.

Lunghezza 4:

Un programma che è minimamente utile:

40 CD 10 C3

Tradotto in assembly:

inc ax    ; 1 byte
int 10h   ; 2 bytes
ret       ; 1 byte

Questo programma imposta la console su 40x25 caratteri, cancella lo schermo, quindi torna alla riga di comando. AX è impostato sulla modalità video che vogliamo (1), quindi viene chiamato l'interrupt 10h del BIOS per impostare effettivamente la modalità video e cancellare la finestra, prima di tornare. Aspettatevi di vedere più di questi interrupt del BIOS in futuro.

Lunghezza 5:

Ora possiamo implementare un programma di pausa:

B4 01 CD 21 C3

Tradotto in assembly:

mov ah,1  ; 2 bytes
int 21h   ; 2 bytes
ret       ; 1 byte

Questo programma dice al BIOS di attendere che un tasto venga premuto e lo riecheggia sullo schermo prima di tornare. Ciò dimostra anche come su x86, alcuni dei registri possano essere parzialmente letti o scritti. In questo caso, impostiamo il byte superiore di AX (AH) su 1. Su processori a 32 bit, è anche possibile operare sui 16 bit bassi senza influire sui 16 bit superiori. Questa capacità di modificare registri parziali può essere utile per i programmatori di assembly, ma presenta degli svantaggi per i moderni processori che cercano di eseguire l' esecuzione fuori servizio , poiché possono introdurre dipendenze di dati falsi.

Lunghezza 9:

Ora per visualizzare effettivamente l'output:

68 00 B7 07 AB 40 79 FC C3

Tradotto in assembly:

; These two instructions set up ES, the 'extra segment'
push 0xb700 ; 3 bytes
pop  es     ; 1 byte
label:
stosw       ; 1 byte, Store Word - Copy AX to [ES:DI] then add 2 to DI
inc  ax     ; 1 byte
jns  label  ; 2 bytes, Jump Not Signed - Jump unless the sign flag is set (when inc AX yields 0x8000
ret         ; 1 byte

L'output è il set di caratteri predefinito ripetuto in diversi colori. Il byte basso di AX è il codice carattere e il byte alto specifica i colori da usare. Set di caratteri predefinito ripetuto in diversi colori

I programmi a 16 bit potevano indirizzare solo fino a 64 KiB direttamente. Per ovviare a questo, l'x86 utilizzava "segmenti" - registri speciali che sarebbero stati moltiplicati per 16 e aggiunti a tutti gli accessi alla memoria per dare 20 bit di memoria indirizzabile. Un programma potrebbe cambiare i valori di questi registri di segmento per accedere a più memoria - o aree speciali di memoria: questo programma modifica il segmento aggiuntivo per scrivere sulla memoria video. Diversi tipi di accesso alla memoria hanno utilizzato registri di segmenti diversi, consentendo a codice, dati e stack di essere accessibili contemporaneamente in diversi blocchi di memoria. Il segmento predefinito potrebbe anche essere ignorato per molte istruzioni.

Lunghezza 20:

Facciamo qualcosa di riconoscibile - useremo 'Rule 90' ​​per disegnare triangoli Sierpinski.

B0 13 CD 10 68 0F A0 1F AC 31 C2 88 94 3E 01 87 D3 93 EB F4

Nel montaggio:

mov al,13h      ; 2b
int 10h         ; 2b - Set the video mode to 13h

push    0xA00F  ; 3b
pop     ds      ; 1b - Set the data segment to video memory

start:          ; This loop runs 'Rule 90' to draw Sierpinski triangles
lodsb           ; 1b - load al with [ds:si] then increment si

xor     dx,ax   ; 2b - xor the left and right values of the previous row of pixels
mov     [si+318],dl ;4b - store result to memory

xchg    dx,bx   ; 2b - swap register values
xchg    ax,bx   ; 1b - swapping with ax is 1 byte shorter

jmp     start   ; 2b - infinite loop

Uscita campione: Triangoli di Sierpinski

Per questo programma, utilizziamo la famosa "Modalità 13", una modalità grafica che ha una risoluzione di 320x200 con 256 colori. È stato usato da molti popolari giochi DOS , come Doom.

Lunghezza 21

Vediamo chi ha prodotto la CPU su cui siamo in esecuzione.

0F A2 66 60 BB EE FF B9 0C 00 8A 17 43 B4 02 CD 21 E2 F7 FF E1

Tradotto in assembly:

cpuid         ; 2b  CPU ID - retrieve processor information based on the value in AX. For AX=0,
              ;     the 12 bytes in EBX, ECX, and EDX are loaded with a vendor identification string
pushad        ; 2b  Push all registers on the stack (32 bit version)
mov  bx,0xffee; 3b  Start of the vendor identification string on the stack
mov  cx,12    ; 3b  12 characters to print
print:    
mov  dl,[bx]  ; 2b  Character to print
inc  bx       ; 1b  Advance string position
mov  ah,2     ; 2b  Set AH to the 'Print character to STDOUT' value
int  21h      ; 2b  Call the bios interrupt to print
loop print    ; 2b  Decrement CX and jump if it is not zero
jmp  cx       ; 2b  Instead of restoring the stack, just jump right to the exit point

Uscita campione:

c:\misc>cpuid.com
GenuineIntel

Questo programma utilizza l'istruzione CPUID per ottenere informazioni sul processore su cui è in esecuzione, in particolare sulla stringa di identificazione del fornitore. La maggior parte delle persone vedrà "GenuineIntel" o "AuthenticAMD", a meno che non abbiano un produttore di CPU non comune o siano in esecuzione su determinate macchine virtuali.

Lunghezza 26

Ora possiamo fare animazioni interessanti

B0 13 CD 10 C4 07 BB 40 01 59 99 89 F8 F7 F3 31 D0 AA E2 F6 26 FE 05 47 EB FA

In Assemblea

mov al,13h     ;2b
int 10h        ;2b Enter Video Mode 13h

les ax,[bx]    ;2b Set ES to (roughtly) video memory
mov     bx,320 ;3b Set up  BX asdivisor
pop     cx     ;1b Zeroize CX

start:
cwd            ;1b Sign extend AX to DX, AX will never have the sign bit set so this zeroizes DX in 1 byte
mov     ax,di  ;2b Copy video memory pointer
div     bx     ;2b Divide by width to get AX = Y pos, DX = X pos
xor     ax,dx  ;2b X pos ^ Y pos
stosb          ;1b Store and increment video pointer
loop    start  ;2b CX starts at 0, so this will loop until it wraps around

cycle:
inc     byte [es:di];3b Increment value in video memory to animate
inc     di     ;1b Increment video memory pointer
jmp     cycle  ;2b Infinite loop 

E l'output sarà simile al seguente:

Marcia XOR

La funzione X pos ^ Y pos produce un frattale interessante, specialmente se animato

Lunghezza 27

Non solo puoi generare testo e grafica in un piccolo programma x86 .com, ma puoi anche generare suono e musica:

BA 31 03 B0 3F EE BA 30 03 B0 93 EE B4 01 CD 21 3C 1B EE 3C 1B B0 7F EE 75 EC C3

Nel montaggio:

    mov dx,0x331            ; value for the midi control port
    mov al,0x3F             ; command value to set midi mode to UART
    out dx,al               ; output the command to the midi control port
play_loop:
    mov dx,0x330            ; value for the midi data port
    mov al,0x93             ; midi instrument value (piano)
    out dx,al               ; output to midi data port
    mov ah,1
    int 0x21                ; read character from stdin, with echo
    cmp al,27               ; test if it is escape
    out dx,al               ; output the ascii value as the midi note to play
    mov al,0x7F             ; note duration
    out dx,al               ; output note duration
    jne play_loop           ; loop if escape was not pressed
    ret  

Questo programma utilizza la scheda midi per trasformare la tastiera in un piano. Per fare ciò, la scheda midi è impostata sulla modalità UART, che suona le note midi non appena vengono ricevute. Successivamente, il programma attende la pressione di un carattere e genera il valore ASCII come nota sulla scheda midi. Il programma funziona fino a quando non viene premuto Esc.

Lunghezza 29

Usiamo un sistema di funzioni iterate per generare un frattale Dragon Curve:

B0 13 CD 10 89 D0 01 CA 29 C1 D1 FA D1 F9 73 03 83 E9 7A B4 01 CD 16 B8 02 0C 74 E6 C3

Tradotto in assembly:

mov  al,13h
start:
int  0x10    ; This does double duty, setting the video mode to 13h at program start,
             ; and calling the 'draw pixel at coordinates' interrupt when looping
mov  ax,dx   ; The next couple instructions are our IFS, the algorithm is aproximately
add  dx,cx   ; f(y) = 0.5x + 0.5y
sub  cx,ax   ; f(x) = 0.5x - 0.5y OR f(x) = 0.5x - 0.5y - 1
sar  dx,1    ;
sar  cx,1    ;
jnc  skip    ; This jump handles pseudo-randomly switching between the two functions for x,
             ; based on if the previous value of x was odd or not.
sub  cx,122  ; Magic number, chosen since it provides sufficent 'randomness' for a filled in
             ; fractal and a good scale to the fractal. 102 and 130 also work.
skip:
mov  ah,1
int  0x16    ; Get keyboard state, zero flag will be set if no key has been pressed
mov  ax,0xC02; Set up AH for the draw pixel function when int 0x10 is executed,
             ; AL = color, CX = column, DX = row
jz   start   ; Loop if a key hasn't been pressed
ret  

Produzione:

Dragon Curve

Premendo un tasto non di controllo, il programma verrà chiuso. Questo è basato su Fire Coral di Desire su Pouet.net.

Lunghezza 52

Questo programma è un po 'una doppia funzionalità, mostra un po' del coprocessore a virgola mobile x87 e il codice di auto-modifica.

B3 07 D9 E8 B1 11 DE 0E 32 01 E2 FA BE 0A 24 56 B1 09 DF 34 AC D4 10 
86 E0 05 30 30 50 E2 F5 44 B4 2E 50 89 E2 B4 09 CD 21 FE 06 03 01 4B
75 D2 CD 20 0A 00

Quando eseguito, il programma produrrà diverse costanti matematiche:

1.00000000000000000
3.32192809488736235
1.44269504088896341
3.14159265358979324
0.30102999566398120
0.69314718055994531
0.00000000000000000

Questi sono One, Log2 (10), Log2 (e), Pi, Log10 (2), Log e (2) e Zero.

Nel montaggio:

org 100h

mov     bl,7         ;Counter for the total number of constants to print
start:
fld1                 ;Floating point constant to load on the FP stack,
                     ;start with 1 since it's op-code is the lowest

mov     cl,17        ;Multiply the constant by 10, 17 times to get the
mult:                ;printing part as an integer
fimul   word[ten]
loop    mult

mov     si,10+'$'*256;ASCII new line (10) and the end-of-string ($)
                     ;characters. These are used both as
push    si           ;a constant memory location, and stored to the
                     ;stack to format and printing

mov     cl,9         ;print 18 digits (9 pairs)
fbstp   [si]         ;store the integer part of the floating point
                     ;number on top of the FP stack as a packed
                     ;binary-coded decimal number (1 digit/nibble),
                     ;and then pop the number off the FP stack

convert:
lodsb                ;load a pair of packed digits

db 0xd4,16 ; AAM 16  ;ASCII Adjust For Multiply instruction using
                     ;non-standard base 16. This puts AL/16 in AH,
                     ;and AL%16 in AL, unpacking the digit pair.

xchg    ah,al        ;Swap the digit order
add     ax,'00'      ;Convert the digits to ASCII values
push    ax           ;Store digits on the stack
loop    convert

inc     sp           ;AX now holds the 1st 2 digits to print,
mov     ah,'.'       ;so to insert a decimal point, the 2nd digit
push    ax           ;is replaced with a '.', the stack pointer
                     ;is adjusted to overwrite 1 byte, and then
                     ;AX is pushed on the stack

mov     dx,sp        ;Load DX with the start of the print string
mov     ah,9         ;Load AH with the 'Print String' constant
int     21h          ;Call the 'Print String' interrupt to display
                     ;the constant

inc     byte[start+1];Self-modifying code - increment the load
                     ;floating point constant op-code to iterate
                     ;through all of them

dec     bx
jnz     start        ;Exit when all 7 constants have been printed
int     20h


ten: dw  10

La matematica in virgola mobile su sistemi x86 era originariamente gestita dal coprocessore x87 opzionale, non è stato fino al 486 che è stato spostato sullo stesso chip. L'x87 aveva anche un'architettura piuttosto diversa, era basato su stack, con 8 registri a 80 bit disponibili. Aveva anche una varietà di modalità di arrotondamento, precisione ed eccezioni mascherabili che potevano essere impostate.

Questo programma stampa i valori di sette costanti inseriti nei processori. Può sembrare strano che lo spazio delle istruzioni venga sprecato su costanti semplici come 0 e 1, ma tieni presente che il set di istruzioni è stato creato quando la memoria era piccola e queste istruzioni sono in genere 2 byte più piccole di operazioni equivalenti. Il programma utilizza anche un'istruzione oscura, FBSTP -'Store BCD Integer and Pop '. Ai tempi dello sviluppo di x86, le operazioni sui numeri BCD erano più comuni e x86 / x87 ha diverse istruzioni specifiche per semplificare la matematica BCD, come l'istruzione AAM "ASCII Adjust for Multiple" utilizzata anche nel programma.

Nel modello di memoria non protetto utilizzato dai primi programmi x86, non vi è alcuna distinzione tra dati e codice. Per questo motivo, è facile scorrere le istruzioni "Carica costante" codificate in sequenza semplicemente incrementando il valore appropriato.

Lunghezza 64

Pubblicando in modo incrociato la mia partecipazione alla Mandelbrot Challenge , è possibile scrivere un programma che visualizza un frattale Mandelbrot a colori 320x200 in soli 64 byte.

B0 13 CD 10 C4 07 99 89 F8 B9 40 01 F7 F1 83 E8 64 FE CE 31 DB 31 F6 
89 F5 0F AF F3 01 F6 0F AF DB 70 19 0F AF ED 70 14 01 EB 70 10 29 EB
29 EB C1 FB 06 01 D3 C1 FE 06 01 C6 E2 DB 91 AA EB C6

Nel montaggio:

mov al,13h ; set up graphics mode 13
int 10h

les ax,[bx]; trick to set video memory

FillLoop:
cwd
mov ax,di  ; di is the current position on screen
mov cx,320 ; convert di int x,y screen coordinates
div cx     ; CX is the iteration counter, exit the loop if it hits
           ; zero before the value escapes.
sub ax,100 ; center the fractal vertically
dec dh     ; center the fractal horizontally

xor bx,bx
xor si,si

MandelLoop: ; Fairly standard Mandelbrot routine,
mov bp,si   ; exits if the values overflow
imul si,bx
add si,si
imul bx,bx
jo MandelBreak
imul bp,bp
jo MandelBreak
add bx,bp
jo MandelBreak
sub bx,bp
sub bx,bp

sar bx,6   ; We use fixed point math with the lowest 6
add bx,dx  ; bits being the fractional portion, so this
sar si,6   ; rescales the values after multiplication
add si,ax

loop MandelLoop

MandelBreak:
xchg ax,cx ; Write the escape itteraction as the color
stosb
jmp FillLoop

Il risultato finale è questa immagine:

Frattale di Mandelbrot

Questo programma utilizza la matematica a virgola fissa per generare il frattale, poiché richiede meno byte. I 6 bit più bassi dei registri a 16 bit sono considerati la parte frazionaria del numero e i valori vengono riscalati dopo essere stati moltiplicati.


7
Di tutte le lingue da vedere su PPCG, non me l'aspettavo.
Alex A.

23
Wow. Più altri personaggi per renderlo un commento. Ma sul serio. Wow.
krs013,

2
@Michael Edenfield Ecco a cosa serve DOSBox!
Sir_Lagsalot,

1
20 byte Sierpinski è davvero impressionante.
qwr

1
Mi considero un buon programmatore, ma quando guardo questo devo ammettere la sconfitta.
Stephan Bijzitter,

121

Haskell

Potresti voler leggere dal basso verso l'alto. A volte mi riferisco a frammenti inferiori, ma mai a quelli superiori, quindi potrebbe aiutare a capire.

Lettori che non conoscono Haskell: sono chiaro? Quando non sono chiaro? Non so dirlo.

Lunghezza 86 frammento

Un'istanza pieghevole per la nostra struttura di dati dell'albero (snippet 23). Foldable è una classe di tipo - come in, una classe (/ gruppo) di tipi. Questi sono paralleli alle interfacce in Java. Si generalizzano essenzialmente sui tipi, unificando tipi che hanno caratteristiche comuni; ad esempio, possono essere aggiunti insieme ( Monoid), contenitori (Functor ), possono essere stampati come testo ( Show, che abbiamo già incontrato, nella showfunzione) e così via. Questo unifica tipi di dati che sono simili a una lista in quanto possono essere ripetuti o appiattiti in una lista.

In questo frammento, definiamo l'istanza definendo foldr, che essenzialmente scorre il tipo di dati da destra a sinistra. Ora possiamo usare un sacco di codice generale pre-scritto. Innanzitutto, definiamo una funzione di supporto per ottenere un albero singleton, per evitare tutto il disordine:s a = N E a E . Adesso:

sum (N (s 3) 7 (N E 5 (s 8))     === 23
product (N (s 3) 7 (N E 5 (s 8)) === 840
toList (N (s 3) 7 (N E 5 (s 8))  === [3,7,5,8]

e così via.

Ecco una foto del nostro albero:

7
| \
3  5
    \
     8

Lunghezza frammento 70

primes=sieve[2..] where
 sieve(p:xs)=p:sieve(filter(\x->x`mod`p/=0)xs)

Questo è un setaccio perfetto!

(nota: /=è cosa!= è in altre lingue)

Funziona definendo una funzione sieveche filtra l'elenco e mantiene solo i numeri che non sono divisibili per nessun precedente precedente. È definito in modo ricorsivo - to sieveè definito come dividere l'elenco in un primo elemento pe una coda, filtrare dalla coda qualsiasi numero divisibile per p, sieveil bit rimanente, collegarsi pall'inizio di quello e tornare.

Ancora una volta, stiamo lavorando con elenchi infiniti qui, ma il calcolo si interromperà nel tempo fino a quando non è necessario calcolare una quantità infinita di numeri primi.

take 4 primes === [2,3,5,7]

Lunghezza frammento 68

Finalmente un quine!

main=do putStr s;print s where s="main=do putStr s;print s where s="

Nella tua prima lettura, potresti pensare che all'output di questo quine manchino le virgolette, e perché dovresti scrivere putStruna volta e una volta print? Sembra lo stesso.

In Haskell, putStrè una funzione che stampa solo il contenuto della stringa che arriva a stdout; print, tuttavia, stampa le cose su stdout. Quindi, print 4è equivalente a putStr "4\n", ma putStr 4è privo di senso - 4non è una stringa! Quindi, quando printottiene un valore, prima lo converte in una stringa, quindi stampa quella stringa. Generalmente il modo per convertire le cose in stringhe è trovare il modo in cui le scriverei nel codice. Quindi, il modo in cui scriveresti la stringa abcin una stringa nel codice Haskell è "abc", quindi in print "abc"realtà stampa "abc", no abc.

Che fortuna ho abbastanza voti adesso, non dovrò giocare a golf queste cose

Snippet lunghezza 33:

main=go 0
go n=do print n;go(n+1)

La cosa importante da notare è che non abbiamo usato un loop. Haskell non esegue il loop. Haskell recluta. Haskell non ha anelli. È più profondo di così: Haskell non ha nemmeno il flusso di controllo . Come potresti chiedere? Bene, non ne ha bisogno.

Dai dettagli. Questo programma stampa una sequenza infinita crescente di numeri interi, a partire da 0. goli stampa a partire dal suo input, quindi lo mainchiama 0.

doè un potere sintattico speciale di Haskell. In questo scenario, combina solo le azioni I / O, proprio come >>fa (vedi snippet 22).

Lunghezza frammento 26:

map f=foldr(\x y->f x:y)[]

Questo definisce la mapfunzione, probabilmente familiare a tutti, utilizzando foldr. Si noti che sebbene non abbiamo dichiarato mapil tipo, il computer in qualche modo sa che il suo tipo è (a -> b) -> [a] -> [b], cioè dato una funzione da aa b, e un elenco di as, restituisce un elenco dib s.

Come lo sapeva ?? ;-)

Snippet di lunghezza 25:

main=putStr"Hello World"

Lo standard Hello World. Nota i tipi: mainha tipo di IO ()e putStrha tipo diString -> IO () (una funzione da stringhe ad azioni I / O che non restituiscono nulla).

Snippet di lunghezza 23:

data T a=E|N(T a)a(T a)

Questa è una definizione standard di un albero. Quanto più facile di tutte quelle linee richieste per definire un albero in Java, C o qualsiasi altra cosa.

(vedi frammento 10)

Analizziamolo:

data- questa dichiarazione dichiara un tipo di dati. T a- un albero contenente elementi di tipo a. Questo è il tipo che stiamo definendo. =- ogni valore di T asarà uno dei seguenti, separati da una pipe |. E- uno dei possibili valori di T s- l'albero vuoto. N (T a) a (T a)- l'altro possibile valore di un albero - un nodo. Ogni nodo è costituito dal figlio sinistro ( (T a)), dall'elemento ( a) e dal figlio destro ( (T a)).

Snippet lunghezza 22:

main=putStrLn"y">>main

Una yesfunzione di Haskell . >>è un operatore che combina e sequenzia due azioni I / O. Ha tipo di >> :: IO a -> IO b -> IO b.

mainè definito in modo ricorsivo da solo, come l'azione I / O che prima stampa "y"e poi fa qualunque cosa mainstessa.

Lunghezza frammento 18:

fix f=r where r=f r

Una definizione migliore per fix. (Vedi snippet 14.) Il problema con la prima definizione fix f = f(fix f)è che ogni volta che chiamiamo fix f fixrichiami fix f, che richiama fix f, generando infinite copie dello stesso calcolo. Questa versione lo risolve definendo r(risultato) come risultato; come tale f r = r,. Quindi, definiamolo r = f r. Ora torniamo r.

Lunghezza frammento 17:

f n=product[1..n]

Questo è il modo funzionale di definire fattoriale.

Lunghezza frammento 16:

f n=(\x->x+x+x)n

(\x -> x + x + x)è un lambda (qualcuno ha pensato che \assomigli alla lettera).

(\x -> x + x + x) nè la lambda applicata n(è esattamente la stessa n + n + n).

fè la funzione moltiplica per tre (anche f = (*3))

Lunghezza frammento 15:

sum=foldl (+) 0

Questo definisce la sumfunzione usando una piega. Una piega è fondamentalmente un ciclo sugli elementi di una lista con un accumulatore.
foldlprende come argomenti una funzione fe un valore iniziale xper l'accumulatore e un elenco xs. La funzione fdovrebbe ottenere come input il valore dell'accumulatore precedente e il valore corrente dell'elenco e restituisce l'accumulatore successivo.
Quindi piega scorre i valori dell'elenco, applicando fl'accumulatore precedente, quindi restituisce l'ultimo accumulatore.

Un altro modo di pensare alle pieghe è come la piega 'inserisce' ftra i valori dell'elenco e con l'accumulatore iniziale in uno dei lati. Ad esempio, foldl (*) 1 [4,2,5]valuta 1 * 4 * 2 * 5.

Snippet di lunghezza 14:

fix f=f(fix f)

Il ycombinatore. Di solito è chiamato fixperché trova il punto fisso dell'equazione f x = x. Nota che a x = infinite loopvolte può anche essere una soluzione, quindi fix (\x -> x^2 + 5*x + 7)non risolverà l'equazione x^2 + 4*x + 7 = 0ma restituirà invece un ciclo infinito.

Puoi anche notare che non sempre x = infinite loopè una soluzione, a causa della pigrizia di Haskell.

Questa versione è una perdita di tempo e spazio; lo ridefiniremo in uno snippet più lungo.

Snippet di lunghezza 13:

f=sum.map(^2)

Questo definisce la funzione f che ha dato un elenco restituisce la somma dei suoi quadrati. È la funzione composizione della funzione sum e la funzionemap(^2) , che a sua volta è la funzione map applicata alla funzione (^2) (il quadrato funzione ), che è a sua volta una sezione della funzione ^ (sezioni sono stati collocati a frammento 2, e composizione al frammento 3 ).

Come puoi vedere, le funzioni sono abbastanza importanti in un linguaggio funzionale come Haskell. In effetti, è stato detto che Haskell è il linguaggio con le funzioni di libreria più standard che ottengono funzioni come input o restituiscono funzioni come output (questo è comunemente noto come una funzione di ordine superiore .

A proposito, tecnicamente, ogni due o più argomenti- funzione è una funzione che restituisce funziona come uscite (questo è chiamato currying).

Snippet di lunghezza 10:

data B=T|F

Questa è una definizione di booleani di Haskell con nomi diversi. Il tipo booleano è chiamato B.
Questa definizione introduce due costruttori: true ( T) e false ( F).
Questo frammento di codice fondamentalmente dice al compilatore che ogni booleana ( B) o è vera ( T) o false ( F), o in altre parole, B=T|F.

In effetti, tutti i tipi di dati possono mai essere definiti in Haskell, quando in altre lingue il numero, i riferimenti e i tipi di dati dell'array richiedono un supporto speciale da parte del compilatore. In pratica c'è un supporto speciale in Haskell poiché sarebbe molto scomodo altrimenti, ma per esempio il Booltipo di dati è definito interamente in lingua.

Snippet di lunghezza 9:

main=main

Questo programma senza senso definirà mainprincipale. Poiché Haskell è pigro, i valori che richiederebbero un ciclo infinito per essere valutati possono essere usati liberamente se non utilizziamo il loro valore reale. Tali valori che contengono anelli infiniti, come il nostro main, sono chiamati "fondi".

Un fatto divertente è che il compilatore GHC Haskell è in grado di rilevare questo tipo di loop infiniti e di generare un'eccezione accettabile (!) Quando viene eseguito.

Lunghezza frammento 8:

f(x:_)=x

Questo definisce la funzione fche, dato un elenco non vuoto, restituirà la sua testa.

I pattern in Haskell sono come la sequenza di decompressione di Python, ma generalizzati per tutti i tipi. I pattern possono rifiutare o abbinare un valore e, se corrisponde, possono associare le variabili ai valori.

I modelli in questo frammento sono:

  • _: il modello che corrisponde a qualsiasi cosa e non lega alcuna variabile.
  • x: il modello che lega qualsiasi cosa e la lega alla variabile x.
  • :: questo modello arriva ai modelli del bambino, cioè uno per la testa e uno per la coda. Se l'elenco non è vuoto, li abbina alla testa e alla coda.

La corrispondenza dei motivi è altamente generalizzata. In effetti, la sola definizione di nuovi tipi di dati introdurrà automaticamente schemi per lavorare con essi.

Snippet di lunghezza 5:

x=2:x

Whoa, c'è così tanto da spiegare su questo.

Prima di tutto, Haskell è pigro. Ciò significa che le sottoespressioni saranno valutate solo quando strettamente necessario.

Nota: questo frammento di codice non mostra l'assegnazione, ma la definizione. Haskell non ha un incarico.

Questo frammento di codice definito x, un elenco infinito composto interamente da 2. Di solito in altre lingue xdeve essere valutato prima che 2:xpossa mai essere valutato, ma in Haskell possiamo farlo.

Gli elenchi infiniti di Haskell sono una sorta di mix di iteratori e normali elenchi collegati: agiscono come entrambi (un'iterazione su un intervallo utilizzerà memoria costante, per esempio).

Snippet di lunghezza 4:

2:[]

Questo frammento codifica solo l'elenco singleton [2]. :è l' operatore Contro di Haskell. In effetti, la sintassi dell'elenco normale è solo zucchero sintattico per l'operatore contro e l'elenco vuoto letterale. Ciò si lega strettamente al modo in cui Haskell si occupa della corrispondenza dei modelli e dei tipi di dati (in particolare il concetto di costruttore).

Snippet di lunghezza 3:

f.g

In Haskell, .sta per composizione delle funzioni. Haskell può essere scritto in uno stile "privo di punti", che è caratterizzato dal non nominare argomenti di funzioni e invece .dall'operatore per manipolare il flusso di dati.

Snippet di lunghezza 2:

1-

Quando questo codice è racchiuso tra parentesi (per motivi sintattici) viene chiamato "sezione". È quindi una funzione che, dato un certo numero, "riempie" il punto vuoto e restituisce meno un numero. Questa nozione è talvolta utile in un linguaggio funzionale come Haskell, dove altrimenti sarebbe necessaria una lambda.

Lunghezza frammento 1:

1

In Haskell, 1può essere sia un Int, Float, Double, Worde così via. In effetti, puoi scrivere codice per definire una versione di 1qualsiasi tipo e usarlo liberamente.
questo viene fatto anche in JavaScript, Python e così via, ma a differenza di quelli, viene eseguito con la massima sicurezza del tipo.

factoid:

Inizialmente, il comitato di Haskell intendeva chiamare la lingua "Curry" dopo il nome di Haskell B. Curry, ma decise di cambiare il nome in Haskell perché potevano sorgere alcuni giochi di parole. Solo più tardi notarono la somiglianza di Haskell con "Pascal" e "Hassle"!


non so se dovrei sostituire il factoide con il fatto che Haskell ha la maggior parte delle funzioni / operatori nella sua libreria standard che generano funzioni da altre funzioni (e che tecnicamente ogni due o più funzioni di parametro è tale). dovrei?
orgoglioso haskeller il

Mostralo in uno snippet e aggiungilo nella spiegazione.
Martin Ender,

f=0:1:zipWith(+)f(tail f) -- 25 chars, una funzione che restituisce un elenco calcolato in modo pigro dei numeri di Fibonacci.
chamini2

ho aggiunto un mucchio di frammenti e poi il mio computer si è spento
orgoglioso haskeller il

@proudhaskeller Risparmio op. Non l'ho mai fatto personalmente, ma se hai una modifica di grandi dimensioni da eseguire in una sola volta, puoi eseguire la modifica in un documento esterno con il salvataggio, quindi incollarlo al termine.
mbomb007,

99

C #

C # è un mix divertente e folle di funzionalità di Java, C, Haskell, SQL e un sacco di altre lingue, e offre molte funzioni e API davvero interessanti. È anche conosciuto da queste parti per essere piuttosto prolisso, ma vedremo cosa possiamo fare!

Ignorerò il solito boilerplate richiesto:

class Program { public static void Main(string[] args) { ... } }

Lunghezza 1:

;

I comandi sono terminati con punto e virgola in C #! Una riga vuota è una sintassi perfettamente valida.

Lunghezza 5:

x=5f;

Quando si specificano i numeri letterali in C #, il compilatore supporrà che siano ints o doppi (in base al fatto che abbiano un punto decimale). Se si desidera utilizzare un valore letterale float, è necessario specificarlo aggiungendo 'f' al numero, altrimenti verrà lanciato in fase di esecuzione, sostenendo un leggero costo.

Lunghezza 7 (byte):

s=@"
";

Se si antepone una stringa letterale con un segno @, questa diventa una stringa letterale "alla lettera". I letterali stringa normali analizzano sequenze di escape come '\ n' in caratteri speciali, ma i letterali letterali no, consentendo di utilizzare il carattere barra rovesciata senza sfuggirlo. Possono anche includere ritorni di riga, come mostrato. Ciò potrebbe farti risparmiare qualche byte nel golf o rendere più leggibili i tuoi letterali di stringa multilinea. Fai attenzione al rientro incluso nella stringa.

Lunghezza 8:

()=>x=y;

Questa espressione è una funzione anonima. Restituisce un oggetto di tipo Actionche può essere passato in giro e anche chiamato come una funzione. Le funzioni anonime ereditano l'ambito in cui sono state dichiarate e trascinano con sé qualsiasi variabile locale in quell'ambito ovunque vadano.

Lunghezza 9:

(a)=>a.p;

Ecco un'altra funzione anonima che utilizza un parametro e un valore restituito. L'espressione restituisce un oggetto di tipo Func(Func stessa restituisce il tipo di a.p. Userai Funcmolto per interfacciarti con Linq.

Lunghezza 10:

enm.Any();

Questa è la nostra prima introduzione a Linq! Linq è un insieme di metodi di estensione che possono essere richiamati su qualsiasi oggetto enumerabile (implementando l'interfaccia IEnumerable) - like Arraye List. IEnumerable si avvale di una valutazione pigra: passa attraverso la collezione un oggetto alla volta, senza conoscere la collezione nel suo insieme - potrebbe persino essere infinita!

Ecco dove Anyentra: ritorna truese l'Enumerable contiene almeno 1 elemento. Molto meglio che calcolare l'intera lunghezza.

Lunghezza 11:

var a=1.5f;

La varparola chiave indica al compilatore di determinare automaticamente il tipo di a. ain questo caso verrà digitato come Single. Molto utile per il golf del codice, in quanto è di gran lunga più breve di quasi qualsiasi nome di tipo, anche se a molti non piace usarlo nel codice di produzione.

Lunghezza 15:

yield return 0;

Ecco un'affermazione folle che potresti avere meno familiarità. Sai che gli oggetti possono essere enumerabili ereditando IEnumerable, ma sapevi che le funzioni possono essere enumerabili? Dichiarare una funzione con un tipo restituito di IEnumerablee averla yield returntutte le volte che vuoi. Quando si ottiene un Enumeratore per la funzione, ogni chiamata a GetNextfarà eseguire al programma tutto il codice fino al successivo yield return, restituisce quel valore e quindi mette in pausa fino a quando non lo si fa avanzare di nuovo. Utilizzi yield breakper terminare l'iterazione.

Lunghezza 16:

[Obsolete]int a;

Questo frammento mostra un attributo. Un attributo è un tipo di tag che puoi applicare a qualsiasi dichiarazione nel tuo codice. Alcuni danno istruzioni al compilatore di fare determinate cose, come questa che emette un avviso obsoleto se chiami a. Puoi crearne uno tuo estendendolo Attributee puoi interrogarlo usando Reflection (più avanti, forse). Puoi andare meta e limitare il tipo di dichiarazioni su cui un attributo può essere usato con l' AttributeUsageattributo.

Lunghezza 17

c.Count(t=>t==3);

Ecco un pratico metodo da golf. Dato Funcche associa un elemento dell'enumerabile ca bool, restituisce il numero di elementi in ccui Funcrestituisce true. Molto più bello che scrivere un ciclo.

Lunghezza 18:

foreach(T t in c);

Questo è un ciclo per ogni. Con tutto questo parlare di cose enumerabili, questa è una struttura molto necessaria. foreachè zucchero sintattico che imposterà un Enumeratore per c(che deve essere enumerabile) e itererà attraverso di esso un elemento talla volta. È possibile modificare o esaminare ogni singolo elemento, ma la modifica della raccolta stessa invaliderà l'enumeratore.

Lunghezza 19

c.Select(t=>t.a/2);

Questa è la tua funzione "mappa", per i fan della programmazione funzionale. Select è un bel modo conciso per eseguire una conversione arbitraria (definita da un Funcpassato) su ciascun elemento di un enumerabile. Restituisce un IEnumerable che sputerà gli elementi "convertiti" quando lo ripeterai.

Lunghezza 21

Console.Write("Hi!");

Questa riga scrive del testo su stdout ed è probabilmente uno dei motivi principali per cui C # non è molto utilizzato per giocare a golf!

Lunghezza 23

typeof(T).GetMethods();

C # supporta una funzionalità molto potente chiamata Reflection. Reflection consente di esaminare la struttura del codice in fase di esecuzione. Ad esempio, questa chiamata restituirà una matrice di tutti i metodi sul tipo specificato. È possibile esaminare tali metodi, chiamarli o persino modificare i valori di campi e proprietà. Gli attributi (vedi Lunghezza 16) sono un buon modo per taggare parti del tuo codice da usare con Reflection.

Lunghezza 25

from t in c select t.a/2;

Quello è SQL? Nel codice C #? Molto vicino. Questa espressione fa la stessa cosa di Lunghezza 19.

Lunghezza 27

for(var l;;l=new object());

C # è un linguaggio garbage collection, il che significa che qualsiasi memoria allocata (utilizzando la newparola chiave) può essere rilasciata automaticamente purché non esistano riferimenti ad essa. Questo codice funzionerà felicemente per sempre anche se non ho mai liberato esplicitamente la memoria creata. La raccolta dei rifiuti comporta tuttavia dei costi: cerca nel Web per saperne di più.

Lunghezza 29

var e=Enumerable.Range(0,99);

Enumerable.Rangeè una funzione da golf potenzialmente utile. Restituisce una struttura che può essere enumerata e produrrà ogni numero nell'intervallo specificato, in ordine. Il secondo parametro è un conteggio, non un indice.

Lunghezza 31

public int pr{get;private set;}

Qui, possiamo mostrare una semplice "proprietà", una funzione OOP e un altro segno distintivo di C #. Se hai mai usato Java, probabilmente hai creato metodi 'get' e 'set' per un campo al fine di separare la loro accessibilità o eseguire il codice quando viene modificato. Bene, C # ti consente di dichiarare quel codice in cima al campo e anche di impostare modificatori di accesso separati per ottenere e impostare. Questo particolare frammento crea automaticamente un getter e un setter predefiniti, ma rende il setter privato.

Lunghezza 32

public static void m(this T o){}

Questo frammento mostra una funzionalità C # che è utile per il design delle API. Applicando il thismodificatore al primo parametro di un metodo statico, quel metodo diventa un metodo di "estensione". Una volta dichiarato questo, T.mora può essere chiamato su qualsiasi oggetto di tipo T come se fosse in realtà un metodo di T. Questo può essere usato per aggiungere nuove funzionalità a qualsiasi classe esistente, senza modificare o persino avere accesso al suo codice sorgente.

Lunghezza 38

int f(int a,ref int b,out int c){c=0;}

Questo metodo mostra diversi tipi di passaggio di parametri che puoi avere in C #. I parametri non modificati vengono passati per valore . I parametri con prefisso refvengono passati per riferimento: è possibile assegnare loro un oggetto completamente nuovo e lo riporteranno fuori dal metodo. I parametri con prefisso outsono come valori di restituzione aggiuntivi: è necessario assegnare loro un valore nel metodo e vengono eseguiti come parametri di riferimento.

Lunghezza 42

Console.Write("It is \{DateTime.Now()}.");

Il nuovo standard C # 6 può farti risparmiare alcuni caratteri quando devi produrre stringhe assemblate, usando l'interpolazione di stringhe. Questa funzione consente di scrivere qualsiasi espressione tra parentesi graffe all'interno di una stringa letterale e la stringa verrà automaticamente assemblata con i valori di quelle espressioni in fase di esecuzione.

Lunghezza 48

IEnumerable f(){for(int a=0;;)yield return a++;}

Sono appena abbastanza personaggi per fare qualcosa con uno scopo reale! Questo metodo utilizza alcune delle idee che abbiamo esplorato sopra per creare un Enumerable infinito che restituirà semplicemente gli interi, uno per uno, a partire da 0. Ricorda che C # impiega una valutazione pigra con Enumerables, quindi una sequenza infinita è perfettamente valida - puoi iterare tutta la sequenza desiderata e scoppiare in qualsiasi momento.

Lunghezza 56

int p{get{return mP;}set{mP=Math.Max(value,0);}};int mP;

Ecco un altro esempio di "proprietà" (vedi frammento 31). Qui, ho effettivamente definito diversi frammenti di codice per gete setpiuttosto che usare quelli automatici come prima. Questo esempio dimostra come è possibile utilizzare una proprietà per convalidare il valore assegnato a una variabile: qui il valore non può diventare inferiore a 0. Altri buoni usi delle proprietà includono la notifica di un evento quando un valore viene modificato o la ricostruzione dei valori memorizzati nella cache che potrebbe essere basato su questo.

Lunghezza 65

int v;public static implicit operator int(Program o){return o.v;}

Questa funzione si chiama cast implicito. È un po 'come un metodo di estensione in quanto è un codice statico che opera su una classe specifica (vedi snippet 32). Tuttavia, il cast implicito non viene usato chiamandolo - viene usato semplicemente trattando un Programoggetto come intero (es int i=new Program().). Quando lo fai, l'oggetto verrà convertito silenziosamente nel tipo in cui lo stai usando, in base al codice nel cast implicito. Le migliori pratiche dicono di farlo solo quando nessuna informazione viene persa a causa della conversione.


1
Vediamo cosa sarai in grado di fare con questi personaggi ... ;-)
orgoglioso haskeller il

9
Direi che è più vicino a Java di C, in realtà
orgoglioso haskeller il

Notato. Penso che abbiamo quasi abbastanza per fare un po 'di Linq - in arrivo stasera!
BMac,

operatore statico implicito int (MyClass o) {return o.objVal;} // 65. Con questo codice, questa riga è valida: MyClass o1 = new MyClass (10); int o2 = o1; // o2 ora è 10. msdn.microsoft.com/en-us/library/85w54y0a.aspx
Zukki

Altri frammenti, per favore
Cyoce,

98

Giava


Lunghezza 44 frammento

Object a=System.out.append("Hello, World!");

Stampa Hello, World!su STDOUT.

Lunghezza 43 frammento

float[][][][][]a=new float[5][3][7][2][10];

acontiene 10 matrici che contengono ciascuna 2 matrici che contengono ciascuna 7 matrici che contengono ciascuna 3 matrici che contengono ciascuna 5 floats.

Lunghezza 42 frammento

interface A{static void main(String[]a){}}

Un programma completo Poiché tutto in un interfaceè intrinsecamente public, possiamo omettere la parola publicdal metodo principale.

Lunghezza 36 frammento

class A{class B extends A{B.B.B b;}}

Aha una classe interiore B. Questo significa che possiamo dichiarare una variabile di tipo A.B.

Ma Bè una sottoclasse di A, il che significa che ha tutti i metodi, i campi e le classi interne di A. Pertanto, possiamo fare riferimento anche al tipo B.B.

In questo codice, facciamo un ulteriore passo avanti e forniamo Buna variabile di istanza di tipo B.B.B.

La morale: seguire domande a caldo su SO può insegnarti molte tecniche interessanti, anche se inutili.

Lunghezza 35 frammento

l.stream().map("a"::equals).count()

Se lè un elenco di stringhe, questo ci dice quante di esse sono uguali "a".

Lunghezza 34 frammento

public static void main(String[]a)

Firma del metodo del metodo principale di un programma. Ancora altri 11 personaggi e possiamo creare un programma completo!

Lunghezza frammento 33

enum D {NORTH, EAST, SOUTH, WEST}

NORTH, EAST, SOUTH, E WESTsono tutte le costanti di tipo D.

Lunghezza 32 frammento

Files.readAllBytes("hello.txt");

Legge un intero file, restituendo un byte[]contenuto.

Lunghezza frammento 31

new String(new char[]{'h','i'})

Equivalente a "hi". Utile se la "chiave è rotta.

Lunghezza 30 frammento

new JFrame().setVisible(true);

Crea una nuova cornice visibile, in cui è possibile posizionare altri componenti.

Lunghezza frammento 29

throws ClassNotFoundException

Forza tutti i metodi che lo chiamano a usare un blocco try- catch, oppure a passare l'errore nello stack. Le eccezioni verificate sono una delle decisioni più controverse dei progettisti Java.

Lunghezza frammento 28

int f(int x){return f(x-1);}

Questa funzione non è attiva per sempre; infatti, su un tipico computer ci vuole meno di un secondo. Grazie, Stack Overflow.

Lunghezza del frammento 27

Object a=new String[]{"a"};

Crea un nuovo array di stringhe.

Lunghezza 26 frammento

Object.class.newInstance()

Crea un nuovo Object.

Lunghezza frammento 25

((Supplier)()->-~0).get()

È meglio evitare costanti codificanti. Questo è un modo orientato agli oggetti per ottenere il valore 1senza usare costanti diverse da 0.

Lunghezza 24 frammento

(Function<Long,?>)x->x+1

La funzione successiva.

Snippet di lunghezza 23

l.removeIf(x->x%10==0);

Se lè un elenco di numeri interi, questo rimuove tutti i valori divisibili per 10.

Lunghezza frammento 22

int i=(new int[7])[5];

Crea un nuovo array di sette numeri interi e ottiene il quinto elemento.

Lunghezza frammento 21

Arrays.asList(2L,"a")

Crea una ArrayList con questi elementi.

Lunghezza 20 frammento

System.out.print(s);

Stampe s.

Lunghezza 19 frammento

import java.util.*;

Permette l'uso di classi come concisa List, Map, Scanner, Timer, e Random.

Lunghezza 18 frammento

Math.addExact(x,y)

Aggiunge due numeri interi xe y. Se si verifica un overflow, il metodo genera un'eccezione anziché fornire una risposta errata.

Lunghezza frammento 17

Double.MIN_NORMAL

Il più piccolo valore positivo di tipo double, dove il bit iniziale del significato è 0.

Lunghezza 16 frammento

System.in.read()

Legge un singolo personaggio dalla console.

Lunghezza frammento 15

Long.reverse(x)

Inverte i bit nella rappresentazione binaria di x.

Lunghezza frammento 14

int x=050+120;

xè ora 160, poiché tutto ciò che inizia con 0viene trattato come ottale.

Lunghezza 13 frammento

private C(){}

Un costruttore privato impedisce ad altre classi di istanziarlo. Questo modello viene utilizzato dalle classi Systeme Math, tra gli altri. Un costruttore privato può anche essere usato per imporre il Singleton Pattern.

Lunghezza 12 frammento

static class

Consente la creazione di classi interne senza una classe esterna chiusa - una soluzione a un problema affrontato da molti programmatori .

Lunghezza 11 frammento

throw null;

Spesso è necessario lanciare un NullPointerException, ma è anche abbastanza prolisso. Questa è un'alternativa molto più semplice.

Lunghezza frammento 10

int[]a,b[]

Definisce due variabili: ae b. aè di tipo int[]ed bè di tipo int[][].

Lunghezza frammento 9

switch(x)

Va in un luogo, a seconda del valore di x.

Lunghezza 8 frammento

break a;

Scoppia fuori dal blocco etichettato a.

Lunghezza frammento 7

goto x;

La gotoparola chiave è riservata in C, C ++ e Java. Se xè un'etichetta, questo codice invia il programma all'etichetta appropriata, in C e C ++. Ma è Java, innesca un misterioso RuntimeException. In effetti, non c'è modo di usare la gotoparola chiave in Java.

Lunghezza 6 frammento

\u003b

Termina una dichiarazione. Java è strano .

Lunghezza 5 frammento

a-=-a

Raddoppia asottraendo la sua negazione.

Lunghezza 4 frammento

a&=b

Imposta il valore di aa bit a bit e di ae b.

Lunghezza frammento 3

...

Qualsiasi numero di argomenti, consolidato in un array.

Lunghezza 2 frammento

<>

Consente al compilatore di capire quale tipo generico intendi probabilmente. Molto poco simile a Java.

Lunghezza 1 frammento

@

Indica un'annotazione per consentire la visualizzazione di ulteriori informazioni su metodi e classi.

factoid

In Java, i cicli infiniti a volte causano errori del compilatore. Ad esempio, il ciclo while(true);non può essere terminato senza uscire dal metodo, quindi qualsiasi codice successivo provoca un errore di "istruzione irraggiungibile". Come ha sottolineato @Optimizer, solo alcuni loop infiniti verranno catturati in questo modo.


5
In Java, i loop infiniti non causano errori del compilatore. È il tuo IDE che li rileva e produce un errore. Java ha semplicemente un concetto di affermazioni irraggiungibili, quindi se hai qualcosa di simile while(true);nel tuo codice, tutto ciò che viene inserito dopo quella riga genererà un errore di compilazione dell'istruzione irraggiungibile. La logica alla base del rilevamento di tali affermazioni è molto rigorosa, quindi non riconoscerà in alcun modo tutti i loop infiniti
Ottimizzatore

4
Hai appena votato per difetto, suppongo che questo significhi che dovrai rimuovere uno snippet! ;) (Il downvote era per "Java è strano")
Simon Forsberg,

1
Sembra che lo snippet n. 36 sia ricorsivo e possa essere esteso indefinitamente: class A{class B extends A{B.B.B.B.B.B.B b;}}compila ancora.
Natix,

3
Eseguito l'upgrade per aiutarti a creare un programma completo;)
durron597,

1
But it Java, [goto] triggers a mysterious RuntimeExceptionSbagliato. gotonemmeno compilare.
Dorukayhan,

93

Pitone

Ora a partire dal più recente per la tua convenienza! Per leggere la lunghezza 30 a partire dalla prima, vai alla cronologia delle revisioni.

Se qualcuno ha suggerimenti, sentiti libero di commentare.

Lunghezza 52:

i=0
while s[i-n:]:print(' '*n+s)[i:n+i];i+=1;i**7**7

Tratto dalla mia partecipazione alla sfida Fake Marquee Text . se ndevono essere impostati prima su una stringa e un numero intero. In realtà non funziona bene nell'interprete gratuito di Python 2 che stavo usando, quindi ho aggiunto parentesi in giro (' '*n+s)[i:n+i]e puoi vederlo funzionare nell'interprete Python 3 qui .

Lunghezza 43:

#-*-coding:rot13-*-
cevag h"Una fubg svefg"

In Python puoi codificare il sorgente con un codec specifico. Questo mostra come la fonte può essere scritta in Rot13. La sintassi generale è questo: # -*- coding: <codec-name-goes-here> -*-.

Qui è tradotto:

#-*-coding:rot13-*-
print u"Han shot first"

I uspecifica che la seguente stringa letterale è una stringa Unicode. Questo è necessario se vuoi che anche le tue stringhe siano in Rot13, altrimenti ogni stringa nella sorgente è facilmente leggibile nonostante la crittografia. In alternativa, puoi usare .encode("Rot13")dopo ogni stringa (non dimenticare di usare Rot13 anche su questo.) Secondo questo articolo , alcune codifiche alternative sono “base64 ″,“ uuencode ”,“ zlib ”o“ bz2 ″.

Lunghezza 33:

import cmath
print cmath.sqrt(-1)

Questo è il modulo di Python per numeri complessi (immaginari) . Questo stampa 1j, dal momento che Python è conforme agli standard di ingegneria e utilizza jcome unità immaginaria, anche se preferisco i, che è più comunemente usato in matematica e usando je kin aggiunta a iper i quaternioni , ma sto divagando. Leggi il bug / ordine di modifica qui (non verrà modificato).

Lunghezza 30:

f=lambda n:n*f(n-1)if n else 1

Ora definiamo la nostra funzione fattoriale usando la ricorsione e il se-altro ternario! Per quanto ne so, questo è golf come in Python. Potrebbe anche essere scritto in questo modo: in f=lambda n:n and f(n-1)*n or 1mostra un paio di operatori booleani di Python (e anche composto da 30 caratteri). Vedi lo snippet di lunghezza 15 per informazioni sulla lambdasintassi.

Lunghezza 29:

import math
math.factorial(7)

Trova il fattoriale di 7, di ritorno 5040.

Lunghezza 25:

import math
print math.pi

Il modulo matematico di Python fornisce molte utili funzioni e costanti. Ecco PI. Ritorni 3.14159265359. (Nel codice sopra, ho contato la nuova riga come carattere.)

Lunghezza 24:

f=lambda y:lambda x:x**y

Questo è un esempio di chiusura. La chiamata cube = f(3)renderà una funzione cubica che può quindi essere chiamata con la print cube(24)stampa 13824.

Lunghezza 19:

print"Hello World!"

Finalmente abbastanza spazio per stampare un po 'di output di base! Lo spazio non è richiesto qui, perché anche le virgolette e le parentesi sono delimitatori. printFunzionerà solo in Python 2, poiché Python 3 ha cambiato la funzione per essere chiamata come qualsiasi altra funzione. In Python 3, usa print("Hello World!"). Per ulteriori informazioni sulla funzione di stampa e sulla differenza tra Python 2 e 3, vedere Novità di Python 3.0 .

Lunghezza 16:

[x*3 for x in l]

Ancora una volta, assume lsia un elenco o qualsiasi altro oggetto iterabile come una stringa o un generatore. Questa affermazione è nota come comprensione dell'elenco . È molto più breve rispetto all'uso dello standard per la struttura ad anello. Qui, restituisce un elenco con tutti i numeri moltiplicati per 3. ANCHE, le stringhe possono essere moltiplicate! Quindi qualsiasi stringa nell'elenco verrà aggiunta (concatenata a se stessa) quel numero di volte.

Lunghezza 15:

import this #:)

Questo è in realtà un frammento di lunghezza 11, ma mi sono reso conto di aver dimenticato di mostrare l' uovo di Pasqua (fantastico) di Python ! L'importazione di questo modulo stampa The Zen of Python (Vedi Factoid.) Fatto interessante: il modulo è this.pystato codificato in rot13, che spero di presentare in seguito.

Lunghezza 14:

lambda x:x**.5

Questo definisce una funzione radice quadrata usando la lambdasintassi di Python per una funzione letterale. I letterali di funzione in Python possono contenere solo espressioni, non istruzioni. Questo lambda può essere assegnato a una variabile, passato a una funzione o eseguito in linea con (lambda x:x**.5)(9), che restituisce 3.0. L'uso di esponenti per una radice quadrata è un'alternativa all'importazione della sqrtfunzione nel mathmodulo.

Lunghezza 13:

1 if x else 0

Questo è un esempio dell'operatore se ternario di Python. Questo è stato aggiunto in Python 2.5 per scoraggiare i programmatori dall'implementarlo manualmente con operazioni booleane. Qui, 1viene restituito se viene xvalutato True, altrimenti 0viene restituito.

Lunghezza 12:

s=input(">")

Questo stamperà >per il testo del prompt e consentirà all'utente di inserire un valore. Python 2 interpreta qualunque valore sia inserito, quindi ogni stringa necessita di virgolette. Python 3 lo ha modificato, in modo che l'input immesso non venga interpretato automaticamente. Per inserire l'input senza interpretarlo in Python 2, utilizzare raw_input(). In Python 2, input()è equivalente a eval(raw_input()).

Lunghezza 11:

eval("2e3")

2e3è una notazione scientifica per il galleggiante 2 x 10³. La evalfunzione interpreta e valuta qualsiasi stringa come espressione. In questo caso, ha lo stesso risultato dell'uso del valore letterale 2e3o float("2e3"). Ritorna 2000.0.

Lunghezza 10:

range(013)

Questa funzione restituisce un elenco di numeri interi dal 0valore ottale 013, che è 11(esclusivo), il che significa che l'elenco sarà [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]. La funzione richiede fino a tre parametri simili alla slicefunzione di che abbiamo recensito in precedenza: range(start, stop[, step]). La differenza è che con un solo parametro il parametro rappresenta il valore di arresto.

Nota che Python 3.x non ha equivalenti. È rangesimile, ma in realtà è lo stesso di Python 2 xrange, restituendo un oggetto generatore invece di un elenco.

Lunghezza 9:

a,b = b,a

Assegnazione multipla. Questa è una funzionalità semplice ma elegante, che consente di assegnare più valori contemporaneamente. Nello snippet fornito, scambia ae b. Che dire dell'ordine di valutazione, chiedi? Tutte le espressioni a destra dell'operatore di assegnazione vengono valutate prima di eseguire qualsiasi assegnazione. Questo batte molte lingue che richiedono un'assegnazione intermedia a una variabile temporanea.

Lunghezza 8:

#comment

Sai cos'è ... Aspetta, no? Sai, quelle cose che ti permettono di digitare un testo arbitrario per descrivere una riga di codice, facilitando la comprensione? No? Oh ok...

Lunghezza 7:

l[::-1]

Supponendo nuovamente che lsia un elenco, questo restituirà l'elenco in ordine inverso. Il terzo argomento indica la dimensione del passo. Dal momento che tutti e tre gli argomenti possono essere valori negativi, una dimensione del passo negativa significa iterare in ordine inverso. Il primo e il secondo argomento vuoti mostrano che stiamo ripetendo l'intera lista.

Stiamo arrivando a dove possiamo iniziare a usare alcuni costrutti più interessanti!

Lunghezza 6:

l[-6:]

Questa si chiama operazione slice . Se lè un elenco, verrà restituito un nuovo elenco contenente gli ultimi sei elementi lcome elenco. -6rappresenta l'indice iniziale (6 dalla fine) e i due punti significano continuare fino all'indice finale dopo di esso (che abbiamo lasciato vuoto, quindi fino alla fine). Se la nostra lista contenesse i numeri da 1 a 10, ciò ritornerebbe [5, 6, 7, 8, 9, 10].

Lunghezza 5:

1<x<5

Una delle fantastiche funzionalità di Python ti consente di concatenare gli operatori di confronto. In molte altre lingue, questo verrebbe digitato come 1 < x && x < 5. È ancora meglio se si considerano più confronti: 1 < x < y < 5è perfettamente valido!

Lunghezza 4:

0256

Un numero intero con uno zero iniziale è un valore ottale letterale. Questo è un bel trucco anche per l'offuscamento del codice. Questo restituisce il valore decimale 174. In Python 3.x, il valore ottale sarebbe scritto come 0o256.

Lunghezza 3:

`3`

Circondare un'espressione nei backtick è lo stesso dell'uso repr(), che restituisce la rappresentazione in forma di stringa di un oggetto. La funzione tenta di restituire la stringa in modo tale che quando viene passata come argomento alla evalfunzione, restituirà l'oggetto originale. E ' non è lo stesso che utilizzare str(), se i risultati sono a volte gli stessi. Per questo input, '3'viene restituito in entrambi i casi. Questo è uno dei miei preferiti per il codice golf!

Funziona solo in Python 2!

Lunghezza 2:

[]

Un elenco vuoto.

Lunghezza 1:

_

Il carattere di sottolineatura è un nome variabile usa e getta molto usato. Se stai usando una shell Python (interprete interattivo), tuttavia, contiene il risultato dell'ultima istruzione eseguita (e la restituirà di nuovo.) Inoltre, secondo questo thread , è anche usato per la ricerca della traduzione in i18n.

Factoid : Python è un linguaggio simile a Java e C. Fu costruito con una specifica filosofia di progettazione (tratta da " PEP 20 - The Zen of Python ":

  • Bello è meglio che brutto
  • Esplicito è meglio che implicito
  • Semplice è meglio di complesso
  • Complesso è meglio che complicato
  • La leggibilità conta

Per questo motivo, sebbene i punti e virgola siano consentiti come delimitatore di istruzioni, in genere vengono omessi a favore dell'utilizzo di più righe per la leggibilità. Inoltre, il rientro di riga è molto importante!


In qualsiasi momento! Non aggiungerò più frammenti (non ho resistito a quello Lunghezza 9!), Dal momento che stai già facendo un ottimo lavoro. In bocca al lupo!
nasser-sh,

1
lunghezza 6: tornerebbe [5, 6, 7, 8, 9, 10](gli ultimi 6 numeri nell'elenco)
Vincent

Lunghezza 16: lnon deve essere un elenco, può essere qualsiasi oggetto iterabile; tuple, elenchi e generatori, ad esempio, funzionano tutti
nasser-sh,

@ Sp3000: l'ho usato con sfide [fonte limitata].
Robbie Wxyz,

4
Nessun amore per il buon vecchio import antigravity?
Cipher

87

JavaScript

Questo va dal più recente al più vecchio. Link per me stesso: [ modifica ]

Snippet di lunghezza 51:

console.log(require('fs').readFileSync(__filename))

A Node.JS questa volta, anche se non soddisferebbe alcun requisito "rigoroso", a causa della lettura del proprio codice sorgente.

Lunghezza frammento 50:

a=new XMLHttpRequest;a.open('GET','file');a.send()

Finalmente! Una richiesta AJAX (utilizzando Vanilla.JS ). Inizializziamo, apriamo e inviamo la richiesta, ma ho esaurito lo spazio per aggiungere gestori e effettivamente fare qualsiasi cosa con il risultato.

Snippet di lunghezza 49:

msg=new SpeechSynthesisUtterance('Hello World!');

Prepara una voce "Hello World!". Sarà un po 'più di lavoro per parlarne davvero. Possiamo anche regolare volume, intonazione, frequenza e accento. Vedi API di sintesi vocale su HTML5Rocks . Non ancora supportato da Firefox, sicuramente non IE .

Lunghezza frammento 48:

function repeat(){setTimeout(repeat,48)}repeat()

Simula setIntervalricorsivamente setTimeouting.

Lunghezza frammento 47:

module.exports=function MyModule(a) {this.a=a};

Di nuovo NodeJS, ma il principio è lo stesso ovunque in JS. Questa è una funzione di costruzione molto semplice, che crea un oggetto con una proprietà ( a). L'impostazione module.exportsesporta la funzione per usarla require().

Lunghezza 46 frammento:

canvas.getContext('2d').fillRect(46,46,46,46);

Ciò richiede un <canvas id="canvas"></canvas>elemento. Sfrutta il fatto che gli elementi con ID sono popolati come variabili globali, quindi l'elemento è accessibile come canvasda JS. Quindi lo riempiamo con un quadrato 46x46 a x = 46, y = 46.

Lunghezza frammento 45:

JSON.parse(require('fs').readFileSync('jsn'))

Torna al nodo. Qui, analizziamo un file JSON chiamato jsndalla directory corrente.

Lunghezza 44 frammento:

(a=document.createElement('a')).href="/url";

Basandosi sul n. 39. Ora creiamo un elemento e assegniamo un attributo. Tuttavia non è ancora nel DOM.

Lunghezza 43 frammento:

sq=[1,2,3,4,5].map(function(n){return n*n})

Crea una matrice dei primi 5 quadrati, usando map().

Lunghezza 42 frammento:

six="1+5",nine="8+1";eval(six+' * '+nine);

Questo funziona sullo stesso principio come questo , ma JS manca #definee così finisce più brutto. Restituisce, ovviamente, la risposta alla vita, all'universo e a tutto .

Snippet di lunghezza 41:

c=function(){var i;return function(){}}()

L'inizio di una chiusura. cè ora una funzione (quella interna) con accesso alla variabile interna i, ma non fa nulla.

Lunghezza 40 frammento:

$('p').click(function(){$(this).hide()})

Stiamo abbandonando totalmente quei paragrafi e usando jQuery.

Lunghezza 39 frammento:

script=document.createElement('script')

Questo è l'inizio dell'aggiunta di un nuovo script esterno. Crea un <script>elemento vuoto e mantieni un riferimento ad esso.

Lunghezza 38 frammento:

document.getElementsByClassName('abc')

Trova tutti gli .abcelementi nel documento. Certo, con jQuery, è solo $('.abc')...

Lunghezza frammento 37:

b=JSON.parse(JSON.stringify(a={3:7}))

Crea due oggetti identici, ma disaccoppiati a, e b. Se lo faresti

a={a:1};
b=a;
b.a=3;

finiresti con a=={a:3}, perché ae bpunta allo stesso oggetto. Usiamo JSON per disaccoppiarli.

Snippet di lunghezza 36:

(function f(){return "("+f+")()"})()

Un quine . Stampa il proprio codice sorgente.

Lunghezza frammento 35:

document.body.style.display="none";

Vedi # 32. Questo nasconde semplicemente il documento, senza sovrascrivere il contenuto.

Snippet lunghezza 34:

Object.prototype.toString.call(34)

La chiamata Object.prototype.toStringè un buon modo per dire il tipo di un oggetto. Mentre 34..toString()è "34", lo snippet è [object Number].

Snippet di lunghezza 33: (il merito per questo va a un utente anonimo )

+0%-0.&(v\u0061r=~void[{}<<!(0)])

Pensi che questo non sia JavaScript valido? Meglio provarlo ... (usa Chrome);)

Lunghezza 32 frammento:

document.body.innerHTML="hacked"

Halp! Hazxxors! Undici !! 11!

Snippet di lunghezza 31:

a=[];for(i=0;i<31;i++)a.push(i)

Non sto scherzando, ho aspettato così tanto tempo per poter effettivamente utilizzare un forloop! Questo crea un array da 0-30.

Lunghezza frammento 30:

new Date().getDay()==1?"S":"E"

Prima volta usando l'operatore ternario. Non potrei adattarmi più di questo in 30 caratteri, quindi sappiamo solo se oggi è domenica o qualcos'altro. : P

Lunghezza frammento 29:

Object.keys(window).push('i')

Object.keys(window)otterrà una matrice delle variabili globali (proprietà di window). .push()aggiungerà un elemento a quell'array. Pensi che questo sia l'equivalente di window.i=undefined? No!

Lunghezza frammento 28:

setTimeout("a=confirm()",28)

Attendere 28 millisecondi non è così utile, tranne per la creazione di un nuovo thread.

Snippet di lunghezza 27:

document.querySelector('a')

È un peccato che i nomi DOM siano così lunghi. Potrei ottenere solo un singolo link qui.

Lunghezza frammento 26:

JSON.stringify({twenty:6})

Vedi # 16. Ora otteniamo il vero JSON - una stringa.

Snippet di lunghezza 25:

new Badge("Good Answer");

Supponendo che Badge()sia una funzione di costruzione che accetta un argomento ... è stato appena creato un badge di buona risposta !

Lunghezza frammento 24:

do {alert(24)} while(!1)

In realtà non uso do..whilemolto, ma alcuni lo fanno. Se questo fosse un normale whileciclo, non avviserebbe nulla, perché è sempre falso. do..whilefunzionerà sempre almeno una volta, quindi vedremo 24.

Snippet di lunghezza 23:

window.parent==self.top

Tutti si riferiscono allo stesso oggetto, generalmente noto come window. Se chiamate una funzione normalmente, c'è anche this. Ecco 5 modi per accedere all'oggetto globale!

Snippet lunghezza 22:

for(i in self)alert(i)

Avvisa tutte le variabili globali. Capita di essere quello self==window. (Vedi il frammento successivo.)

Snippet di lunghezza 21:

"2"+1==21 && 2+1=="3"

Oh guarda, sono di nuovo le regole di casting di JS. Questa affermazione è vera, a proposito.

Snippet di lunghezza 20:

Math.random()<.5?0:1

Scegli un numero casuale da 0-1 e arrotondalo usando l'operatore ternario. Anche se sarebbe più facile da usare Math.round...

Lunghezza frammento 19:

[1,2,3].map(i=>i*i)

Questo è nuovo. Davvero nuovo. Utilizza le funzioni della freccia ES6 per calcolare i quadrati di 1, 2 e 3. Attualmente, sembra essere supportato solo da Firefox.

Lunghezza frammento 18:

location.href="/";

Come il n. 15, ma questa volta va sulla homepage di PPCG, non su SE.

Lunghezza frammento 17:

(function(){})()

È lo snippet del 14, ma meglio! Ora è un IIFE.

Lunghezza frammento 16:

obj={not:'json'}

Questo spiega uno dei miei animali domestici. Questo è un oggetto , non JSON ! JSON è un formato di scambio di dati basato su oggetti JavaScript, ma in un formato più rigoroso.

Lunghezza frammento 15:

open('//s.tk/')

Immaginalo. Apri la home page di SE, utilizzando il http://s.tk/ reindirizzamento.

Snippet di lunghezza 14:

function f(){}

W00t! Funzioni! Peccato che non ci sia spazio per fare nulla.

Snippet di lunghezza 13:

Math.random()

Genera un numero casuale da 0 a 1. Vuoi definire i tuoi limiti? Buona fortuna (Non proprio, è facile.)

Lunghezza frammento 12:

new Date<=12

Questa affermazione non è mai stata vera in JS. JS non è stato creato fino al '95 (vedi factoid), molto tempo dopo il 1/1/1970 00: 00: 00.012.

Lunghezza frammento 11:

Math.PI*121

L'area di un cerchio con raggio 11.

Snippet di lunghezza 10:

if('j')9+1

Nel caso non l'avessi notato, mi piace fare qualcosa con il numero dello snippet nel codice. Questo restituisce 10 e usa j, la decima lettera dell'alfabeto.

Snippet di lunghezza 9:

[9].pop()

Crea un array con un oggetto. popva la donnola 9.

Lunghezza frammento 8:

document

La base per tutto il lavoro DOM. Ma non possiamo fare nulla, perché è troppo lungo. :( Vai a jQuery!

Lunghezza frammento 7:

alert()

Oh ragazzo! Una chiamata di funzione! Finalmente riuscire a fare cose!

Snippet di lunghezza 6:

var x=6

Basato su # 3. Molto meglio, però, perché ora il globale è esplicito . : P

Snippet di lunghezza 5:

[][5]

Ancora più corto di quello void 0di ottenere undefined. A proposito: ''.aè ancora più breve; solo 4 caratteri.

Snippet di lunghezza 4:

+"4"

Questo creerà il numero 4fuori dalla stringa "4". Puoi riutilizzare esattamente gli stessi 4 caratteri in un ordine diverso per fare il contrario!

Snippet di lunghezza 3:

x=3

Oh dang, abbiamo appena creato una variabile globale implicita ...

Snippet di lunghezza 2:

{}

Cosa fa questo? Se hai detto che crea un oggetto letterale, ti sbagli. In realtà è un blocco vuoto. Apri una console e provalo! Ritorna undefined, no {}.

Nel 2018, {}nella console di Chrome in realtà restituisce un oggetto vuoto.

Lunghezza frammento 1:

1

Questo è tutto. Qualsiasi numero è un'espressione JS valida.

Factoid: JavaScript era originariamente chiamato LiveScript. All'epoca è stato modificato in JavaScript per sfruttare la popolarità di Java (1995). Personalmente, avrebbero dovuto mantenere il vecchio nome; JavaScript è stato fonte di confusione da allora. Il fatto è che Java e JavaScript sono simili quanto "auto" e "tappeto" .


1
Snippet 33 non funziona su Firefox. È davvero valido JS?
Oriol

Trovo stringere e replicare un oggetto per copiarlo così sporco. ECMAScript 6 introduce Object.assign, quindi lo snippet 37 diventa b = Object.assign({ }, a = {3 : 7}).
Oriol,

@Oriol Sì, beh, solo Firefox lo supporta in questo momento, quindi per ora dobbiamo attenerci al modo sporco. Almeno è meglio di eval(uneval(a)), vero? ;)
Scimonster il

Circa # 38, c'è sempre document.querySelectorAll("element#id.classname[attribute]:not(somethingwedontwant)"). (Supporta qualsiasi selettore CSS valido).
Mateon1,

Lo snippet # 40 in sé non è così interessante, ma il commento non ha prezzo.
Scimonster,

85

R

Factoid: il linguaggio di programmazione R è iniziato come un'implementazione GNU del linguaggio di programmazione S. Viene utilizzato principalmente per statistiche e applicazioni correlate.

Nota: sebbene non sia un requisito della concorrenza, ogni frammento qui può essere eseguito da solo in R.


Lunghezza 32:

`[.data.frame`(swiss,3,2,drop=F)

Sembra un po 'misterioso ... e davvero dovrebbe! C'è un modo molto migliore per scrivere questo:

swiss[3, 2, drop = FALSE]

Dovrebbe apparire un po 'più familiare. Ecco cosa succede quando eseguiamo uno di questi pezzi di codice:

> `[.data.frame`(swiss,3,2,drop=F)
             Agriculture
Franches-Mnt        39.7

Il swissframe di dati viene fornito con R come molti altri che abbiamo visto finora. Contiene fertilità e indicatori socioeconomici per 47 province francofone della Svizzera intorno all'anno 1888. La terza fila è per la provincia Franches-Mnt, e la seconda colonna è la percentuale di maschi coinvolti nell'agricoltura come professione in ogni provincia. Quindi, nel 1888, il 39,7% dei maschi nella provincia di Franches-Mnt in Svizzera lavorava in agricoltura.

Quando si estraggono righe o colonne da un frame di dati utilizzando la notazione più semplice, R viene effettivamente utilizzato [.data.framein background. Come abbiamo visto nello snippet 24, praticamente tutto può essere definito come un nome di funzione purché sia ​​racchiuso tra segni di spunta, quindi il nostro snippet qui è legittimo anche se il nome della funzione contiene tecnicamente parentesi senza pari.

L' drop=argomento dice a R se vuoi che il risultato venga lasciato cadere in una dimensione inferiore, se possibile. Infatti, se diciamo drop=TRUE, otteniamo questo:

> `[.data.frame`(swiss,3,2,drop=T)
[1] 39.7

Dove prima il risultato era un frame di dati, R ora ci dà un doppio.


Lunghezza 31:

print(fortune("hadleywickham"))

La fortune()funzione proviene dal fortunespacchetto onnisciente , che fornisce una varietà di citazioni sagge da una varietà di persone sagge. Questo frammento ti fornirà la seguente gemma di Hadley Wickham (23) stampando sulla console:

That's a casual model, not a causal model - you can tell the difference by looking
for the word "excel".
    -- Hadley Wickham (commenting on an Excel chart showing student's SAT score
       increases with family income, without considering future covariates)
       http://twitter.com/#!/hadleywickham (February 2012)

Lunghezza 30:

pie(rep(1,12),col=rainbow(12))

Chi non ama un buon grafico a torta? La pie()funzione ti servirà un grafico a torta appena sfornato basato su un vettore di numeri. rep()crea un vettore ripetendo il primo elemento r volte in cui r è il secondo argomento. Il col=parametro indica pie()come colorare le sezioni. La funzione magica rainbow()genera un vettore di una lunghezza specificata contenente i codici esadecimali per i colori dell'arcobaleno "equidistanti".

Quello che hai qui è il grafico di base "Quantità di ogni colore in questo grafico":

inserisci qui la descrizione dell'immagine


Lunghezza 29:

summary(lm(mag~depth,quakes))

Ci sono alcune cose che succedono qui, quindi facciamo un passo alla volta.

quakesè un set di dati fornito con R. Contiene informazioni su 1000 eventi sismici di magnitudo maggiore di 4,0 sulla scala Richter vicino alle Figi dal 1964. Due delle colonne nel set di dati sono mag, che è l'entità del terremoto e depthche è la profondità dell'epicentro in chilometri.

La lm()funzione, come menzionato nello snippet 28, si adatta ai modelli lineari. Restituisce un lmoggetto, o più precisamente, un oggetto di classe lm. Esistono due modi per specificare il predittore (o variabile indipendente ) e la risposta (o variabile dipendente ) e ho scelto il metodo formula. Questo prende la forma response ~ predictor. I predittori multipli sono specificati come y ~ x1 + x2. Gli oggetti nella formula vengono valutati nel contesto fornito nell'argomento successivo.

Quindi, ciò che lm(mag ~ depth, quakes)sta facendo è adattamento di un modello lineare utilizzando la regressione dei minimi quadrati ordinaria in cui magnitudo è la risposta e profondità è il predittore. Sa cosa mage depthsono perché gli abbiamo detto che provengono quakes.

summary()è una funzione generica utilizzata principalmente per riassumere i risultati dei modelli montati. Invoca un metodo particolare per la classe del suo argomento. Dal momento che abbiamo passato un lmoggetto, in realtà sta invocando una funzione chiamata summary.lm().

Mettendo tutto insieme, otteniamo il riassunto del modello lineare che tenta di spiegare il terremoto dalla profondità del terremoto. In particolare, questo è ciò che R sputa:

> summary(lm(mag~depth,quakes))

Call:
lm(formula = mag ~ depth, data = quakes)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.72012 -0.29642 -0.03694  0.19818  1.70014 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  4.755e+00  2.179e-02 218.168  < 2e-16 ***
depth       -4.310e-04  5.756e-05  -7.488 1.54e-13 ***
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.3921 on 998 degrees of freedom
Multiple R-squared:  0.05319,   Adjusted R-squared:  0.05225 
F-statistic: 56.07 on 1 and 998 DF,  p-value: 1.535e-13

Notare come la prima cosa che ti dice è la chiamata di funzione? Questo perché la lm()funzione utilizza match.call(), proprio come abbiamo fatto nello snippet 28!


Lunghezza 28:

f<-function(x,y)match.call()

Le funzioni R spesso amano tenere traccia di ciò che dici loro. In effetti, a volte il comando che hai inviato ti viene restituito come attributo dell'oggetto restituito. (Un esempio è lm(), che crea modelli lineari.) Il richiamo delle istruzioni precise è realizzato usando match.call()all'interno della funzione. Questo acquisisce o abbina la chiamata di funzione interpretata.

Qui abbiamo definito una funzione f()che accetta due argomenti e poi ti dice cosa ha visto.

> f(1,2)
f(x = 1, y = 2)

Questo è utile soprattutto quando si sviluppano funzioni per uso generale (piuttosto che solo per te), come nello sviluppo di pacchetti. Se vuoi vedere un esempio di match.call()in the wild, guarda il codice sorgente lm()inviando stats:::lm. Una delle prime cose che fa è catturare la chiamata di funzione usando match.call().


Lunghezza 27:

install.packages("ggplot2")

Questo può sembrare banale, ma mostra uno dei motivi per cui R è così popolare: è facilmente estensibile attraverso i pacchetti. E chiunque può sviluppare e condividere liberamente i propri pacchetti!

install.packages()fa esattamente ciò che suggerisce il suo nome. Va a caccia di pacchetti usando il tuo mirror CRAN (Comprehensive R Archive Network) predefinito, quindi li installa sul tuo sistema dove R li trova. Puoi anche far installare i pacchetti dal codice sorgente locale.

Ricordi lo snippet 23 dove abbiamo usato il ggplot2pacchetto? Quel pacchetto non viene fornito con R, ma in soli 27 caratteri puoi realizzare tutti i tuoi ggplot2sogni installandolo.


Lunghezza 26:

filled.contour(t(volcano))

Il volcanoset di dati viene fornito con R. È una matrice contenente informazioni topografiche sul vulcano Maungawhau (o Monte Eden) ad Auckland, in Nuova Zelanda. Le file della matrice corrispondono alle linee della griglia che vanno da est a ovest e le colonne sono linee della griglia che vanno da sud a nord.

Per motivi di disorientamento, scambiamo le direzioni, quindi le colonne sono ora est-ovest e le file sono sud-nord. Possiamo farlo usando una matrice di trasposizione, realizzata tramite t(). E perché non creare una mappa di contorno mentre ci siamo? filled.contour()fa proprio questo.

inserisci qui la descrizione dell'immagine


Lunghezza 25:

pmatch("s",c("n","size"))

La pmatch()funzione fornisce la magia dietro tutta la corrispondenza parziale che abbiamo visto finora. Il primo argomento è una stringa che viene confrontata con ogni elemento del secondo argomento, un vettore. Se esiste una corrispondenza univoca, viene restituito l'indice dell'elemento corrispondente, altrimenti si ottiene NA.

Lo snippet qui è un esempio "reale" dell'uso di questa funzione. Ripensa allo snippet 13 in cui abbiamo utilizzato la sample()funzione. Si accetta argomenti n, size, replace, e prob, ma richiede solo i primi due. Nel frammento 13 abbiamo usato s=come scorciatoia per size=. Ciò che sta realmente accadendo in background è qualcosa di simile a questo frammento, in cui ciò che abbiamo fornito viene confrontato con ciò che ci si aspetta. Poiché la "s" corrisponde alla "dimensione" in modo univoco, è del tutto legittimo utilizzare s=come stenografia.


Lunghezza 24:

`(`=function(x)9;2*(3-1)

Un esempio perfetto di qualcosa che non dovresti fare! Mai!

È possibile assegnare caratteri come funzioni purché siano racchiusi tra i segni di spunta quando si definisce la funzione. Qui abbiamo detto a R che (è una funzione che restituisce sempre 9 indipendentemente dall'input. Come in molte altre lingue, ;può essere utilizzato per includere due comandi su una riga. Quindi quello che abbiamo detto a R è definire la funzione (, quindi stampare 2*(3-1).

Ora, quasi ogni persona ti direbbe che 2 * (3-1) dovrebbe essere 4 perché fai 3-1 = 2, quindi 2 * 2 = 4. Ma abbiamo detto a R che qualsiasi cosa tra parentesi è 9. Quindi mentre 3-1 = 2, ora abbiamo (3-1) = 9. Quindi otteniamo 2 * (3-1) = 2 * 9 = 18.

Poiché sono possibili cose terribili come questa, ogni volta che invii codice che contiene parentesi in un'espressione (cioè non una chiamata di funzione), l'interprete R cerca effettivamente qualsiasi funzione chiamata (indipendentemente dal fatto che tu sia definita (come funzione. In generale, più scrivi, più lavoro fa l'interprete R.


Lunghezza 23:

qplot(Na,y=RI,data=fgl)

Finalmente abbastanza voti per un (molto) semplice ggplot2esempio. Il ggplot2pacchetto è un'implementazione R della Grammatica della Grafica, creata dalla leggendaria divinità R Hadley Wickham . In generale, la sintassi è molto diversa dalla grafica di base R e richiede un po 'di tempo per abituarsi. Tuttavia, qplot()è un'interfaccia più semplice per alcune delle funzionalità principali del pacchetto e ha una sintassi simile alla plot()base R. Ma a differenza di molti degli esempi che ti ho mostrato, qplot()non supporta la corrispondenza parziale dei nomi dei parametri delle funzioni.

Il fglset di dati proviene dal MASSpacchetto. Contiene misure di proprietà di frammenti di vetro forensi. Qui stiamo usando le variabili Na, che è la percentuale di sodio (Na) in peso e RIche è l'indice di rifrazione del vetro.

inserisci qui la descrizione dell'immagine


Lunghezza 22:

unique(presidential$n)

La unique()funzione restituisce un vettore contenente i valori univoci dal suo vettore di input nell'ordine in cui appaiono nell'input. Il presidentialset di dati viene fornito con il ggplot2pacchetto (27). (Grazie a Jemus42 per averlo corretto!) La sua descrizione:

I nomi di ciascun presidente, la data di inizio e di fine del loro mandato e il loro gruppo di 10 presidenti degli Stati Uniti da Eisenhower a Bush W.

presidentialè un frame di dati e i frame di dati contengono colonne proprio come gli elenchi contengono elementi. Le colonne sono referenziate per nome usando $. Questo particolare set di dati ha una colonna chiamata name, contenente il nome del presidente. Ma aspetta, abbiamo solo specificato n! In realtà, questo è un altro esempio di corrispondenza parziale (13, 16), quindi nè totalmente legittimo.

L'invio di questo ha un risultato interessante:

[1] "Eisenhower"  "Kennedy"  "Johson"   "Nixon"  "Ford"  "Carter"
[7] "Reagan"      "Bush"     "Clinton"

Nota come si scrive il nome di Lyndon B. Johnson ... Oops.

(Nota: più di un anno dopo averlo pubblicato, mi è venuto in mente che l'errore di battitura di Johnson è stato corretto. Umorismo RIP.)


Lunghezza 21:

integrate(dexp,0,Inf)

R ha una funzione integrata per la quadratura adattativa di funzioni di singola variabile su un intervallo finito o infinito. In R, l'infinito è specificato come Infper + infinito e -Infper -infinito. La dexp()funzione è la funzione di distribuzione di probabilità per la distribuzione esponenziale. Poiché il supporto della distribuzione esponenziale è [0, + infinito) e le distribuzioni di probabilità si integrano a 1, ci aspetteremmo che il risultato sia 1. Ecco, un risultato atteso!

1 with absolute error < 5.7e-05

Lunghezza 20:

deriv(~cos(x^3),"x")

R può fare derivati ​​simbolici! Questo ritorna:

expression({
    .expr1 <- x^3
    .value <- cos(.expr1)
    .grad <- array(0, c(length(.value), 1L), list(NULL, c("x")))
    .grad[, "x"] <- -(sin(.expr1) * (3 * x^2))
    attr(.value, "gradient") <- .grad
    .value
})

Osservando ciò puoi vedere come analizza la funzione e usa la regola della catena. Tutto ciò che una funzione che ha preso il calcolo del primo anno dovrebbe essere in grado di fare! Il primo argomento della deriv()funzione è un'espressione R (che è un tipo R effettivo) in termini di alcune variabili, in questo caso x. Il secondo argomento è il nome della variabile rispetto alla quale viene presa la derivata, qui "x".

Vuoi vedere qualcosa di veramente pulito? Assegna quanto sopra a una variabile, ad esempio dx. Definire una variabile xcome vettore numerico. Quindi inviare eval(dx). R valuta la derivata a x!


Lunghezza 19:

c(matrix(1,3,3),"a")

In R, c()abbreviazione di "combinare" o "concatenare", crea un vettore dai suoi argomenti. Gli elementi dei vettori devono essere dello stesso tipo e tutti hanno lunghezza 1. Ma invece di arrabbiarti con te, R appiattirà un elemento con struttura, in questo caso una matrice, e lancerà tutto nello stesso tipo.

Se gli argomenti c()contengono solo un singolo tipo, non si verifica alcun tipo di casting, ad esempio se tutti gli argomenti sono logici ( TRUEe FALSE), il vettore sarà tutto logico. Se contiene logici e numeri, saranno tutti i numeri. Se contiene carattere e altro, sarà tutto carattere. Quindi il nostro frammento ci offre questo:

> c(matrix(1,3,3),"a")
[1] "1" "1" "1" "1" "1" "1" "1" "1" "1" "a"

Si noti che la matrice 3 per 3 è stata appiattita e l'aggiunta di "a" ha trasformato tutto in caratteri.


Lunghezza 18:

(1-1/3-1/3-1/3)==0

Una lezione sulla precisione della macchina. Questo ritorna FALSE.


Lunghezza 17:

example(readline)

La example()funzione ti darà un esempio di come usare qualsiasi funzione integrata. Se devi scoprire come utilizzare readline(), R ha una risposta compiaciuta per te.

> example(readline)

readln> fun <- function() {
readln+   ANSWER <- readline("Are you a satisfied R user? ")
readln+   ## a better version would check the answer less cursorily, and
readln+   ## perhaps re-prompt
readln+   if (substr(ANSWER, 1, 1) == "n")
readln+     cat("This is impossible.  YOU LIED!\n")
readln+   else
readln+     cat("I knew it.\n")
readln+ }

readln> if(interactive()) fun()
Are you a satisfied R user?

Modo di essere modesto, R.


Lunghezza 16:

acf(lh,t="part")

La acf()funzione restituisce la funzione di autocorrelazione per una serie storica. lhè un set di dati fornito con R. La sua descrizione:

Una serie temporale regolare che fornisce l'ormone luteinzing in campioni di sangue a intervalli di 10 minuti da una femmina umana, 48 campioni.

In questo esempio, la corrispondenza parziale viene utilizzata due volte : una volta con il parametro della funzione e una volta con il valore della stringa passato al parametro. Il nome completo del parametro è typeed i valori riconosciuti sono "correlation", "covariance"e "partial". È necessario fornire solo una parte sufficiente della stringa per identificarla in modo univoco, quindi possiamo usarla "part"per "partial", il che ci dà la funzione di autocorrelazione parziale (PACF).

inserisci qui la descrizione dell'immagine


Lunghezza 15:

p3d(bunny,p=99)

Ancora una volta vediamo il famigerato coniglietto (11). Il onionpacchetto ci offre un modo ancora migliore di visualizzare il set di dati più utile di sempre, utilizzando la funzione di stampa 3D p3d(). Questo chiama la funzione grafica di base persp()in background, che accetta un argomento rotazionale phi. Usando la corrispondenza parziale dei nomi dei parametri (13), possiamo specificare solo p=al posto di phi=.

inserisci qui la descrizione dell'immagine


Lunghezza 14:

stats:::rgamma

R è open source ma non è necessario essere un mago per visualizzare il codice sorgente; puoi semplicemente digitare il nome del pacchetto e la funzione di cui vuoi visualizzare il codice separati da tre punti ( :::). Questo ti dà il codice che definisce la rgamma()funzione, che genera deviazioni casuali dalla distribuzione gamma. Inviando questo si ottiene:

function (n, shape, rate = 1, scale = 1/rate)
{
    if (!missing(rate) && !missing(scale)) {
        if (abs(rate * scale - 1) < 1e-15)
            warning("specify 'rate' or 'scale' but not both")
        else stop("specify 'rate' or 'scale' but not both")
    }
    .External(C_rgamma, n, shape, scale)
}
<bytecode: 0x00000000098cd168>
<environment: namespace:stats>

Si noti che utilizza una funzione .External(). Questo chiama funzioni scritte in altre lingue, tipicamente C e Fortran, le lingue che comprendono gran parte delle fondamenta di R. Individuare quel codice sorgente richiede un po 'di magia. Modifica: @Vlo ha sottolineato che i semplici mortali possono effettivamente visualizzare il codice C sottostante invocato con .Internal()e .Primitive()usando il pryrpacchetto. Grazie @Vlo!


Lunghezza 13:

sample(9,s=4)

Non sembra molto, ma esemplifica un concetto potente in R: corrispondenza parziale dei parametri della funzione . I parametri nominati nella sample()funzione sono size, replacee prob, ma è sufficiente fornire lettere sufficienti per il parametro nominato per identificarlo in modo univoco. Pertanto sample(), è possibile utilizzare s=anziché size=poiché nessun altro nome di parametro inizia con la lettera "s". Il codice qui seleziona un campione casuale di dimensione 4 dagli interi da 1 a 9.


Lunghezza 12:

LETTERS[-pi]

C'è un vettore incorporato chiamato LETTERSche contiene tutte le lettere inglesi maiuscole ordinate in ordine alfabetico. A differenza di molte altre lingue, è possibile indicizzare un vettore utilizzando un numero in virgola mobile. Non succede nulla di troppo eccitante; R prende solo la parte intera. L'uso del -precedente indice di un vettore rimuove l'elemento con quell'indice dal vettore. piè una costante incorporata contenente - avete indovinato - il numero irrazionale π. Quindi questo rimuove l'elemento 3 dal vettore e restituisce da "A" a "Z" omettendo "C".


Lunghezza 11:

plot(bunny)

Nel onionpacchetto c'è un set di dati chiamato bunny. Tracciarlo ti dà quello che potrebbe essere il grafico più utile di tutti i tempi:

inserisci qui la descrizione dell'immagine


Lunghezza 10:

????sample

Supponi di essere VERAMENTE confuso riguardo alla sample()funzione e di aver disperatamente bisogno di aiuto. Piuttosto che il solito ?sampleper tirare su la pagina del manuale di R, fai fuori quattro punti interrogativi. R ascolta la tua situazione e cerca di aiutare ...

Contacting Delphi...the oracle is unavailable.
We apologize for any inconvenience.

Ahimè.


Lunghezza 9:

isTRUE(1)

Inizialmente questo sembra sfidare la convenzione nel resto del pacchetto R base a separare ise la parola seguente nel nome della funzione con a .. Tuttavia, ciò vale solo per un test logico se l'argomento è di un certo tipo, come di seguito (8). In questo caso, stiamo verificando se lo è TRUE, che non è un tipo. Questo utilizza una definizione rigorosa di TRUE, ovvero 1 non è "vero" nel senso comune. isTRUE(1)ritorna FALSE.


Lunghezza 8:

is.na(8)

A differenza della maggior parte degli altri linguaggi di programmazione, .è un carattere valido nella funzione e nei nomi delle variabili. Non indica alcun tipo di metodo o di gerarchia; fa solo parte del nome. La is.na()funzione controlla se il suo argomento viene valutato NA(mancante) e restituisce TRUEo FALSE.


Lunghezza 7:

stop(7)

Ciò genera un errore con l'input come messaggio di errore. Se chiamato all'interno di una funzione, l'esecuzione della funzione verrà interrotta. Ma chiamarlo al di fuori di una funzione non fermerà lo script. In questo caso, l'output è Error: 7.


Lunghezza 6:

x < -1

Anche se questo può sembrare banale, mostra una grande critica dell'operatore di assegnazione <-: vale a dire, il significato cambia a seconda della posizione degli spazi. Come accennato, x <- 1assegna 1 a x. Separare <e -con un singolo spazio come sopra lo cambia in un test logico se xè inferiore a -1. Per questo motivo, molti preferiscono il =compito.


Lunghezza 5:

x<<-1

Simile a <-tranne <<-assegna sempre la variabile all'ambito globale indipendentemente dall'ambito corrente.


Lunghezza 4:

x<-1

R usa <-per assegnare variabili nell'ambito corrente. Questo frammento assegna il valore 1 a x.


Lunghezza 3:

!0i

L' !operatore è R per "no" ed 0iè il numero complesso 0+0i, AKA 0 nel piano complesso. L'invio di questa istruzione restituisce TRUEpoiché 0 è falso.


Lunghezza 2:

NA

Ciò restituisce il valore R speciale NA, che significa "non disponibile", che indica un valore mancante.


Lunghezza 1:

T

Questo ritorna TRUE. In R, Te Fsono sinonimi per i valori booleani TRUEe FALSE, rispettivamente.


Yay R "!"(T)!
Vlo,

@Vlo: "!"(T)valuta FALSE. Tuttavia, l'affermazione "Yay R" non è mai falsa. ;)
Alex A.

Come posso aumentare il voto per più voci ???? "Individuare quel codice sorgente richiede un po 'di magia" è banale per .Internale .Primitive->pryr::show_c_source(.Primitive("sum"))
Vlo

@Vlo: non avevo sentito parlare del pryrpacchetto. Molto bello! Grazie per la segnalazione. Sono contento che ti piacciano le voci finora, grazie per il supporto. :)
Alex A.

2
@ Jemus42 Ah, sembra che tu debba data(bunny)prima fare .
Alex A.

75

Brainfuck

Factoid: Brainfuck (noto anche come brainf * ck) era un linguaggio esoterico sperimentale per creare il più piccolo interprete linguistico completo mai creato, creato da Urban Müller, ed è attualmente la lingua più famosa del suo genere. Ha solo otto comandi, è facile da imparare, ma difficile da usare.

Brainf * ck ha una memoria di base su nastro con 30000 celle e un puntatore mobile e può essere visualizzato in questo modo:

0 0 0 0 0 0
    ^

Con il ^carattere che rappresenta il puntatore e gli 0 che rappresentano i valori per ogni cella.

Brainfuck ha otto istruzioni:

Instruction  C Equivalent              Description
+            mem[ptr]++;               Add one to the value under the cell
-            mem[ptr]--;               Subtract one from the value under the cell
>            ptr++;                    Go on cell to the right
<            ptr--;                    Go on cell to the left
,            mem[ptr] = getchar();     Read a ASCII character from input and put the result in the value under the cell
.            putchar(mem[ptr]);        Write a ASCII character to the output using the value under the cell
[            while (mem[ptr]) {        Start a while loop: Continue to matching ']' when value under the cell is 0
]            }                         End a while loop: Go back to matching '[' when value under the cell is NOT 0

Brainfuck to C:

#include <stdlib.h>

int main(void) {
    unsigned char* mem = calloc(30000, sizeof(unsigned char));
    unsigned int ptr = 0;

    // Put your brainfuck code here, converted to the matching expressions under "C equivalent"

    return 0;
}

Lunghezza 1 frammento

Leggi un personaggio e inseriscilo nella cella corrente.

,

Memoria (con ingresso: abc)

0 0 97 0 0 0
    ^

Lunghezza 2 frammento

Aggiungine uno alla cella corrente e sposta il puntatore verso destra.

+>

Memoria

0 0 1 0 0 0
      ^

Lunghezza 3 frammento

Rimuovere uno dalla cella corrente fino a quando è zero; Imposta la cella corrente su zero

[-]

Memoria possibile:

Memoria: (prima)

0 0 100 0 0 0
    ^

Memoria: (dopo)

0 0 0 0 0 0
    ^

Lunghezza 4 frammento

Commenti: In Brainfuck, tutto ciò che non è un'istruzione viene ignorato. Per questo motivo il seguente programma è un programma brainfuck totalmente valido (ma vuoto):

Hey!

Lunghezza 5 frammento

Un semplice programma cat (Scrivi input in output)

,[.,]

Grazie a tomsmede per il suo commento

Lunghezza 6 frammento

Sposta il valore della cella corrente sulla cella a destra (Supponendo che la cella a destra sia 0, altrimenti aggiungerebbe il valore della cella corrente al valore della cella a destra):

[>+<-]

In generale, le persone usano questo codice per spostare una variabile però.

Memoria: (prima)

10 0 100 0 0 0
     ^

Memoria: (dopo)

10 0 0 100 0 0
     ^

Lunghezza 25 frammento

Invertire un input di sei caratteri e stamparlo, seguito da ogni carattere ASCII (N-1) .. 1 (dove N è il valore del primo carattere di input).

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

Lunghezza 53 frammento

main(){i=0;j=0;if(i>=0){if(j<=i)i+=1;i-=1;}return 0;}

Questo programma C minimizzato è anche un programma Brainfuck sotto mentite spoglie, e viceversa! In effetti, (quasi) fanno la stessa cosa. Ecco il codice Brainfuck senza i "commenti" (codice C).

><+-

Lasciami spiegare il codice Brainfuck (e il codice C). Come puoi vedere, utilizza due celle ( ie j). Incrementa la prima cella (incremento idi 1). Quindi decrementa la stessa cella (decrementa idi 1).

Questo è solo un esempio sciocco di un codice sorgente che può essere compilato in due lingue diverse ed eseguire (praticamente) lo stesso.


2
,[.,]- 5 personaggi, programma gatto
tomsmeding

13
Questo potrebbe essere il miglior "Brainfuck 101" che abbia mai visto.
hoosierEE,

lunghezza 6: ciò metterebbe la somma nella cella destra e azzererebbe quella sinistra. Non muoverti, vero?
Filip Haglund,

Aggiunta una variabile fittizia alla lunghezza 6 per spiegare meglio il concetto. Il programma aggiungerà infatti la cella n. 3 alla cella n. 4 e renderà la cella n. 3 0.
YoYoYonnY,

58 voti - potresti aggiornare? :)
Conor O'Brien,

65

C ++

Con il suo preprocessore, modelli, lambda, tratti di tipo e innumerevoli altre caratteristiche complesse che nessuno potrà mai sperare di comprendere nella sua interezza, il C ++ viene riscoperto da ogni nuova generazione del suo standard. Sfruttando i suoi numerosi modi di fare le cose in fase di compilazione, è possibile scrivere zero astrazioni generali come una libreria che consente alle unità fisiche di essere collegate a tipi di dati numerici al fine di verificarne la solidità al momento della compilazione (ad esempio non è possibile assegnare il risultato di kg* ma N)

Lunghezza 1

#

Di solito, introducendo un'istruzione preprocessore, #può stare su una riga da sola. Essenzialmente non significa nulla e sembra essere così sconosciuto che la maggior parte degli evidenziatori della sintassi che vedo non lo sanno.

Lunghezza 2

%:

Ovviamente non tutti hanno una #chiave, quindi C ++ è (beh, l'ha ereditata dall'antica C) generosa per permetterti di scriverla con questo token alternativo (aka digraph )

Lunghezza 3

??=

Questo è un corso storico sul C ++. In questi giorni non necessariamente più validi, sebbene le implementazioni possano supportarli, sono trigraphs. Questa sequenza è tradotta in #quei sistemi che la supportano, ma per non interferire con valori letterali di stringa grezzi, non è consentita all'interno di questi. Le implementazioni possono scegliere di eliminare completamente il supporto.

Lunghezza 4

auto

È una delle invenzioni più recenti (dal C ++ 11) per semplificare il lavoro con il codice generico. Serve per dedurre il tipo di un'espressione e dal C ++ 14 può anche essere usato per dedurre i parametri lambda e il tipo di funzioni di ritorno.

Lunghezza 5

 catch

È una parola chiave conosciuta anche da molte altre lingue, presente in C ++, ma il buon programmatore idiomatico C ++ non la usa quasi mai. Con i suoi costruttori e distruttori il C ++ idiomatico usa un principio ampiamente chiamato RAII (acquisizione di risorse è inizializzazione) o come mi piace a volte chiamarlo più appropriatamente: SBRM (Scope Bound Resource Management). A causa di classi come i puntatori intelligenti, si può legare la durata delle risorse allocate dinamicamente (che non è solo memoria!) Ad altri oggetti. Quando quelli escono dal campo di applicazione (ad es. Per un'eccezione generata), questi oggetti puliscono automaticamente le risorse. Ciò consente eccezionalmente un codice sicuro e facile da usare che non deve essere utilizzato catch.

Lunghezza 6

[](){}

[]{}()

Come stefan menzionato nei commenti, puoi usare []{}come l'oggetto lambda più corto, quindi questa è la forma più breve per chiamare un lambda. Il testo seguente è per la vecchia versione:

è probabilmente la forma più breve di un lambda. Le lambda in C ++ sono oggetti (di tipo definito dall'implementazione) che sono in grado di catturare parte dell'ambito in cui vengono creati (la sintassi [] controlla ciò) e sono richiamabili (la sintassi () controlla ciò). Il loro codice (la parte {}) ha accesso a queste variabili come se fossero nel loro ambito. Con la deduzione del tipo restituito opzionale e la detrazione dei parametri automatica introdotta in C ++ 14, sono lo strumento da utilizzare per tutti gli algoritmi di libreria standard che prevedono un richiamo (ad esempio il terzo parametro std :: sort).

Lunghezza 7

virtual

È la parola chiave per iniziare a utilizzare il polimorfismo di runtime in C ++, uno dei blocchi di base della programmazione orientata agli oggetti. Questo segue il principio "non pagare per ciò che non usi", dove in altre lingue tutte le funzioni sono virtuali per impostazione predefinita. Essendo un linguaggio multi paradigma, potrebbe essere una sorpresa per le persone che pensano che "C ++ sia orientato agli oggetti" vedere programmi o librerie che non fanno quasi nulla di questa parola chiave, ad esempio perché seguono il principio di programmazione generico.

Lunghezza 8

override

Lavorare insieme alla parola chiave virtuale overrideè una delle aggiunte successive a C ++ per fare in modo che il compilatore faccia più lavoro per te. Usandolo, esprimi l'intenzione di sovrascrivere una funzione virtuale nella classe base, e il compilatore sbaglierà se hai fatto un errore e quella classe non ha la funzione specificata. In generale è considerato un buon stile se il tuo codice esprime l'intenzione, piuttosto che giocherellare con i bit.

Lunghezza 9

constexpr

Essendo anche un'aggiunta successiva a C ++, constexprconsente al programmatore di esprimere funzioni o variabili, che sono note al momento della compilazione e dovrebbero essere calcolabili al momento della compilazione. Ciò consente di utilizzare queste funzioni in contesti che richiedono espressioni di tempo di compilazione (ad es. Come parametri di modello o dimensioni di array). Molte funzioni di libreria standard (se possibile) sono già constexpr, quindi possono essere utilizzate qui.

Lunghezza 10

for(i:c){}

È un ciclo completo su un contenitore o un costrutto come contenitore che supporta std::begine std::endottiene iteratori (che include array in stile C). È sostanzialmente equivalente a for(auto __i = std::begin(c); __i != std::end(c); ++__i){ auto& i = *__i; }. Ciò consente un facile loop nel codice generico.

Lunghezza 11

void f()&&;

È un nuovo modo per dichiarare le funzioni membro e le proprietà sull'oggetto su cui possono essere richiamate. Nelle versioni precedenti di C ++ avevamo solo la possibilità di scegliere void f() const;di dire al compilatore di poter chiamare la funzione su oggetti const (quindi senza la const non è possibile chiamarli su oggetti non const). &&Allo stesso modo ora abbiamo la sintassi per i riferimenti al valore r utilizzati per poter chiamare quelle funzioni sui valori.

Lunghezza 12

int main(){}

Questo è probabilmente il programma completo più breve che è possibile compilare link ed eseguire. Non farà nulla e restituirà 0. Questo ritorno è uno dei tanti casi speciali che puoi incontrare in C ++. Restituire normalmente nulla è un comportamento indefinito, ma per la funzione del punto di ingresso principale, restituire nulla significa restituire 0.

Lunghezza 13

auto f()->int

è un modo piuttosto nuovo di dichiarare il tipo restituito di una funzione. Normalmente non lo faresti se conosci già il tipo, ma ci sono molte situazioni nella programmazione generica in cui il tipo dipende dai parametri del modello e dalle variabili che usi. In questo modo consente un accesso un po 'più semplice a questi parametri come in template<class T> auto f( const T& t ) -> decltype(t.foo())invece ditemplate<class T> decltype(std::declval<T>().foo()) g( const T& t ) { return t.foo(); }


2
Suggerirei di utilizzare ;come frammento di 1 carattere alternativo, perché non è una macro preprocessore e il fatto che sia possibile avere un'istruzione di 1 carattere in C ++ sembra sconcertante.
Joe Z.

1
[](){}non è la forma più breve di un lambda: poiché l'elenco di parametri è vuoto, può essere omesso. Quindi []{}è la lambda più corta. In verità, []{}()è l'esecuzione più breve di una lambda ;-) ideone.com/k8fAvs
stefan,

@stefan: anzi, lo dimentico sempre perché non sembra funzionare come allora;) L'ho aggiunto alla risposta.
PlasmaHH,

@PlasmaHH Lo odio assolutamente perché in effetti non sembra una funzione .. ;-)
stefan,

59

regex

Lunghezza 2 frammento

[]

JavaScript : una classe di caratteri vuota che non corrisponde a nulla.

PCRE , Java , Pythonre , Ruby (testato sulla versione 2.0): errore di sintassi.

Lunghezza 1 frammento

.

., chiamato dot-all, è disponibile in tutti i gusti che ho avuto la possibilità di vedere.

Che cosa corrisponde?

I̧n͟ g̨͜e҉̡͞n̵͢e͜͝r̷͝a͘l̢҉, ̡͟ ̕̕ ̴.̸̴̢̛́ ̸̡̢m͞ąt̴̨c͞h̛e͢͡s̶͘ ͘a҉n̛͜͠ỳ̸ ͢c̵̡hár͘͝a̕͢ćt͘͠e͏̀͠r̷̀ ̴̕͢ex͝͞͞c҉ep̀t̛ ̕f̴҉o͟͜r̴͢ ͞l͏͏͟w̶̶̸̢̢̧̕̕͜͜͡

JavaPattern : in modalità predefinita, dot-all corrisponde a qualsiasi punto di codice, ad eccezione di questi 5 punti di codice \r\n\u0085\u2028\u2029. Con la UNIX_LINESmodalità attiva (ma senza DOTALL), dot-all corrisponde a qualsiasi punto di codice, ad eccezione di \n. Con la DOTALLmodalità attiva, dot-all corrisponde a qualsiasi punto di codice. Da Java 5, Patternopera in codice, quindi i caratteri astrali sono abbinati a punto-tutto.

Pythonre (testato su 2.7.8 e 3.2.5, può essere diverso su 3.3+): in modalità predefinita, dot-all corrisponde a qualsiasi unità di codice UTF-16 (da 0000 a FFFF incluso), eccetto \n. re.DOTALLsolleva l'eccezione e fa .corrispondere qualsiasi unità di codice UTF-16. In queste versioni, reopera su unità di codice UTF-16, quindi .riesce a far corrispondere solo un'unità di codice di caratteri sul piano astrale.

.NET : uguale a Python. Viene chiamata la modalità dot-all in .NET Singleline.

JavaScript (C ++ 11 <regex>) : in modalità predefinita, dot-all corrisponde a qualsiasi unità di codice UTF-16, ad eccezione di questi 4 punti di codice \n\r\u2028\u2029. Con sflag attivo, dot-all corrisponde a qualsiasi unità di codice UTF-16. JavaScript funziona anche su unità di codice UTF-16.

PCRE : a seconda dell'opzione build, dot-all può escludere \r, \noppure \r\n, o tutte e 3 le sequenze LF CR, o qualsiasi sequenza newline Unicode in modalità predefinita. Nella modalità predefinita, il motore funziona su unità di codice (può essere un'unità di codice a 8, 16 o 32 bit), quindi dot-all corrisponde a qualsiasi unità di codice, ad eccezione delle sequenze di nuova riga. In modalità UTF, il motore funziona su punto di codice, quindi punto-tutto corrisponde a qualsiasi punto di codice tranne che per le sequenze di nuova riga. Viene chiamata la modalità punto-tutto PCRE_DOTALL.

PHP (testato su ideone): PCRE, compilato come libreria UTF-8 ed \nè l'unica sequenza newline di default. La modalità Dot-all è accessibile tramite sflag.

Postgres : in modalità predefinita, dot-all corrisponde a qualsiasi punto di codice senza eccezioni.

Ruby (testato sulla versione 2.0.0): in modalità predefinita, .corrisponde a qualsiasi punto di codice ad eccezione di \n. La modalità Dot-all è accessibile tramite mflag (!).

s flag è usato per indicare la codifica Windows-31J in Ruby.


factoid

Ŗ͞e̡͟҉ǵ͟͢e̴̢͘͡x̡́͞ ̛̀҉҉̢c҉̷̨a̸̛͞n҉̛͠ ̷̸̀p̴͠͡҉̵ą̧͜͢r̸̸̷̢͝s̢̀͡e̷̷̷͘͞ ̨̧̀H̨̧͜͜T̷͞M̷̛͜L͢.̴̡́ Ripeti dopo di me. R̶̶̢̧̰̞̻̮̳̦̥ͭͯ̓̈ͯͤ̇͊͊͟ĕ̹̩̪͈͈͍̗͎̝͚̽̈ͨ̐̽ͪͮ̍͐ͮͧ̔̏̓ͣĝ̵̢̢̖̤̜̭͔͊͒ͦ͛ͤ͗ͬͧͪ̾͘͟eͦ̄ͭ̑̾҉̨̨̝̬̹̘̭͔͟͢x̣̻͓̠͈͕̥̜͚̝̫͚̳̾̍ͦ̑̈̋̌̉͊ͮ͗̄̆̒̚̚ ̸̦͈̥̬̺͇ͧͧ͐ͮ̌ͤ̈̒̆ͣ̈̏̔͊̐ç̨̬̪̳̦͎̖͕̦͔ͨ̿̓̈ȁ̸̳̺̠̭ͮ̓̐͘̕͜͡ņ̨̫͔͍̬̤̘͎͚̣̟̦͍̜ͭͭ̈ͦ̈̽͗ͥ̑͝͡ PARSE ͉̭̫̰͔̝͓̼̮͚̻͎͎͉̐͗͗͊̇ͣ͒͗͑̆͐̐ͬ͛ͮ͝H̢̥͕̼͓̫͙̺̼̮ͣͦ̍ͨ͒̔̌T̪̦̻̦͖̞̤͒̑ͭ̐̑ͭͣ͐̒̉͊͜͜M̞̪͇͕̩͉͗ͧ̌ͯ͋̉̍ͭ̓̇̐̌͜͠Ĺ̷̨̳̘̯͚͓͛͌ͭ̉̍.ͯ͆̊ ͯ̇̓̏͐ͪ̋̈͑̕҉̷̠̰̼̤


35
Mi sento male per chiunque non ottenga il riferimento del factoide.
Robobenklein,

6
@robobenklein Conosco una medicina segreta per il tuo dolore: illuminaci!
flawr

24
@flawr Per coloro che non conoscono la famosa domanda: la prima risposta su stackoverflow.com/questions/1732348/… è ciò che stai cercando.
Robobenklein,

1
Puoi leggere il testo di Zalgo, ma non prenderli troppo sul serio in entrambe le direzioni. È chiaramente sbagliato seguire ciecamente la via di Zalgo, ma il testo di Zalgo non è sempre sbagliato.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳,

12
@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳, non hai intenzione di usare tutti quei voti per mostrarci come analizzare HTML?
mbomb007,

57

J

PS: gli snippet ora sono collegati a tryJ.tk e ti consentono di giocare con loro in esecuzione in JavaScript nel tuo browser, senza installare J.

PPS: ho scambiato l'ordine; questo ha più senso per le persone che si uniscono e per riferimenti futuri.

PPS: Penso che, a causa dei vincoli temporali, aggiungerò uno snippet al giorno

factoid:

J è un discendente di APL (vedi qui per la storia familiare) meno il set di caratteri divertente.

Lunghezza 1 frammento

_

J usa _sia come infinito che come indicatore negativo , quando è attaccato a numeri letterali (al contrario del verbo -).

Lunghezza 2 frammento

a.

a.si chiama Alphabet , contenente tutti i caratteri da 1 byte. Come tale J non contiene funzioni come atoi, dal momento che sono semplici ricerche nell'alfabeto:a. i. 'z' =122

Lunghezza frammento 3

i.9

i.è per Integer, se usato in modo monadico (cioè solo un argomento, quello giusto, di solito chiamato y). Se usato in modo diaadico funge da indice di , come nell'esempio sopra.

Lunghezza 4 frammento

!!6x

J supporta numeri interi di precisione arbitrari e numeri razionali . Questo calcola il fattoriale del fattoriale di 6 (un numero di 1747 cifre).

Lunghezza 5 frammento

^.^:_ 

Uno denso ... In primo luogo, i verbi (come J chiama le funzioni) sono organizzati per tema. Tutti i verbi ^ sono legati all'esponenziazione. ^per esponenziazione (e expquando usato monadicamente, ^.per i logaritmi . ^:è speciale, la congiunzione Potenza (una funzione di ordine superiore), che applica una funzione un numero di volte. Quando l'argomento a destra è infinito ( _) esegue il suo argomento a sinistra (in l'esempio ^.) sul proprio output fino a quando non converge. In effetti, ^.^:_è un verbo che si risolve x = ln(x)quando applicato a qualsiasi argomento tranne 1, cedendo 0.318132j1.33724.

Lunghezza 6 frammento

^0j1p1

o equivalentemente

^o.0j1

L'identità di Euler in J. Come sopra citato, ^è exp(). Oltre agli interi e ai razionali di precisione arbitrari, supporta anche poteri di pi e numeri complessi e combinazioni di questi come letterali. 0j1p1significa (0 + j) * pi ^ 1.

Lunghezza frammento 7

+/&.:*:

Un verbo che prende la 2-norma di qualsiasi vettore. Questo dimostra 2 cose:

  • l' avverbio Inserisci trasforma il verbo Aggiungi +in Somma inserendolo tra ogni elemento del suo argomento. Quindi (0+1+2+3) = +/ i.4.

  • La congiunzione Under quando usata come v &.: u yequivale a vi u v y, dove viè il dritto (generalmente l'inverso).

Sì, J conosce inversioni funzionali. La combinazione di questi rende il verbo nello snippet equivalente %: @: (+/) @: *:o, sqrt(sum(y.^2))ad esempio , in Matlab.

Lunghezza 8 frammento

$#:I.@:,

Un fork è composto da 3 verbi senza alcun riferimento agli argomenti. Ciò consente quella che in J si chiama programmazione tacita (senza punti). Un fork f g h, nel caso monadico (come in questo esempio) è equivalente a (f y) g (h y). Come forcelle, le matrici multidimensionali sono una parte intrinseca di J. "Indici" restituisce gli indici di quelli in un vettore, ma non si estende a dimensioni superiori in quanto tali. Questo esempio usa Shape , Antibase e I.@:,come i 3 denti della forcella che implementano I. per array di dimensioni superiori, ad esempio:

 ($#:I.@:,) 5 = i. 5 5 NB. indices of 5 in i. 5 5

Lunghezza frammento 9

<"1 i.4 6 

Le matrici inscatolate sono un tipo di dati in J, che consente di combinare contenuto eterogeneo (sia di tipo che di dimensione) in un unico valore. Le < scatole monadiche sono argomento. Il grado è un concetto centrale in J e consente di estendere automaticamente i verbi verso matrici di dimensioni superiori. Sia i nomi che i verbi hanno un rango.

Il rango di nome è il numero di dimensioni di qualsiasi nome, che il verbo $@$può dirti. Ad esempio i. 2 3 4è un array di grado 3.

Rango di verbo è il rango su cui si applicherà un verbo. Ogni verbo ha un rango intrinseco che può essere interrogato con la congiunzione Base . v b. 0restituisce 3 numeri per il rango monadico, diadico sinistro e diadico destro del verbo v.

Un verbo lavora su celle di nome di rango uguale al rango di verbo e sostituisce i risultati in una rank-verb rankcornice di sostantivo . Il rango di un verbo può essere limitato usando la congiunzione Rango , come si fa qui, boxe rango 1 celle (righe) invece di lavorare sul rango _, cioè. boxe l'intero array. Maggiori informazioni sul grado possono essere trovate qui .

Lunghezza frammento 10

<./ .+~^:_

Questo frammento è un verbo che calcola il percorso più breve su digraph ponderato. Introduce minimo ( <./) e la congiunzione punto . La congiunzione punto è una generalizzazione del prodotto matrice, che può essere scritta come +/ . *. Generalmente, u . vequivale a u@(v"(1+lv,_))dove lv è il rango sinistro del verbo v. O in parole "u viene applicato al risultato di v negli elenchi di" celle dell'argomento sinistro "e dell'argomento destro in toto". (Vedi sopra per i ranghi)

Pertanto, il verbo interno <./ .+~sostituisce l'elemento y(i,j)con il minimo di y(i,k)+y(k,j)per tutto k.

^:_ itera questo passaggio fino alla convergenza.

Esempio, visualizzazione delle distanze percorso originale e più breve:

(]; <./ .+~^:_ ) wtm=: _6]\0 2 5 _ _ _ _ 0 4 1 3 _ _ _ 0 _ _2 _ _ _ 4 0 _ 5 _ _ _ _1 0 6 _ _ _ _ _ 0

Lunghezza 11 frammento

<.@o.10x^99

Questo frammento introduce un codice speciale : alcuni codici J sono supportati da un codice appositamente scritto per un determinato caso d'uso, riconosciuto al momento dell'analisi e ottimizzato; per una maggiore precisione (come nel caso di specie) o prestazioni più elevate (vedere Combinazioni speciali )

Questa frase fornisce 99 cifre di pi (sebbene spostato di 99 decimali). Il codice speciale dipende dal fraseggio esatto, ciò che normalmente sarebbe equivalente non è preciso come il codice dello snippet: <.o.10x^99 perde la precisione estesa.

Lunghezza 12 frammento

($-.1:)($,)]

Di tanto in tanto, ti ritrovi in ​​situazioni in cui, a causa delle selezioni effettuate nei dati, ci sono dimensioni singleton in esecuzione sulla strada. Questa utile utility, chiamata squeeze in Matlab, elimina tutte le dimensioni singleton. Il dente sinistro della forcella ($-.1:)produce tutte le dimensioni senza quelle, mentre quello centrale ($,) rimodella l'array sfilacciato in base alle dimensioni mantenute. Il dente giusto ]serve solo a farne una forchetta e fa riferimento all'argomento giusto.

Lunghezza 13 frammento

1 :'-u%u d.1'

Il metodo di Newton trova un'approssimazione di una radice di una funzione differenziabile. Questo avverbio esplicito deve essere applicato alla funzione di cui viene cercata la radice e rappresenta un passaggio della procedura iterativa. uè l'argomento che fa riferimento alla funzione, essendo sostituito nel momento in cui viene applicato l'avverbio. d. è una congiunzione che deriva simbolicamente funzioni, e qui potrebbe essere sostituita dalla D.quale fa lo stesso numericamente (ma differisce quando applicato a funzioni di rango superiore). Il risultato è un hook che sottrae la forcella ( udivisa per la sua derivata) dall'argomento.

Per esempio:

(_2 + *:) (1 :'-u%u d. 1')^:_ ] 1 NB. root of x^2-1; ] is there to avoid combining _ and 1 into an array.

Lunghezza frammento 14

(%-.-*:)t.i.10

Primi 10 numeri della serie Fibonacci da espansione Taylor di x / (1 - x - x^2). Analizzare il gancio %-.-*:(y % (-.-*:) y) = (y % ( (1 - y) - *: y).

Lunghezza frammento 15

(#{.+//.)!/~i.9

Un'altra versione della serie Fibonacci. Questa volta da un'altra angolazione; a partire dal triangolo di Pascale '! /~i.9'.

/se usato in modo diadico significa Tabella , applicando il verbo a cui è legata tra ogni cella dei suoi argomenti, producendo una tabella dell'operazione tra gli argomenti xey. In questo caso !usato diadicamente, come Combinazione (o Fuori di) . ~rende il verbo riflessivo , cioè. usa l'argomento giusto come anche quello sinistro.

L'avverbio /.è strano, applica il suo verbo lungo le anti-diagonali di un array (es. Prova </.!/~i.5qui )

Quindi questo frammento prende le somme delle prime 9 dia-diagonali sul triangolo di Pascal, che sembra essere un'altra serie di Fibonacci.

Lunghezza 16 frammento

;/@~.,. <"0@#/.~:

Ok, ho aggiunto uno spazio solo per arrivare a 16 :). Questo frammento mostra un fork usando Key : elencando tutti gli elementi nell'argomento e le loro frequenze.

x u/. yapplica u a y in blocchi in cui x è univoco, oppure in J:, (=x) u@# ydove =è la classificazione automatica , che genera un array booleano contenente 1 in posizioni in cui appaiono in nub ~. Qui viene applicato in modo riflessivo, quindi eseguendo Tally su ciascun oggetto unico in y, contando il numero di apparizioni.

Poiché la maggior parte dei verbi in J mantiene l'ordine nub (ordine di apparizione di nuovi oggetti unici, al contrario, ad esempio, uniquein Matlab, che ordina i suoi argomenti), questo può essere usato per Stiching gli oggetti alle loro frequenze come viene fatto qui. ;/@~.viene utilizzato per creare un elenco in scatola di tutti gli elementi.

Si noti che a causa del concetto prevalente di rango , questo codice funziona per qualsiasi dimensionalità .

Lunghezza frammento 17

*./ @:(#&>)@C.@A.

J supporta alcune primitive specificamente sulle permutazioni:

  • Anagram A. Monadicamente trova l'indice Anagram, diadicamente, applica la permutazione specificata dall'indice Anagram nell'argomento sinistro all'argomento destro.
  • Ciclo - Permuta C. converte tra rappresentazione diretta e ciclica delle permutazioni.

Questo frammento è un verbo che porta un indice anagramma a sinistra (tra 0 e !#y) e l'argomento destro y un array per permutare. Successivamente, calcola l' LCM *./ delle lunghezze del ciclo #&>, vale a dire. il periodo dopo il quale viene ripristinato l'array originale:

]n=: (p=:?!9) *./ @:(#&>)@C.@A. i.9 NB. period of a random permutation
p&A.^:n i.9 NB. applies permutation n times.

Lunghezza 21

<:@(#/.~)@(i.@#@[,I.)

Questo verbo deriva dal componente aggiuntivo "stats / base" e si chiama istogramma . Fa esattamente questo, dato un elenco di inizio bin, somma tutte le occorrenze di dati nell'intervallo in ]bn-1,bn]cui bn è l'inizio del numero bin n.

Sfrutta l' Interval IndexI. per trovare l'intervallo di:

Se y ha la forma di un elemento di x, allora x I. y è il j meno non negativo tale che j {x segue y nell'ordinamento o #x se y segue {: x nell'ordinamento o se x ha nessun oggetto.

Effettuare i totali di ogni intervallo è fatto usando il tasto come evidenziato nello snippet 16.

Lo snippet collegato a tryj.tk mostra il teorema del limite centrale usando questo istogramma:

(bins=:(%~>:@i.)10) ( [ (graph=:(,&":"0 1 '#'#"0 1~])) (histogram=:<:@(#/.~)@(i.@#@[,I.)) ) (+/%#) ?5 200 $ 0

Lunghezza 22

=,&(+/)(~:#[)e.&~.~:#]

Divertimento in J. Questo implementa un motore di mente, prendendo una matrice segreta come argomento sinistro e un'ipotesi come il diritto. I valori restituiti sono il numero di pioli bianchi e neri. Smontato:

NB.   ExactMatch: checks where digits correspond:
ExactMatch =: =

NB.   GoodDigitWrongPlace: Copies non-matched numbers from both arguments (left and right
NB.   pairs of parentheses, and checks them for same elements(e.), after eliminating
NB.   doubles in both (&~.)
GoodDigitWrongPlace =: (~: # [) (e.&~.) (~: # ])

NB.   Piecing the conditions together, after summing the booleans:
mm =: ExactMatch ,&(+/) GoodDigitWrongPlace

Da usare come

secret (=,&(+/)(~:#[)e.&~.~:#]) guess

Dove secrete guesssono qualsiasi array. Funziona con qualsiasi tipo di dati in realtà.


17
Bene, o ottieni un mucchio illeggibile di simboli strani, o ottieni un mucchio illeggibile di simboli ASCII. Scegli il tuo veleno.
John Dvorak,

16
@JanDvorak Tutte le lingue sono illeggibili fino a quando non le impari. ;-)
Gareth,

5
Pensavo che nomi lunghi e descrittivi aiutassero la comprensione del codice. Poi sono stato illuminato .
hoosierEE,

@Gareth Ma non tutti sono illeggibili anche dopo averli imparati. Non nominerò alcun nome.
flawr

45

RPL (Redstone Programming Language) [e Minecraft]

Questo è un grande passo sul fatto che possiamo considerare questo un vero linguaggio di programmazione o meno, ma ci proveremo comunque. E poiché queste due "lingue" sono praticamente le stesse, le combinerò, a volte inserirò frammenti in linguaggio "Minecraft" (pietra rossa, ecc.) E talvolta in RPL. Inoltre, poiché molti frammenti saranno in Minecraft, posterò i collegamenti alle immagini anziché alle immagini stesse per risparmiare spazio. Inoltre, tutti i frammenti riguarderanno i concetti di programmazione in Minecraft, non la pietra rossa generale (cioè non appariranno porte di pietra rossa). I caratteri verranno conteggiati in byte (in RPL) o secondo questo (in Minecraft).

factoid:

RPL è un linguaggio di programmazione di Tossha the Inventor che converte il codice in Minecraft redstone e blocchi di comandi. Può fare input e output, loop, manipolazione di numeri interi, funzioni trig, root e altro.

Lunghezza 1:

Un pulsante (1 byte) è la forma più semplice di input in Minecraft. Può anche avviare o arrestare un "programma". Allo stesso modo, una leva (anche 1 byte) è un'altra forma di input e può anche essere utilizzata sia per avviare che per arrestare il programma in quanto ha uno stato "on" e "off". Qualcosa da ricordare è che Minecraft è letteralmente un linguaggio di programmazione 3D, quindi la posizione del pulsante / leva nel programma può fare una grande differenza.

Lunghezza 2:

Un pulsante collegato a una lampada in pietra rossa è praticamente il tuo programma cat base . Prende l'input (con un pulsante o una leva, o 0o 1( offo on)) e lo emette nella forma come luce della lampada come o 0o 1( offo on).

inserisci qui la descrizione dell'immagine

Lunghezza 3:

Come visto di seguito, questo è uno dei programmi di modifica del codice sorgente più brevi (come puoi modificare l'origine in fase di esecuzione con Minecraft!). Ora, questo specifico non ha davvero alcuna utilità, ma il concetto può essere combinato con altri per creare alcuni fantastici programmi (come per venire con più voti). Quando eseguito, questo programma rimuove la sua fonte di input e si rende impossibile eseguirlo di nuovo. inserisci qui la descrizione dell'immagine

Lunghezza 4

Questo "frammento" in realtà mostra due concetti: delay e NOT gate. Il ritardo viene effettuato utilizzando alcuni elementi di pietra rossa che hanno un ritardo di battito di pietra rossa . Un segno di spunta di pietra rossa è pari a un decimo di secondo. Diversi componenti redstone hanno ritardi diversi: una torcia ha un ritardo di 1rt (1 tick di pietra rossa), un comparatore ha un ritardo di 1rt, un ripetitore può avere un ritardo di 1, 2, 3 o 4rt, a seconda di come è impostato. In questo esempio, il ripetitore redstone è impostato su un ritardo di 4rt.

Il prossimo è il NOT gate. Il gate NOT accetta un input e lo inverte. Pertanto, in questa configurazione, l'uscita sarà attiva se l'ingresso è spento e l'uscita sarà disattivata se l'ingresso è acceso.

Lunghezza 5

Il gate OR è molto facile da realizzare in Minecraft. Due ingressi sono collegati alla stessa uscita. Questo è tutto. Nessun trucco divertente o altro, è piuttosto semplice.

inserisci qui la descrizione dell'immagine

Lunghezza 6

Ecco un suggerimento per compattare il "codice". Se si conosce che la potenza del segnale di due ingressi è abbastanza piccola da non interferire con le uscite corrispondenti, è possibile collegare tra loro il collegamento rosso corretto. Nell'esempio seguente, esiste un semplice timer tramoggia, che trasferisce gli elementi avanti e indietro in circa 0,5 secondi in ogni tramoggia, collegato a comparatori che emettono un segnale di potenza pari a 1. Ciò significa che le due uscite non interferiranno l'una con l'altra. Nell'esempio, le lampade sono lì solo a scopo dimostrativo e non contano ai fini del conteggio totale dei blocchi.

inserisci qui la descrizione dell'immagine


7
Hai 13 voti positivi, posso fare 10 programmi moar?
Rɪᴋᴇʀ

4
Nessuno dei tuoi programmi è effettivamente scritto in RPL, quindi non passarlo come tale. Questo è puramente "codice" di Minecraft.
mbomb007,

2
Hai un deficit di 14 programmi m8. Mi piacerebbe vedere cosa hai in mente;)
Conor O'Brien,

4
Hai 21 voti positivi, posso ignorare 15 programmi moar?
wizzwizz4,

1
Hai 29 voti positivi, posso eseguire 23 programmi di moar?
bb010g

42

TI-BASIC

[La lingua varia in base alla calcolatrice su cui viene utilizzata, ma queste useranno la TI-84 se non diversamente indicato.]

Lunghezza frammento 31

Menu("","1",A,"2",B
Lbl A
Lbl B

Questo dimostra l'uso dei menu. Quello sopra è abbastanza inutile, in quanto non fa nulla, ma possono essere usati per navigare nelle diverse parti di un programma. Il primo argomento è il titolo del menu, seguito da coppie di opzioni (la stringa visualizzata seguita da un'etichetta di 1 o 2 lettere). Ecco un esempio più intuitivo:

Menu("CHOOSE VALUE","AREA",A,"CIRCUMFERENCE",C
Lbl A
Disp πR²
Stop
Lbl C
2πR

Lblpuò anche essere usato per ramificare con Goto. I menu hanno alcune limitazioni che li rendono fastidiosi da usare, tuttavia: ci possono essere solo sette voci di menu e ogni titolo può contenere al massimo quattordici caratteri, quindi il tutto si adatta a una schermata.

Lunghezza frammento 29

Real
√(-16
a+bi
Ans
re^θi
Ans

Real(acceso per impostazione predefinita) pone la calcolatrice in modalità numeri reali, quindi i calcoli che coinvolgono numeri complessi generano un NONREAL ANSerrore. Quando impostato in a+bimodalità, la calcolatrice visualizza le risposte come numeri complessi, se applicabile, quindi restituisce il secondo esempio 4i. re^θila modalità utilizza coordinate polari anziché rettangolari, quindi emette 4e^(1.570796327i).

Snippet di lunghezza 23

If A≥9
Then
1→X
7→Y
End

Questo è solo un semplice condizionale, sebbene possa esserci una Elsedichiarazione. Thene Endnon sono richiesti se si tratta di una sola istruzione.

Lunghezza frammento 21

(-B+√(B²-4AC))/(2A)→X

Il preferito da tutti, la formula quadratica. Memorizza la prima soluzione di un'equazione quadratica come X, assumendo a, b, c sono memorizzati nelle rispettive variabili, come in ax 2 + bx + c .

Lunghezza 20 frammento

Shade(|X/2|-3,5-X²,0

Ciò oscura l'intersezione delle due funzioni, con diversi parametri opzionali: valori minimi e massimi di x e direzione e distanza tra le linee di ombreggiatura.

Lunghezza 18 frammento

LinReg(ax+b) L1,L2

Qui calcoliamo l'equazione di regressione lineare, o l'equazione lineare che meglio corrisponde a un gruppo di punti, con i valori x memorizzati come elenco in L1e i valori y in L2. Sono disponibili molte altre opzioni di regressione, tra cui quadratica, cubica ed esponenziale.

Lunghezza frammento 17

dbd(1.2711,1.2115

Questo calcola il numero di giorni tra due date, in questo caso il 27 gennaio 2011, il giorno di inizio del sito, e il 21 gennaio 2015, il giorno in cui è stato scritto. (Sono 1455 giorni per i pigri.) Il modo di codificare le date è un po 'strano: DDMM.YY o MM.DDYY, portando a zero gli opzionali.

Lunghezza 16 frammento

For(A,0,5
Disp A

Questo mostra due parti del lato di programmazione del linguaggio. Il primo è il tipico forciclo, simile a quello for(var A=0;a<5;a++)in altre lingue. (Dovresti anche usare il Endcomando per uscire dal loop.) Il secondo è autoesplicativo: viene visualizzato A, in questo caso 5 volte a causa del loop.

Lunghezza frammento 15

Y1=|X³-4|
Y2=3X

Ecco due esempi di una caratteristica ben nota di grafiche calcolatori: rappresentazione grafica di equazioni. Puoi avere 10 diverse equazioni rappresentate graficamente sullo stesso piano e ci sono molti comandi utili per trovare intersezioni, massimi, valori di x , ecc. Queste equazioni appaiono così quando sono rappresentate su una finestra standard:

Grafico

Lunghezza frammento 14

[[1,2][34,5]]T

Le parentesi vengono utilizzate per creare matrici e Ttraspone la matrice:

[[1 34]
 [2 5]]

Lunghezza 13 frammento

dayOfWk(9,1,6

Questo trova il giorno della settimana del 6 gennaio 9 d.C. L'output è un numero in cui 1 è domenica, 2 è lunedì e così via. Questa data particolare era un martedì, quindi l'output è 3.

Lunghezza 12 frammento

Circle(1,3,5

Il primo degli strumenti di disegno di base, disegna un cerchio sul grafico con un centro a (1,3) e un raggio di 5.

Lunghezza 11 frammento

randInt(0,8

Questo genera un numero intero (pseudo-) casuale compreso tra 0 e 8 inclusi. C'è un terzo argomento facoltativo che indica quanti numeri interi generare. Esistono diverse altre funzioni casuali, comprese quelle per le distribuzioni normali e binomiali, una per una matrice casuale e una per un elenco ordinato in modo casuale senza ripetizioni. randIntpuò essere seminato memorizzando un numero come rand: 2→rand.

Lunghezza frammento 10

4>5 or 2≠7

Qui abbiamo operatori di uguaglianza e logica di TI-BASIC (in). Le dichiarazioni di disuguaglianza vengono valutate per prime 0 or 1e orrestituiscono vero se uno dei due lati è vero, quindi viene visualizzato 1.

Lunghezza frammento 9

.656▶F◀▶D

Questo può convertire da decimale a frazione e viceversa, il che è molto utile. Ci sono anche funzioni ▶Frace ▶Decfunzioni dedicate che vanno solo in una direzione. Stampa 82/125in questo caso.

Lunghezza 8 frammento

lcm(14,6

Stampa il multiplo meno comune di 14 e 6, che è 42.

Lunghezza frammento 7

getDate

Abbastanza autoesplicativo, stampa solo la data di sistema corrente come un elenco, in questo caso {2015 1 19}.

Lunghezza 6 frammento

√({4,9

Le matrici (o elenchi) sono circondate da parentesi graffe e separate da virgole. Questo è simile alla mapfunzione di molte lingue, in cui scorre attraverso ogni elemento dell'elenco e applica l'operazione al di fuori delle parentesi graffe, in questo caso radice quadrata, quindi il risultato è {2 3}. Nota che le parentesi chiuse sono facoltative, quindi saranno omesse da ora in poi.

Lunghezza 5 frammento

4iii6

Abbiamo un paio di cose interessanti da fare qui. Innanzitutto, le parti reali, 4 e 6 vengono moltiplicate, quindi le parti immaginarie vengono moltiplicate: i^3o -i. Questi danno moltiplicato -24i. Questo mostra la moltiplicazione della giustapposizione dall'aspetto funky e la gestione di numeri immaginari da parte di TI-BASIC.

Lunghezza 4 frammento

8°5′

Si tratta di 8 gradi, 5 arcminuti, che viene convertito in gradi come 8.0333...

Lunghezza frammento 3

8→T

Questo mostra come i numeri possono essere memorizzati come variabili, il che è piuttosto insolito perché il numero va prima, seguito dalla freccia del negozio, quindi dal nome della variabile. Come accennato nel factoide, θ(theta) può anche essere usato come variabile e le variabili possono essere solo una lettera maiuscola.

Lunghezza 2 frammento

4M

Analogamente a Mathematica, puoi moltiplicare per giustapposizione, non *necessario. Tutte le variabili sono inizializzate su 0 per impostazione predefinita, quindi questo produrrà 0 a meno che tu non abbia memorizzato qualcos'altro in quella variabile (vedi snippet 3).

Lunghezza 1 frammento

e

Questa è la costante per il numero di Eulero , che viene visualizzato come 2.718281828.

factoid

Le variabili possono memorizzare solo determinati tipi di dati. Ad esempio, A- Z(e θ) memorizza valori numerici, str0- str9memorizza stringhe e [A]- [J]memorizza matrici (array bidimensionali).


A proposito, anche la minuscola n(non n) può essere utilizzata come variabile.
Ypnypn,

Interessante. Non ho mai usato quella variabile.
NinjaBearMonkey il

3
Si può discutere str0sull'essere 1 carattere o sull'essere 4. Tutte le istruzioni in TI-BASIC sono lunghe 1 carattere.
Ismael Miguel,

@IsmaelMiguel Ci ho pensato, ma sono 1 o 2 byte e ho deciso di contare i caratteri normalmente.
NinjaBearMonkey il

1
Rispetto la tua decisione. Aiuta molto in questo caso. Mi è davvero piaciuta la programmazione sul mio vecchio TI-83. (Ho anche disegnato un programma di pittura!)
Ismael Miguel,

41

GNU Sed

Mi sto imponendo un requisito più restrittivo: tutti gli snippet saranno sedprogrammi completi .

factoid

sed è un linguaggio completo. Ecco una prova.

Lunghezza 0 Frammento

Non penso che uno snippet di lunghezza 0 sia strettamente necessario, ma poiché in realtà fa qualcosa in sed, eccolo qui:

Sed è "Stream EDitor", ovvero legge lo stream (riga per riga) da STDIN, modifica, quindi invia a STDOUT. Il programma sed di lunghezza zero copia semplicemente STDIN su STDOUT. Pertanto l' catutilità può essere emulata da sed. Sono equivalenti:

cat a.txt b.txt > c.txt

e

sed '' a.txt b.txt > c.txt

Lunghezza 1 frammento

=

Questo programma sed stampa il numero di riga di ogni riga su STDOUT. Ciò equivale approssimativamente a:

nl

o

cat -n

sebbene la versione sed metta il numero di riga su una propria riga.

Lunghezza 2 frammento

5q

Copia STDIN su STOUT e funziona qdopo la riga 5. Ciò equivale a:

head -n5

Potresti iniziare a vedere un po 'di un modello qui - sedpuò essere usato per emulare molti degli strumenti standard di core-utils.

Lunghezza 3 frammento

iHi

inserts "Ciao \ n" prima di ogni riga. Meh.

Lunghezza 4 frammento

/a/d

Molta potenza di sed è nella sua capacità regex. Questo programma fa sì che tutte le righe corrispondenti alla regex avengano deliminate dallo stream. Tutte le altre linee verranno comunque inviate a STDOUT. Ciò equivale a:

grep -v "a"

Lunghezza 5 frammento

:l;bl

Questo è un ciclo infinito. Tutti amiamo i loop infiniti con CPU hogging. Definisce un'etichetta l, quindi branch (salta) su di essa. Verso l'infinito.

Lunghezza 7 frammento

s/a/A/g

Per impostazione predefinita, sed applica scomandi in modo tale che corrisponda solo alla prima occorrenza su ciascuna riga. Se ne hai bisogno per abbinare (e sostituire) ogni occorrenza su una linea, allora la gbandiera alla fine del scomando lo farà.

Lunghezza 8 frammento

y/01/10/

Il ycomando poco usato è simile trall'utilità shell (anche se non altrettanto flessibile). Questo programma commuta tutte le 0s con se 1viceversa.

Lunghezza 9 frammento

1!G;$p;h

Questo frammento è in realtà 8 byte, ma richiede il parametro -n per sed per sopprimere l'output predefinito, quindi, secondo le regole del code-golf standard, sto contando questo come 9. Questo programma inverte le linee nello stream. Così:

sed -n '1!G;$p;h'

è esattamente equivalente a:

tac

Lunghezza 10 frammento

s/[ <TAB>]+$//

Questa è una rivisitazione dello snippet di lunghezza 6 (errato). Ciò rimuove gli spazi bianchi finali (spazi e TAB) dalle linee.


2
Vedi anche UTILI SCRIP DI UNA LINEA PER SED , che è sostanzialmente come ho imparatosed
Adam Katz,

Hai più voti. Ne possiamo avere ancora?
Luser droog

2
Il tuo factoide 404 '.
Wauzl,

1
Bene, ma tieni presente che molti di questi usano estensioni GNU e non sono standard, in particolare lunghezza 3 (standard sarebbe i\<newline>Hi<newline>), lunghezza 5 (standard sarebbe sed -e :l -e blo :l<newline>bl<newline) e lunghezza 10 (che ha bisogno di essere +convertito in a *per funzionare). Nota che lo snippet di lunghezza 9 -n '1!G;$p;h' è standard, mentre non lotac è . :)
Wildcard il

1
@Wildcard Sì - L'ho limitato a GNU sed.
Trauma digitale

39

Pitone

( Il post di mbomb007 ha già una pletora di frammenti di Python, ma ho pensato di aggiungere alcuni fatti più strani)

factoid

Python è un linguaggio tipizzato in modo dinamico con un'enfasi sulla leggibilità.

Lunghezza 1 frammento

1

In Python 3, quanto sopra equivale a Truenel senso che 1 == True(e anche 0 == False). Nota che questo non è necessario per True in Python 2, dove puoi ridefinire il valore diTrue .

Lunghezza 2 frammento

<>

<>è un operatore di confronto obsoleto equivalente a !=. Funziona ancora in Python 2 (anche se il suo uso è sconsigliato) ed è stato rimosso del tutto da Python 3.

Lunghezza frammento 3

...

Python ha una serie di funzionalità che nessun builtin usa, ma è presente esclusivamente per il bene di librerie di terze parti. Questo Ellipsisoggetto è uno di questi ed è generalmente utilizzato per tagliare. Ad esempio, se disponiamo della seguente matrice numpy 3D :

array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])

quindi a[..., 0](equivalente a a[:,:,0]) fornisce tutti i primi elementi:

array([[1, 4], [7, 10]])

In Python 3 il valore ...letterale può essere utilizzato al di fuori della sintassi dello slicing, che consente in modo divertente di usarlo come un marker "to-do" al posto di passo NotImplemented:

def f(x):
    ... # TODO

Lunghezza 4 frammento

(1,)

Una tupla a un elemento in Python.

Python ha liste (ad esempio [1, 2, 3, 4]), che sono mutabili, e tuple (per esempio (1, 2, 3, 4)), che sono im mutabili. Un uso comune delle tuple è come chiavi del dizionario, poiché gli elenchi non sono cancellabili.

Un errore comune per i principianti è di tralasciare la virgola sopra, ovvero (1)il numero 1 racchiuso tra parentesi. La tupla a un elemento è l'unica volta in cui hai bisogno di una virgola prima delle parentesi chiuse - genera un SyntaxErrorse provi a metterne una nella tupla vuota ()ed è facoltativa per le tuple di lunghezza almeno 2.

Lunghezza 5 frammento

0or x

Ci sono alcune cose che succedono in questo frammento, quindi diamo un'occhiata!

orè come ||in molte lingue. In Python, A or Bcortocircuiti, ritorno A(senza valutazione B) se Aè vero, altrimenti ritorna B. Ad esempio, 1 or xritorna sempre 1, come 1sempre, e funziona anche se xnon definito. D'altra parte, 0 or xrestituisce xif se xè definito, oppure genera un NameErrorse non lo è.

Quando giochiamo a golf, di solito possiamo far cadere lo spazio tra un numero e un or, come 1 or xdiventare 1or x. Questo è possibile perché 1orinizia con una cifra, rendendolo un identificatore Python illegale.

Tuttavia c'è un'eccezione 0or, che lancia misteriosamente a SyntaxError. Perché? Perché i letterali ottali in Python iniziano con 0o(ad es. 0o20 == 16) E il parser soffoca quando raggiunge il r!

Nota: in Python 2, anche i letterali ottali possono iniziare con uno zero iniziale, ad es 020.

Lunghezza 6 frammento

*x,y=L

Questo frammento mostra un tipo speciale di assegnazione in Python, dove Lè presente un elenco, una tupla o qualsiasi altro tipo di iterabile.

In Python puoi "decomprimere" tuple ed elenchi in questo modo:

a,b = [1,2]

Questo assegna 1 a ae 2 a b. Questa sintassi viene utilizzata anche per assegnazioni multiple, ad esempio

a,b = b,a+b

che è utile quando si scrive un programma che calcola la serie di Fibonacci.

Se le lunghezze su entrambi i lati non corrispondono, ValueErrorviene lanciato a. Tuttavia, Python 3 ha introdotto una nuova sintassi, ha esteso la decompressione iterabile (o più colloquialmente, "assegnazione speciale") che ti consente di fare cose del genere:

*x,y = [1, 2, 3, 4, 5]

Questo assegna yall'ultimo elemento, 5, e xal resto dell'elenco , ad es [1, 2, 3, 4]. Puoi persino fare qualcosa del genere:

a,b,*c,d,e = [1, 2, 3, 4, 5, 6, 7]

che assegna 1 a a, 2 a b, [3, 4, 5]a c, 6 a de 7 a e.

Lunghezza frammento 7

zip(*x)

zip è una funzione che prende un sacco di elenchi e, bene, li comprime:

>>> zip([1, 2, 3], [4, 5, 6])
[(1, 4), (2, 5), (3, 6)]

Nota: in Python 3 zipviene invece restituito un oggetto, quindi se si desidera un elenco come sopra, è necessario racchiudere la chiamatalist()

È una funzione abbastanza conveniente se hai due o più elenchi correlati e desideri collegare le rispettive voci.

Ora dì che vuoi decomprimere l'elenco - come lo faresti? Possiamo provare a zipriutilizzarlo, ma sfortunatamente questo dà:

>>> zip([(1, 4), (2, 5), (3, 6)])
[((1, 4),), ((2, 5),), ((3, 6),)]

Il problema è che tutto è in un unico elenco, ma zipaccetta i singoli elenchi come argomenti di funzione separati. Per risolvere questo problema, presentiamo l' *operatore splat, che accetta un elenco / tupla / ecc. e li scompone come argomenti di funzione:

f(*[1,2]) ==> f(1, 2)

E il risultato è:

>>> zip(*[(1, 4), (2, 5), (3, 6)])
[(1, 2, 3), (4, 5, 6)]

Lunghezza 8 frammento

x='a''b'

La prima volta che l'ho visto, sono stato un po 'ripreso: cosa significa avere due corde l'una accanto all'altra? La risposta è stata semplice:

>>> x
'ab'

Python si limita a concatenare le due stringhe! Ciò è estremamente utile per la leggibilità, poiché consente di spezzare stringhe lunghe in questo modo (notare le parentesi circostanti):

x = ('This is a very long sentence, which would not look very nice '
     'if you tried to fit it all on a single line.')

Lunghezza frammento 9

0!=2 is 2

Potresti già sapere che Python consente il concatenamento di operatori di confronto, quindi 5 < x <= 7è vero solo se 5 < xe x <= 7. Se non lo sapevi ... allora sorprendi!

Comunque, meno noto è il fatto che, poiché is/ is not/ in/ not insono anche operatori di confronto, possono anche essere concatenati. In altre parole, il codice sopra è equivalente a (0 != 2) and (2 is 2), che è True.

Nota: ci sono alcune sottigliezze con la 2 is 2metà, poiché iscontrolla se due cose sono lo stesso oggetto , non se due cose hanno lo stesso valore . Python memorizza nella cache piccoli numeri interi così 1+1 is 2è True, ma lo 999+1 is 1000è False!

Lunghezza frammento 10

x=[];x+=x,

Cosa succede quando aggiungi un elenco a se stesso? Se proviamo a stampare x, otteniamo:

[[...]]

Fortunatamente, Python printè abbastanza intelligente da non esplodere nel tentativo di stampare elenchi ricorsivi. Possiamo quindi fare un sacco di cose divertenti, come:

>>> x[0][0][0][0][0]
[[...]]
>>> x[0] == x
True

Questa funzione funziona anche con i dizionari ed è un modo per creare strutture di dati con cicli, ad esempio un grafico.

Lunghezza 11 frammento

help(slice)

La helpfunzione è molto utile per il debug in Python. Quando viene chiamato senza argomenti in REPL, help()avvia una sessione di aiuto, in cui è possibile cercare la documentazione per funzioni / tipi di dati / ecc. Quando viene chiamato con un argomento specifico, helpfornirà informazioni sull'elemento correlato.

Ad esempio, help(slice)fornisce le seguenti informazioni (troncate poiché è piuttosto lunga):

Help on class slice in module __builtin__:

class slice(object)
 |  slice(stop)
 |  slice(start, stop[, step])
 |  
 |  Create a slice object.  This is used for extended slicing (e.g. a[0:10:2]).
 |  
 |  Methods defined here:
 |  
 |  __cmp__(...)
 |      x.__cmp__(y) <==> cmp(x,y)
 |  
 |  __getattribute__(...)
 |      x.__getattribute__('name') <==> x.name
 |
 | ...

Per slicequanto possiamo vedere, possiamo creare sliceoggetti per l'indicizzazione. Per esempio:

>>> L = list(range(10))
>>> L[slice(2, 5)]         # L[2:5]
[2, 3, 4]
>>> L[slice(2, None)]      # L[2:]
[2, 3, 4, 5, 6, 7, 8, 9]

Un'altra funzione utile per il debug è dir(), che restituisce tutti i nomi nell'ambito corrente quando viene chiamato senza argomento e restituisce tutti gli attributi di un determinato oggetto quando viene chiamato con un argomento.

Lunghezza 12 frammento

round(5.0/2)

Cosa valuta questo? La risposta dipende dalla tua versione di Python!

In Python 2, la divisione tra due numeri interi si traduce in una divisione intera (cioè 5/2 == 2) mentre in Python 3 otteniamo una divisione float (cioè 5/2 == 2.5). Tuttavia, questa è una divisione tra un float e un numero intero, che dovrebbe sempre risultare in un float. Perché dovremmo ottenere risultati diversi allora?

Se diamo un'occhiata alla documentazione roundper entrambe le versioni di Python, troveremo la risposta:

  • In Python 2 , i roundtiebreak si interrompono arrotondando a zero.
  • In Python 3 , i roundtiebreak si arrotondano verso il numero intero pari più vicino .

In altre parole, 5.0/2 = 2.5arrotondare a 3in Python 2, ma arrotondare a 2in Python 3. L'arrotondamento verso il numero intero pari più vicino potrebbe sembrare strano, ma in realtà si chiama arrotondamento del banchiere e cerca di trattare i valori positivi e negativi in ​​modo simile per ridurre la distorsione.

Lunghezza 13 frammento

class C:__x=1

Essendo orientato agli oggetti, Python ha delle classi. Quanto sopra è una classe Cche ha un singolo attributo __ximpostato su 1.

Possiamo accedere agli attributi di classe usando la notazione punto. Ad esempio, se abbiamo la classe

class MyClass(): my_attr = 42

quindi la stampa MyClass.my_attrcomporterebbe 42, come previsto.

Tuttavia, se facciamo lo stesso e proviamo ad accedere C.__xcome sopra definito, otteniamo:

AttributeError: type object 'C' has no attribute '__x'

Cosa sta succedendo? Cchiaramente ha un __xattributo!

Il motivo è che gli attributi che iniziano con __emulano variabili "private", qualcosa che Python non ha . Python modifica il nome di qualsiasi attributo a partire da __, aggiungendo il nome della classe in modo da evitare conflitti di riutilizzo dei nomi. Nell'esempio sopra, se fossimo davvero determinati ad accedervi 1, dovremmo invece farlo

>>> C._C__x
1

Lunghezza frammento 14

NotImplemented

Python non ha solo classi, ma ha anche un sovraccarico dell'operatore. Ad esempio, puoi avere una lezione

class Tiny():
    def __lt__(self, other):
        return True

dove __lt__è l'operatore less-than. Ora, se facciamo un'istanza di Tiny, possiamo farlo

>>> t = Tiny()
>>> t < 1
True
>>> t < "abc"
True

poiché abbiamo definito __lt__di tornare sempre True. Nota che possiamo anche fare

>>> 42 > t
True

ma le seguenti interruzioni:

>>> t > 42
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    t > 42
TypeError: unorderable types: Tiny() > int()

Aspetta, come funziona? Non abbiamo specificato un comportamento per maggiore rispetto a Tiny, quindi non sorprende che l'ultimo caso si interrompa. Ma allora come fa un int(42) a sapere che è maggiore del nostro Tinyoggetto?

Python ha una costante incorporata NotImplemented, che può essere restituita con un metodo speciale di confronto. Proviamolo:

class Unknown():
    def __gt__(self, other):
        # __gt__ for greater-than
        print("Called me first!")
        return NotImplemented

Ora, se creiamo un'istanza della nostra nuova classe:

>>> u = Unknown()

Possiamo farlo:

>>> t < u
True
>>> u > t
Called me first!
True

Come possiamo vedere, quello che è successo u > tè che Python ha provato a chiamare per Unknownprimo il metodo maggiore di , ha scoperto che non era implementato e ha invece provato il metodo minore di per l'altra classe ( Tiny)!

Lunghezza frammento 15

x=[],;x[0]+=[1]

Questo è un po 'divertente. Per prima cosa assegniamo xa essere [],una lista vuota all'interno di una tupla, cioè ([],). Quindi facciamo ciò x[0]+=[1]che tenta di estendere l'elenco vuoto all'interno dal secondo elenco [1].

Ora, ricordate che le liste sono mutabili e tuple sono im mutabili - cosa succede quando si tenta di modificare un oggetto mutabile all'interno di un oggetto immutabile?

>>> x=[],;x[0]+=[1]
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    x=[],;x[0]+=[1]
TypeError: 'tuple' object does not support item assignment

Oh, quindi dà un errore, immagino sia prevedibile. E se provassimo a stampare x?

>>> x
([1],)

Eh? L'elenco è cambiato!

Se sei curioso di sapere cosa sta succedendo qui, assicurati di dare un'occhiata a questo post sul blog .

Lunghezza 16 frammento

@lru_cache(None)

Aggiungi cache! Questo è un semplice esempio di decoratore disponibile in Python 3.

Supponiamo di avere la seguente ingenua implementazione di Fibonacci:

def f(n):
    if n < 2: return 1
    return f(n-1) + f(n-2)

Come la maggior parte dell'introduzione ai corsi di programmazione può dirti, questo è un pessimo modo di implementare Fibonacci, portando a un tempo di esecuzione esponenziale poiché stiamo effettivamente aggiungendo molti 1 nel caso base. f(10)? Funziona in una frazione di secondo. f(32)? Prenditi un po 'di tempo, ma ci arriva. f(100)? No.

Ma se memorizziamo nella cache i risultati, le cose dovrebbero andare molto più velocemente. Potremmo sempre usare un dizionario per la cache, ma proviamo invece qualcos'altro:

from functools import lru_cache

@lru_cache(None)
def f(n):
    if n < 2: return 1
    return f(n-1) + f(n-2)

Come possiamo vedere, tutto ciò che ho fatto è importare lru_cachedal functoolsmodulo e aggiunto @lru_cache(None)prima della mia funzione. @denota un decoratore che avvolge una funzione, in questo caso per memoria. lru_cacheIl primo argomento è maxsize, la dimensione massima della cache - qui l'abbiamo impostata Noneper indicare nessuna dimensione massima.

Ora se proviamo ad usarlo:

>>> f(100)
573147844013817084101

E non ci è voluto nemmeno un secondo!

Nota: f(1000)porta a un errore di profondità di ricorsione, ma questa è una storia per un'altra volta


Quale intervallo di piccoli numeri interi "cattura" Python per l' isoperatore?
mbomb007,

@ mbomb007 Da questa domanda , sembra essere da -5 a 256. Puoi provare -5-1 is -6e 255+2 is 257testare.
Sp3000,

37

annotare in fretta

Factoide: posso definire Jot con 2 voti positivi e dimostrare che Turing è completo di 8 (non usando le lunghezze 4, 6 o 7).

Lunghezza 1

1

Questo è un esempio di due funzioni in Jot. La prima è la stringa vuota, che restituisce la funzione di identità. Il secondo è 1, che è l'operatore di raggruppamento di Jot. 1restituisce λxy.[F](xy)( notazione del calcolo lambda ), dove si [F]trova il programma prima del 1(qui, la stringa vuota). Quindi, questo programma è la funzione λxy.(λz.z)(xy)che semplifica λxy.xy.

Lunghezza 2

10

Ora stiamo introducendo l'altro simbolo di Jot: 0. Ancora una volta, se [F]rappresenta il valore del programma finora, 0valuta [F]SK, dove Se Kprovengono dalla logica combinatoria . Ho definito l'intera lingua ora.

Lunghezza 5

11100

Dimostrerò ora che Jot è Turing completo definendo una mappatura dalla logica combinatoria a Jot. Questo programma Jot è il combinatore K .

Lunghezza 8

11111000

Questo è il combinatore S.

Lunghezza 3

1AB

Qui, Ae Bnon fanno parte di Jot, ma piuttosto segnaposto per un'espressione arbitraria. L'espressione ABnella logica combinatoria si associa a 1ABin Jot, con Ae Bricorsivamente trasformata da queste tre regole. QED

Lunghezza N

1
10
11
100
101
110
[...]

Ogni numero naturale, espresso in binario, è un programma Jot valido. Di conseguenza, posso generare algoritmicamente più frammenti di lunghezza arbitraria. Dato abbastanza voti, posso risolvere il problema di arresto .


2
Due voti espressi. Adesso definisci la lingua.
John Dvorak

@JanDvorak ci sta lavorando ... è passato così tanto tempo da quando ho fatto ricerche su questa cosa che ho dimenticato tutto :)
Phil Frost,

1
Non vedo perché questo dovrebbe continuare a ricevere più voti. Genererai semplicemente numeri binari casuali di lunghezza crescente: |
Ottimizzatore

1
Lo hai detto per il numero positivo 4. Ma qui stiamo guardando un "numero casuale che hai appena generato"
Ottimizzatore

1
come puoi risolvere il problema dell'arresto? Immagino abbia a che fare con l'uso di un programma infinito (numero di infiniti)?
Filip Haglund

37

bash

factoid:

Il bug estremamente grave di ShellShock era presente a Bash dal 1989 e rimase da scoprire per un quarto di secolo. Gran parte della gioia di scrivere Bash sta affrontando le sue numerose idiosincrasie e incoerenze.

Lunghezza frammento 1:

[

Un alias per il test builtin, che consente il codice del formato if [ a == b ]; then- in realtà [è un comando autonomo, non un elemento sintattico, ed ]è puramente decorativo (sebbene richiesto da [, il suo requisito è arbitrario e puoi eliminarlo usando alias [=test).

Snippet di lunghezza 2:

||

Come logico or nella maggior parte delle lingue, ma per i processi. Eseguirà il comando dopo il ||solo se il comando prima restituisce diverso da zero.

Snippet di lunghezza 3:

x=y

Incarico. Bello e prevedibile ... ma a differenza della maggior parte delle altre lingue, non sono ammessi spazi extra. Il che è abbastanza divertente perché puoi attaccare spazi extra praticamente ovunque tra le cose in Bash, ma non intorno =.

Snippet di lunghezza 4:

$IFS

Separatore di campo interno : questa variabile influenza il modo in cui Bash divide i dati per molte azioni integrate, come l'iterazione di loop e il popolamento di array da stringhe. Usato correttamente può essere molto potente; ma più spesso è la causa di bug sottili e imprevedibili.

Snippet di lunghezza 5:

${x^}

Sostituisci la stringa in x, ma con il primo carattere in maiuscolo! Una funzionalità così frequentemente utilizzata che ha una sua sintassi del linguaggio dedicata.

Snippet di lunghezza 6:

x=($y)

Riempi un array, x, da una stringa o da un elenco di elementi y, suddividendolo su qualsiasi IFS sia attualmente impostato - per impostazione predefinita, spazio bianco. Una funzione molto utile per la programmazione avanzata bash.

Lunghezza frammento 7:

${x[y]}

Array! Ma aspetta, che cos'è ... y è una stringa, non un indice numerico? Sì, Bash supporta array associativi! Molte persone non lo sanno. Devi solo declare -A xprima.

Lunghezza frammento 8:

${x##*,}

Sostituisci x, tutto fino all'ultimo ,carattere (o qualunque cosa tu specifichi). Utile per ottenere l'ultimo campo di un CSV - questo è qualcosa con cui non puoi fare così facilmentecut , che conta solo i campi da sinistra. % e %% consente allo stesso di tagliare da destra; % e # sono stati scelti per la loro posizione sulla tastiera degli Stati Uniti, quindi sarebbe chiaro quale significa sinistra e quale destra, ma ciò non ha molto valore per tutti coloro che non usano una tastiera americana :)

Snippet di lunghezza 9:

[ a = b ]

Nella maggior parte delle altre lingue, un singolo uguale in un'operazione di confronto produrrebbe un comportamento involontario sotto forma di un compito. Non in Bash, comunque. Basta non omettere nessuno degli spazi, qualunque cosa tu faccia!

Snippet di lunghezza 10:

if [ a=b ]

Questo è ciò che accade se ti dimentichi degli spazi obbligatori. Non genererà un errore. Restituirà sempre vero - anche se ae bsono variabili non impostate, o qualunque cosa siano impostate, non importa - restituirà sempre vero. Pensa al codice come if [ "$password"="$correctpass" ]a vedere il potenziale divertente di questa "caratteristica".

Lunghezza frammento 11:

x=${y//a/b}

Sostituzione della sottostringa in stile Regex! Impostare x sul valore di y ma con ogni istanza di a sostituita con b.

Lunghezza frammento 12:

[[:upper:]]*

Pattern matching - non si è limitato al solo utilizzando il carattere jolly * nel guscio, è possibile utilizzare qualsiasi partita standard POSIX, come alnum, alpha, digitetc.

Snippet di lunghezza 13:

function x(){

Un po 'di sintassi C si è insinuata misteriosamente! Uno dei tanti usi completamente diversi per le parentesi graffe e un altro esempio di elementi decorativi opzionali per rendere Bash più simile ad altre lingue - ()o functionpuò essere omesso qui (ma non entrambi). Anche più divertimento con spazi incoerenti - uno spazio dopo il {è obbligatorio, ma non prima della chiusura }, come infunction x { y;}

Snippet di lunghezza 14:

echo {Z..A..3}

Ancora un altro uso totalmente indipendente delle parentesi graffe. Espande un intervallo con un passaggio specificato. In questo caso, produrrà ogni terza lettera dalla Z alla A. Utile per generare sequenze senza usare seq, ma non può essere usato con le variabili, quindi ha funzionalità limitate.

Lunghezza frammento 15:

echo {a,b,c,d}x

Un altro uso simile ma non identico per le parentesi graffe nella generazione della sequenza; stampa ax bx cx dxed è utile per generare un elenco di stringhe da una sequenza o un elenco in un singolo comando. Ancora una volta, tuttavia, l'utilità è limitata in quanto non può essere utilizzata con variabili all'interno delle parentesi graffe.


In realtà, ]non è puramente decorativo. [rifiuterà di funzionare se il suo ultimo argomento non lo è ].
FUZxxl,

Sì, ma non ha altro scopo se non i cosmetici; e se si sostituisce [con la sua altra forma test, allora si ]può omettere senza cambiare nient'altro nella chiamata - sto semplicemente sottolineando che non è la vera sintassi bash, solo zucchero visuale.
Riot

Hai ragione nel dire che non si tratta di sintassi bash, ma il trailing ]è [sintassi e devi fornirlo proprio come devi terminare un'istruzione in C con un punto e virgola.
FUZxxl,

È vero che è obbligatorio, ma non allo stesso modo del punto e virgola C. Il requisito è del tutto arbitrario, come si vede se semplicemente alias [=teste poi si scrive if [ 1 = 1; thenecc. Ma chiarirò la mia formulazione per tenere conto del tuo punto :)
Riot

1
Per quanto riguarda la function x(){sintassi: puoi rilasciare le parentesi, come dici, ma puoi anche semplicemente rilasciare la functionparte. In effetti, è così che la shell POSIX definisce le funzioni, quindi è più portabile in quel modo. È possibile definire una funzione completa in 13 caratteri. Ad esempio:x(){ startx;}
kojiro,

37

APL

factoid

APL ( A P rogramming L anguage) è nato come interprete per una notazione formula ideata da Ken Iverson . Quando la lingua è stata progettata, le persone hanno usato i teletypwriter per comunicare con i computer. Il set di caratteri di questi era limitato, ma a causa della loro costruzione, si potevano mettere più personaggi nella stessa posizione per comporre personaggi complessi. Questa funzionalità è ampiamente utilizzata da APL, contribuendo alla sua famigerata reputazione come linguaggio di sola lettura.

Puoi provare la maggior parte degli esempi su http://www.tryapl.org .

Lunghezza 1

Il personaggio , chiamato paralume, sia per la sua forma che per l'illuminazione che si ottiene dalla sua presenza, introduce un commento. Storicamente, è stato creato sovrastando un (jot) e un (up shoe).

Lunghezza 2

⍳3

La funzione monadica (un argomento) (iota) genera un vettore dei primi pochi numeri naturali. Ad esempio, il suddetto ⍳3cederebbe 1 2 3, il vettore dei primi tre numeri naturali. Su alcune implementazioni di APL, ciò produrrebbe 0 1 2invece, questo dipende dal valore di ⎕IO, l' i ota o rigin.

Lunghezza 3

5\3

A differenza del monadico , la funzione diadica \(espandi) copia l'argomento a destra tanto quanto l'argomento a sinistra; quindi, 5\3cede 3 3 3 3 3. Potresti voler giocare con argomenti vettoriali (come 1 2 3\4 5 6) per vedere cosa fa allora.

Lunghezza 4

A←⍳3

Questo assegna al Avalore di ⍳3. (freccia sinistra) è l'operatore di assegnazione. Un compito non deve essere la cosa più a sinistra in una dichiarazione; le assegnazioni vengono analizzate come chiamate di funzione e restituiscono il valore assegnato per un ulteriore utilizzo.

Lunghezza 5

∘.×⍨A

Una tabella di moltiplicazione tre per tre, ovvero

1 2 3
2 4 6
3 6 9

Questo è un po 'complicato, quindi lasciami spiegare. ⍺∘.f⍵(leggi: alpha jot dot f omega) è il prodotto esterno di e oltre f. Il prodotto esterno è una tabella del risultato dell'applicazione fa ciascuna possibile coppia di elementi da e . In questo esempio, fè ×(moltiplica), producendo una tabella di moltiplicazione. L'operatore (tilde diæresis) commuta i suoi argomenti, cioè ⍺f⍨⍵è uguale ⍺f⍵e f⍨⍵senza operando di sinistra è uguale a ⍵f⍵. Senza l'operatore di pendolarismo questo frammento sarebbe a∘.×a. L'operatore esterno del prodotto è molto versatile; verificare che cosa succede se si sostituisce =per ×!

Lunghezza 6

{×/⍳⍵}

Una funzione fattoriale. Una coppia di parentesi graffe racchiude un dfn (funzione dinamica), ovvero una funzione anonima (cfr. Espressioni lambda). Gli argomenti di un dfn sono legati alle variabili e o solo se il dfn è chiamato come una funzione monadica (argomento singolo, al contrario di diadico, due argomenti). Applichiamo l'argomento giusto, producendo numeri interi da 1a . L' /operatore (barra) si riduce, ovvero f/⍵inserisce ftra gli elementi di . Ad esempio, +/⍳5è giusto 1+2+3+4+5. In questo caso, riduciamo con ×, producendo il prodotto degli articoli di ⍳⍵, che è solo il fattoriale di .

Lunghezza 7

2×3*4+5

Resa 39366. ⍺*⍵(stella alfa omega) è elevato al potere di . APL ha una regola di precedenza molto semplice: tutto viene valutato da destra a sinistra, tutte le funzioni sono associative a destra. Gli operatori si legano più forte delle funzioni e vengono valutati da sinistra a destra. Pertanto, l'espressione sopra con parentesi esplicite verrebbe scritta 2×(3*(4+5))in contrapposizione al solito (2×(3*4))+5.

Lunghezza 8

¯1+3 3⍴A

Questo frammento produce

0 1 2
3 4 5
6 7 8

e mostra due concetti importanti: il primo concetto è la funzione (rho), che rimodella il suo argomento giusto con la forma specificata nel suo argomento di sinistra. La forma di un array è un vettore delle lunghezze di ciascun asse dell'array. La forma di uno scalare è il vettore vuoto. Quindi, 3 3⍴Arimodella Ain una matrice tre per tre. Il secondo concetto è il modo in cui l'addizione viene utilizzata qui: aggiungiamo ¯1(uno sopra la barra), ovvero uno negativo ( ¯è un prefisso per specificare i numeri negativi, mentre -è un operatore) a un array. I due operandi hanno forme diverse, quindi l'operando con la forma minore viene distribuito sull'altro operando, sottraendo uno da ogni elemento nella matrice generata.

Lunghezza 9

+.×⍨3 3⍴A

A, rimodellato in una matrice 3 per 3, moltiplicato per se stesso. L' .operatore (punto) accetta due funzioni e costruisce un prodotto interno , in cui la prima funzione rappresenta l' addizione e la moltiplicazione della seconda funzione . Una semplice, vecchia, moltiplicazione di matrici è +.×, una variante comune è ≠.∧(dove non è uguale e (sopra il cursore) è logica e) per le matrici booleane; molte cose interessanti possono essere modellate come un prodotto interno con determinati operatori al posto di +e ×.

Lunghezza 10

(.5×⊢+÷)⍣≡

(leggi: punto parentesi sinistra cinque moltiplica virata destra più dividi parentesi destra stella-diæresis stessa) Calcola la radice quadrata di un reale usando il metodo babilonese . L'argomento sinistro è il numero di cui si desidera calcolare la radice quadrata, l'argomento destro è l'ipotesi iniziale per la radice quadrata. Inizialmente volevo fornire un'ipotesi iniziale significativa, ma ho finito i caratteri (aggiungere per usare il numero stesso come ipotesi iniziale).

Quindi come funziona? Cominciamo dalla parte sinistra (.5×⊢+÷), prima. Questa espressione usa la notazione tacita che ha origine in J che è stata in seguito riportata a Dyalog APL. La notazione tacita è un po 'difficile per i principianti, quindi leggi attentamente questa sezione. Una sequenza isolata, ad esempio +/÷≢, che le regole di analisi "normali" non risolvono in una singola parte del discorso è chiamata treno. Un treno di due o tre funzioni produce una funzione e (per risoluzione ripetuta), un treno funzione di qualsiasi lunghezza produce anche una funzione. Un treno di tre funzioni fghsi comporta come {(⍺f⍵)g⍺h⍵}, cioè, fe hviene applicato agli argomenti della funzione risultante e il risultato di queste viene applicato g. Un treno di un array e due funzioni similiAfgsi comporta come{Af⍺g⍵} , questo è,gviene applicato agli argomenti della funzione risultante Ae a tale risultato vengono applicati f. Un treno di due funzioni ha anche un semantico, che è spiegato nella documentazione ma non utilizzato in questo esempio.

In questo particolare treno, viene utilizzata una nuova funzione (virata a destra). Si comporta come {⍵}, dando il suo giusto argomento. Pertanto, l'intera espressione è uguale a {.5×⍵+⍺÷⍵}, che è solo il passaggio di iterazione della formula babilonese. È facile vedere come la notazione tacita avvantaggia il golfista; ti permette di radere alcuni personaggi preziosi ove applicabile.

L'ultimo pezzo del puzzle è il (stella diæresis), operatore di potenza . Se l'argomento giusto è un array, si f⍣A⍵applica fa un totale di Avolte. Ad esempio, f⍣3⍵è uguale a fff⍵. Il conteggio può essere negativo, nel qual caso APL cerca di inferire una funzione inversa fe la applica. Se l'argomento diritto è una funzione, anche, f⍣g⍵vale fa fino (fY)gYdove Yè il risultato della applicazione ripetuta fa . In particolare, se gè =(uguale) o (stesso), f⍣≡calcola un punto fisso dif. Questo è esattamente ciò di cui abbiamo bisogno per il metodo babilonese! Vogliamo iterare fino a quando il risultato non converge. Infine, se applicato a una coppia di cose viene invocato come una funzione diadica, l'argomento sinistro è legato a fsinistra, cioè ⍺f⍣g⍵è uguale a (⍺∘f)⍣g⍵dove A∘fsi comporta come {Af⍵}.


Hai più voti! Ne possiamo avere ancora?
Luser droog

@luserdroog Certo, fammi pensare ancora.
FUZxxl,

Posso modificarlo ed estenderlo?
Adám,

@ Adám Sì, per favore.
FUZxxl,

∘.×⍨a mi dà un errore di valore . Lo sto usando correttamente?
Cyoce,

37

Matlab

Snippet 26: scorre ripetutamente le matrici

Questo è qualcosa che ho scoperto di recente. Di solito si esegue l'iterazione su un determinato vettore per i loop. Ma invece dei vettori, puoi anche usare le matrici ( rand(10)produce una matrice 10x10 con numeri distribuiti uniformemente tra 0 e 1).

for k=rand(10);disp(k);end

Viene quindi visualizzato un vettore di colonna della matrice casuale per iterazione.

Snippet 25: stampa semplice

Sappiamo che la trama è facile in Matlab, ma c'è una funzione super facile ezplot( E-Zcapito? Ci è voluto un po 'di tempo prima che finalmente lo capissi, come ho Zsempre scritto come al sedposto di c, qualunque cosa ...) A tutti piacciono le curve ellittiche:

ezplot('y^2-x^3+9*x-10.3')

curva ellittica

Snippet 24 - integrazione

La vecchia parola (ma ancora in uso nel calcolo numerico) per integrazione è "quadratura", puoi indovinare quale sia il risultato di quello seguente?

quad(@(x)4./(1+x.^2),0,1)

Snippet 23 - immagini

Naturalmente Matlab è anche molto popolare tra gli scienziati che devono lavorare con le immagini (ad es. Analisi di immagini mediche), quindi ecco una funzione molto utile. Il primo argomento è l'immagine, in secondo luogo l'angolo e il terzo argomento opzionale qui dice alla funzione di ritagliarlo alla dimensione originale.

imrotate(rand(99),9,'c')

Qui

Snippet 22 - musica

load handel;sound(y,Fs)

Suonerà in questo modo (link di YouTube)

Snippet 21: differenziare e integrare

polyint(polyder(p),c)

Puoi facilmente differenziare e integrare i polinomi usando queste due funzioni. Durante l'integrazione, è possibile passare un secondo argomento che sarà la costante.

Snippet 20: ritorno ai polinomi

p=poly(r);cp=poly(A)

Vuoi il polinomio con le radici dentro r? Facile: p=poly(r). Vuoi il polinomio caratteristico di una matrice A? Facile: cp=poly(A). Così roots(p)è esattamente r(o una permutazione di r).

Snippet 19 - un altro trucco magico

fminsearch(fun,x0);

Ci sono persone che adorano assolutamente questa funzione. Questo in pratica cerca solo un minimo di funcon un valore iniziale x0(può essere un vettore) senza alcuna condizione attiva fun. Questo è ottimo per montare piccoli modelli in cui non puoi (o sei troppo pigro) per differenziare la funzione errore / penalità / obiettivo. Utilizza l' algoritmo simplex Nelder-Mead che è piuttosto veloce per le funzioni in cui non è possibile fare ipotesi.

Snippet 18 - introduzione ai polinomi

p=polyfit(x,y,deg)

Matlab ha una bella soluzione per far fronte ai polinomi. Con polyfitte ottieni un polinomio di gradi minimi quadrati degche approssima i punti in x,y. Ottieni un vettore pche memorizza i coefficienti dei polinomi, perché questa è l'unica cosa di cui hai bisogno per rappresentare un polinomio. Se torni allo snippet 15, puoi fare la stessa cosa scrivendo c = polyfit(x,y,2). Quindi, ad esempio, [1,-2,3]rappresenta il polinomio x^2 - 2*x+3. Naturalmente ci sono anche funzioni per l'adattamento di altre funzioni elementari o arbitrarie.

Snippet 17 - angoli e discontinuità

unwrap(angle(c))

Se si desidera ottenere l'argomento di un vettore "continuo" di numeri complessi, si ottengono spesso valori che sembrano avere una discontinuità. Ad esempio angle([-1-0.2i,-1-0.1i,-1,-1+0.1i,-1+0.2i])ti prenderà [-2.94,-3.04,3.14,3.04,2.94]poiché anglerestituisce solo angoli tra -pie pi. La funzione unwrapsi occuperà di questo! Se ottieni una discontinuità come questa, aggiungerà semplicemente un multiplo di 2*piper rimuoverli: '[-2.94, -3.04, -3.14, -3.24, -3.34]' Funziona anche con le matrici 2D! Se si traccia semplicemente l'argomento di numeri complessi con una parte reale negativa, si ottiene la prima grafica, si ottiene la prima immagine, con unraprap si ottiene la seconda:

senza scartare con scartare

[x,y] = meshgrid(-1:0.01:0,-0.5:0.01:0.5);
z = x+i*y;
imagesc(angle(z))
imagesc(unwrap(angle(z)))

Snippet 16 - prodotto scalare

[1;2;3]'*[4;5;6]

Naturalmente ci sono metodi incorporati (come dot), ma con l'operatore di trasformazione della matrice 'è semplice. Se non sai se hai vettori di riga o colonna, puoi semplicemente usare a(:)'*b(:)dove a(:)restituisce sempre un vettore di colonna.

Snippet 15 - minimi quadrati lineari, il metodo brutto con la bacchetta magica

[x.^2,x,x.^0]\y

xè il vettore (colonna) con i valori sull'asse x, yi valori y rumorosi. Digita c=[x.^2,x,x.^0]\ye ottieni i coefficienti del polinomio di secondo grado. Ovviamente puoi usare una delle miliardi di funzioni integrate di matlab (che noia) perché non usare la bacchetta magica? =)

x = (-1:0.1:2)';
y = 3*x.^2-2*x+1+randn(size(x)); %add some gaussian (normal) noise
A = [x.^2,x,x.^0];
c = A\y              %output: c = ]3.0049; -2.3484; 1.1852]
plot(x,y,'x',x,A*c,'-')

LinReg

Snippet 14 - grafici

gplot(graph,x)

Ecco come tracciare un grafico. graphdovrebbe contenere una matrice quadrata di adiacenza e xdovrebbe essere una matrice nx2 che contiene le coordinate di ciascun nodo. Consente di creare un grafico casuale: graph = triu( rand(8)>.7)(crea una matrice che contiene 0s e 1s, ottieni solo il triangolo superiore per un grafico interessante). x = rand(8,2)poi trama con alcuni stili fantasiosigplot(graph,x,'k-.d')

grafico (Lo dichiaro come arte moderna.)

Snippet 13 - meshgrid

meshgrid(a,b)

Questa è una delle funzioni più straordinarie, semplice ma utile. Se vuoi tracciare una funzione a valore reale in base a due variabili, puoi semplicemente definire un vettore di valori per l'asse xe uno per l'asse y (aeb). Quindi con meshgrid, puoi creare due matrici della dimensione len (a) x len (b) in cui una ha solo il vettore acome colonna e l'altra ha solo la colonna ha solo i vettori bcome righe. Esempio di utilizzo: a = -3:0.2:3;[x,y]=meshgrid(a)(se entrambi i vettori sono uguali, è sufficiente passarne uno.) Quindi è possibile digitarez=x.^2+-y.^2 e ad es.mesh(x,y,z). Questo funziona per un numero arbitrario di dimensioni! Quindi questo non è ottimo solo per la stampa, ma anche per ottenere tutte le possibili combinazioni di diversi vettori ecc. nome della funzione ...)

maglia

Snippet 12: disegno

plot(x,x.^2)

Prendi un vettore x=-3:0.5:3e lascia plotfare il resto. Ci sono molte altre funzioni per la stampa, questa è solo una di base che puoi usare sempre. Sarebbe già abbastanza per scrivere plot(v)e i dati vverranno tracciati rispetto agli indici dell'array. Quanto è semplice? Se vuoi modellare la tua trama, aggiungi una stringa come terzo argomento: ad es. 'r:o'Creerai una linea rossa tratteggiata con cerchi attorno ai punti dati. Se vuoi più grafici, aggiungi semplicemente più argomenti o usa le matrici invece dei vettori. Infallibile.tracciare

Snippet 11 - handle di funzione

f=@(x,y)x+y

Questo è un esempio di handle di funzione in cui viene archiviato f. Ora puoi chiamare f(1,2)e ricevere 3. Gli handle di funzione in matlab sono molto utili per le funzioni matematiche (ad es. La stampa) e puoi definirle in una riga. Ma uno svantaggio è che non puoi avere condizionali o a tratti (e quindi nessuna ricorsione). Se vuoi questo, devi usare l' functionistruzione e dichiarare una nuova funzione, e ognuna di queste deve essere memorizzata in un file separato ... (WHYYYYYY ????)

PS: Otterrai un altro uovo di Pasqua divertente se digiti whyla console: hanno creato un'enorme funzione che produce messaggi casuali come:

The tall system manager obeyed some engineer.
The programmer suggested it.
It's your karma.
A tall and good and not excessively rich and bald and very smart and good tall and tall and terrified and rich and not very terrified and smart and tall and young hamster insisted on it.

... il che è molto confortante se sei abbastanza disperato da chiedere alla console why...

Snippet 10 - Come appare la mia matrice?

spy(eye(9))

Come ormai sai eye(9)crea una matrice di identità 9x9. spycrea solo un che mostra le voci zero / diverse da zero della matrice. Ma puoi anche usarlo per visualizzare qualsiasi dato binario 2d. Se chiami spysenza discussione otterrai un simpatico uovo di Pasqua =)

spiare l'identità spiare easteregg

Snippet 9

kron(a,b)

La kronfunzione valuta il prodotto Kronecker di due matrici. Ciò è molto utile per gli operatori lineari multidimensionali discretizzati. Lo usavo anche di tanto in tanto per giocare a golf con il codice. Vuoi tutti i possibili prodotti delle voci di ae b? kron(a,b), Ecco qui.

Snippet 8

5*a\b.*b

Ok qui ho confuso 3 diversi operatori. Puoi moltiplicare qualsiasi matrice per uno scalare semplicemente usando *. (Quindi ogni voce della matrice viene moltiplicata per quello scalare). Ma *esegue anche moltiplicazioni di matrice. Se si antepone un punto .*all'operatore, questo moltiplica due matrici della stessa dimensione ma per quanto riguarda l' ingresso . (Questo può essere fatto anche con operatori di divisione come /e \.)

Successivamente, l'operatore barra rovesciata può essere utilizzato come divisione sinistra (al contrario del /quale esegue la divisione destra come al solito) ma è anche l'operatore più potente e caratteristico di matlab: esegue una "divisione matrice". Diciamo che hai il sistema di equazioni lineari A*x=be per cui vuoi risolverlo x, quindi puoi semplicemente digitare x=A\b. E \(puoi anche usare, /ma è meno comune per le matrici) prima analizza rapidamente la matrice e usa i risultati per trovare l'algoritmo più veloce per eseguire questa inversione-moltiplicazione! (Vedi ad esempio qui )

Ma puoi anche usarlo per sistemi sotto o troppo definiti (dove non esiste un inverso o dove la matrice non è nemmeno quadrata, ad esempio per il metodo dei minimi quadrati). Questa è davvero la bacchetta magica di Matlab.

Snippet 7

[a,b;c]

Ok, non sembra molto, ma è uno strumento molto conveniente: concatenazione di matrici. Una virgola tra due espressioni significa che vengono concatenate orizzontalmente (ciò significa che devono avere la stessa altezza) e un punto e virgola significa che la 'linea' precedente sarà sopra la 'linea' successiva (per linea intendo tutto tra due punti e virgola. Solo un semplice esempio: a = [1,2;3,4]; b = [5;6]; c =[7,8,9]; d=[a,b;c];risulterà lo stesso ddi d=[1,2,5; 3,5,6; 7,8,9](capito?)

Snipped 6

eye(7)

Questa funzione produce una matrice di identità 7x7 completa. È così facile Ci sono altre funzioni come quelle nan,inf,ones,zeros,rand,randi,randnche funzionano allo stesso modo. (Se passi due argomenti puoi impostare l'altezza / larghezza della matrice risultante.) Come mostrerò più avanti, puoi facilmente creare e (e in modo molto visivo) concatenare matrici (array 2d) che è così dannatamente utile e facile se devi risolvere numericamente equazioni differenziali parziali. (Quando risolvete i PDE l'approccio generale è la discretizzazione degli operatori derivati, in pratica otterrete solo un enorme sistema di equazioni lineari che devono essere risolte. Queste matrici normalmente sono sparse (solo pochissimi elementi diversi da zero) e hanno un qualche tipo di simmetria. Ecco perché puoi facilmente "comporre" la matrice di cui hai bisogno.

Snippet 5

a(a>0.5)

Spero che non ti stanchi di accedere a tutti gli array. Questo mostra un modo semplice per ottenere tutti gli elementi di un array che soddisfano alcune condizioni. In questo caso si ottiene un vettore di tutti gli elementi ache sono maggiori di 0,5. L'espressione a>0.5restituisce solo una matrice della stessa dimensione adi quella per ogni elemento che soddisfa la condizione e una 0per ogni elemento che non lo fa.

Snippet 4

a(:)

Questo di nuovo restituisce il contenuto di aun vettore di colonna (matrice nx1). Questo è utile se non sai se hai archiviato i tuoi dati come vettore di colonna o riga o se i tuoi dati sono bidimensionali (ad esempio per i metodi con differenze finite 2d).

Snippet 3

1:9

È possibile creare facilmente vettori (in questo caso matrici 1xn) con l'operatore punto e virgola. In questo caso ottieni il vettore [1,2,3,4,5,6,7,8,9]. Ciò è anche particolarmente utile per accedere a sezioni di altri vettori, ad esempio per a(2:4)accedere al secondo, terzo e quarto elemento del vettore a. Puoi anche usarlo con una dimensione del gradino, 0:0.5:10circa.

Snippet 2

i;

Un punto e virgola sopprime l'output sulla console. Puoi vederlo come una cosa buona o cattiva, ma mi piace per il debug di roba. Qualsiasi riga di calcolo ecc. Stamperà automaticamente il suo risultato sulla console, a condizione che non si annulli l'output con un punto e virgola.

Snippet 1

i

I numeri complessi sono un tipo di numero di base. (Peccato che molte persone usino icome variabile di conteggio per i loop, nel qual caso viene sovrascritto.)

Intro

Per coloro che non lo conoscono, MatLab è un linguaggio di programmazione (con un bel IDE chiamato anche MatLab?) Che è prima di tutto destinato ai calcoli numerici * e alla manipolazione dei dati. (Esiste una controparte open source chiamata "Octave") Dato che è solo ** interpretata, non è molto veloce, ma il punto di forza è che puoi facilmente manipolare le matrici e molti algoritmi sono implementati in modo ottimizzato in modo che funzionino piuttosto velocemente quando applicato su matrici. È anche una lingua molto semplice da imparare, ma non la consiglio come lingua di partenza poiché assumerai delle cattive abitudini di "programmazione".

* Poiché è un linguaggio interpretato, può essere molto lento per progetti costosi, ma hai metodi di parallelizzazione integrati e puoi anche usare più computer insieme per eseguire un programma. Ma se vuoi davvero andare veloce, penso che tu dipenda ancora da C o Fortran o da cose folli del genere. Tuttavia, molti algoritmi implementati (moltiplicazione di matrici, sistemi di risoluzione di equazioni lineari ecc.) Sono fortemente ottimizzati e funzionano abbastanza bene. Ma se programmate gli stessi algoritmi in Matlab stesso, dovrete aspettare =) (Qualcosa di veramente poco intuitivo quando vieni da altre lingue è che se vettorizzi le tue operazioni invece di usarle per i loop, puoi risparmiare molto tempo in Matlab .)

** Puoi in qualche modo compilare i tuoi programmi, ma ciò converte principalmente il codice sorgente in un file illeggibile (per gli umani), che non è molto più veloce quando eseguito.


1
Ho questo problema molto spesso ... impostando iqualcosa e poi vivendo un comportamento inaspettato quando non è l'unità complessa.
feersum

3
Bel uovo di pasqua! Se digiti "modifica spia" trovi un esempio di offuscamento del codice :-)
Abulafia

1
Sono andato a votare questo e poi ho capito che avevo già. Ahimè, se solo potessi votarlo di nuovo. Continuate a venire, @flawr!
Alex A.

2
Se stai esaurendo l'ispirazione sulle cose da mostrare, posso consigliare il blog di Mathworks: sull'arte di MATLAB di Loren Vershure Descrivono spesso le migliori pratiche che possono essere mostrate entro il limite del personaggio. Per curiosità si consideri Abandon Matlab e per funzioni e caratteristiche non documentate è possibile visitare Matlab non documentato di Yair Altman
Dennis Jaheruddin,

1
@flawr - Per i factoidi, può anche essere bello menzionare il fatto che storicamente MATLAB è stato originariamente creato per gli studenti di Informatica all'Università del New Mexico (Cleve Moler era all'epoca presidente) come una semplice interfaccia per LINPACK ed EISPACK (... ora sostituito da LAPACK ) senza dover imparare FORTRAN .... e per la sua facilità d'uso, si è diffuso molto rapidamente in altre istituzioni accademiche :)
rayryeng

35

CJam

Prova qui i frammenti seguenti

Snippet di lunghezza 20:

q~{]__~z\z<=\~*0>*}*

Un calcolatore min-mod . Un estratto dalla domanda:

La funzione minmod è una variante del familiare min , che appare negli schemi ad alta risoluzione che limitano la pendenza per equazioni differenziali parziali. Dato un certo numero di pendenze, rileva la pendenza più piatta, mentre si prende cura dei segni relativi tra le pendenze.

La funzione accetta un numero arbitrario di parametri. Quindi minmod (x 1 , x 2 , ..., x n ) è definito come:

  • min (x 1 , x 2 , ..., x n ) , se tutti x i sono strettamente positivi
  • max (x 1 , x 2 , ..., x n ) , se tutti x i sono strettamente negativi
  • 0 , altrimenti.

Lunghezza frammento 18:

l'[,65>Dm>_el+_$er

Un encoder ROT13. Sposta solo a-zA-Zcaratteri dalla stringa di input tramite STDIN

Lunghezza frammento 15:

T1{_2$+}ri2-*]p

Un programma completo per stampare i primi Nnumeri da una serie di Fibonacci dove Nviene fornito come input tramite STDIN.

Lunghezza frammento 12:

{{_@\%}h;}:G

Una semplice funzione GCD. Questo può essere usato come 2706 410 Gper mettere in pila GCD.

Lunghezza frammento 11:

123456 789#

#è l'operatore di potenza. Questo frammento mostra una fantastica funzionalità di CJam che supporta BigInts per quasi tutte le operazioni matematiche. Quindi l'output del codice sopra è

1596346205622537943703716803040694151242100030904924074732295184521676912291137885341977590649991707684635184329980991487148618486236239062505001539322685142817506810040361209550544146292158784625519911512640361780862459268161619223326802388689703997604303632605734938879647069477372395799326590488746599202521617640394227957532720581758771344616555153473551874187964029973716015080326283503474062024803237072761129557356772954771383125420283743787215768524095651476398918270831514362626616089349128838080859262141293069421199363839940462244772673481244848208112002212957221705577938865719802035511067875502253218277834350725436729497351901219311577128600087062378434520948898301738545267825952998284599001356281260973911216650526574435975050678439968995805415462116669892745933523276658479456263859786003695570642598885206779863730608803831608206418317758451327165760242416052588688579435998154295782751455020445483571514197850814391880423853968520336337963918534259580183058727377932419280412466915889059399591196961188841001024998633317094826403760131868252088477018937989608302521450181593409274231460335072324865982559395114735391976545471553525054490202974741119144469523879456646833238659929705233941114530149037245274032070536718197592615630616792756562341411027203615235147973615347081993563361626845258162606172599728677944001956482301240050182368840648532697569098833480384074404562991348377266778603059081932412368912313845464302833428950934701568958836851009236647605585910687215977468114323293396641238344799575626940766355697576957869656153567798618227770961980620119004224798449940378878601283741944503399682599666873704888519152796472231721010884561046439019823540214190109829183178504573391524533915085342799888899681052113605127068137552531204917650779012455136663716975904242872042805633443567570913936237754642040107392687168596924804730637819953463737212774674563401663682370631910559669378413063684132477269578881395521544729393136204246705936061735379354437327940116154383441927197123218522827575163913310005036963663583344508839784971260123709283218409462028161021477446586507813599051643059982983426688872855309396405653159417356549291603532443699350168178837164682957610433456205211423600319694496115159970718912091395232327389520091646132878609779171226748990343349416763319432268713023302555895744813731889452605219001900815755497209921418814092923394321459962373890912709775151652200071533644718727513889263907829300496554849544461628702471995210369421320165755673222520834013956492183306187393652197405863508709529644837118590847002900783148394313160749018413291215958936871830666201928218294362550829287373305552379418641499562597137520153409556227576809855521876196531587454478159211299517511047868125975115347272184123454929507976958328038242400918390689757262398695703472270927183494613959476164389143107240083171566284628032072645081703351075328092783401422849512230275075331561337345714881104575020436358133210849231625973013523497330004645467493618279226202227586584610761439335895760888873155403816627190368675397978355381544497413492223577022267403347927237298551052219150516984577176643706356698282552857754120841266435149587248192704898338826251727748499150285409036076919533685800933215325289882260771526293167171975367192287689881199864600661035143522211647660445960687046757311913589429739868592726372013684511683081229044622752191694278221303073075505531920922815724661725685493922212700535444400760813940151761980008355835574184921854364539924999643954874549857103642483664109073938527328920827803218865362851320233433429604394590974694396314165313743853607609394553133883545319222169958204731303672940856293527174545435349105954532301106962634516087237739490953930886293289854731305112253177512851251930821765454042415085420000484369355605183062368648992392499663861508991984554431113080399485470268940148600970493633737364443822752829774334511729579419931500217970224646496435527826186627011323464848141074486509849545954714213290443775688291020289759390171236344528896

Snippet di lunghezza 10:

"`%W_"_W%`

Abbiamo già fatto quine, invertiamolo !. Questa è una delle quine inverse più corte in CJam. Reverse quine è una quine che stampa il suo codice sorgente in ordine inverso.

Snippet di lunghezza 9:

5,K,+_&S*

Questo frammento mostra molte funzioni di CJam,

5, "create an array of numbers 0 to 4"
K, "create an array of numbers 0 to 19"
+  "List concatination"
_  "Duplicate top stack element"
&  "Set distinct operator in this case"
S* "Join array elements with space character"

Lunghezza frammento 8:

"`_~"`_~

Uno dei più piccoli quines possibili in CJam. Questo è un vero quin, nel senso che in realtà non legge il codice sorgente in alcun modo. (La lettura del codice sorgente non è nemmeno possibile in CJam)

Lunghezza frammento 7:

"AB"_m*

m*crea tutti i prodotti cartesiani dei primi due elementi dello stack. Ad esempio, il codice sopra verrà messo ["AA" "AB" "BA" "BB"]in pila, che è il prodotto cartesiano di "AB"e "AB".

Snippet di lunghezza 6:

"_~"_~

Un codice ripetuto dall'aspetto gradevole. NON eseguire questo :). Questa rappresentazione del codice è la base per il quine più semplice in CJam. Metti la stringa "_~"in pila, ne fai una copia ( _) e la valuti. Che a sua volta fa di nuovo la stessa cosa (e di nuovo ..) fino a raggiungere l'eccezione massima ricorsione.

Snippet di lunghezza 5:

{A}:F

Ecco come funziona una funzione di base in CJam, l'espressione sopra assegna il blocco di codice {A}alla variabile F. Ora nel tuo codice, puoi mettere Fovunque per eseguire il blocco di codice (e ottenere 10in questo caso)

Snippet di lunghezza 4:

"A"~

È possibile valutare qualsiasi blocco di codice o stringa o anche un singolo carattere utilizzando ~. L'espressione sopra risulta a10

Snippet di lunghezza 3:

Kmr

Un tipico generatore di numeri casuali compreso tra 0 e K20.

Snippet di lunghezza 2:

es

Ciò fornisce il timestamp corrente (millisecondi dall'epoca). CJam ha anche etl'ora locale in un formato più utilizzabile che restituisce un array comprendente le varie parti dell'ora corrente (giorno, ora ecc.).

Lunghezza frammento 1:

A

CJam ha quasi tutti gli alfabeti maiuscoli come variabili predefinite. Aè 10, Bè 11 e fino a K20. Pè pi (3.141592653589793), Nè nuova linea e molti altri . Questi possono essere molto utili quando hai bisogno di valori iniziali in variabili o anche quando hai bisogno di un numero di due cifre in 1 byte.

factoid

CJam si ispira a GolfScript ma al suo interno ha molte funzionalità incluso il supporto per una chiamata GET in rete: D

PS: proverò ad aggiornare la risposta ogni 5 voti o ogni 2 ore (che mai è precedente)


Ci sono alcuni problemi con il tuo esempio ROT13: p Ma sono impressionato dal quine, penso che lo prenderò in prestito :)
aditsu,

@aditsu qual è il problema?
Ottimizzatore

Cambia il caso delle lettere nz. Inoltre, ha un @ per nessun motivo, puoi invece inserire la D lì.
aditsu,

@aditsu Abbastanza sicuro che si tratti di un ROT 13 nell'intervallo a-zA-Z e che sia la ragione del cambio di caso. Non riesci a leggerlo? è solo la tua lingua: P @ è lì per 18 caratteri immagino: D
Ottimizzatore

Non è quello che normalmente fa ROT13. Non capisco perché mi stai chiedendo se posso leggere la mia lingua, il problema non riguarda la comprensione di ciò che fa il programma, ma il fatto che non fa ciò che ci si aspetta.
aditsu,

34

Lisp comune

Lisp (da LISt Processing) è una delle lingue più antiche ancora in uso oggi (solo FORTRAN è più vecchia). È noto per essere la prima lingua in cui il codice è dati e i dati sono codice; chiamato omoiconicità. È stata anche la prima lingua ad avere la raccolta dei rifiuti. Originariamente progettato da John McCarthy in un documento del 1958 come un linguaggio interamente teorico, divenne un vero linguaggio quando Steve Russel si rese conto che la funzione di valutazione poteva essere implementata su un computer. È prevalente nell'Intelligenza Artificiale ed è immediatamente riconoscibile dalla sua preponderanza di parentesi. Common Lisp è stato progettato per unificare molti dei vecchi dialetti Lisp in una forma più standardizzata.

Cercherò che ogni frammento sia eseguibile da solo, sebbene non faccia necessariamente qualcosa di valore. Inoltre, poiché sto usando Common Lisp, i concetti fondamentali e molta sintassi si applicano in altri dialetti, ma alcune funzioni non funzioneranno, per esempio, in Scheme.

Lunghezza 1

*

A causa dell'enfasi sull'uso di S-Expressions e liste per la codifica, ci sono pochissime espressioni valide in Lisp che non contengono parentesi, chiamate atomi. Tutto ciò che viene digitato direttamente nel REPL (read-eval-print loop) viene trattato come una variabile e valutato come tale. *contiene il valore precedente che era stato stampato dal REPL.

Lunghezza 2

()

Questa è la lista vuota, uno dei simboli più importanti in Lisp. Ogni lista corretta in Lisp è terminato con un elenco vuoto, simile a come ogni stringa corretta in C termina con \0.

Lunghezza 3

(*)

Questa è una chiamata di funzione di base, che consiste in un simbolo racchiuso tra parentesi. Lisp non contiene operatori, sono solo funzioni. Ho scelto la moltiplicazione specificamente perché non è in realtà una funzione binaria; l'operatore di moltiplicazione in Lisp accetta un numero indefinito di argomenti. Se non viene fornito alcun argomento, restituisce 1l'operatore identità per la moltiplicazione.

Lunghezza 4

`(1)

Questa è una cella contro, che è solo un altro modo di dire che è una coppia di elementi. In Lisp, ogni elenco è costituito da celle contro collegate a celle contro, dove il primo elemento (il car) è il valore e il secondo elemento (il cdr) punta alla cella contro successiva. Ciò costituisce la base per Lisp basata su elenchi collegati. Questa cella di contro ha 1come la macchina e la lista vuota come il suo cdr.

Lunghezza 7

(not t)

Voglio toccare i valori di verità in Lisp. Questo sarebbe tornato nil. In Common Lisp, tè il simbolo di true while nile ()rappresentano false e sono uguali tra loro, ma nota che questa definizione non è standard per tutti i dialetti Lisp; Lo schema, ad esempio, distingue tra #fper false e '()per l'elenco vuoto.

Lunghezza 9

(cdr ())

Come ho detto prima, il cdr è l'elemento di coda di un elenco, che puoi ottenere con la funzione cdr. Allo stesso modo, puoi ottenere l'elemento testa, l'auto, con la funzione car. Abbastanza semplice, vero? L'auto e il cd della lista vuota sono entrambi nil.

Lunghezza 10

(cons 1 2)

Infine, abbastanza lunghezza per iniziare a lavorare con le liste. conscrea una cella contro con il primo parametro come la macchina e il secondo come il cdr. Ma invece di stampare (1 2), dà (1 . 2). Tornando allo snippet di lunghezza 2, un elenco corretto dovrebbe terminare con l'elenco vuoto, quindi il cdr dell'ultima cella di contro dovrebbe puntare all'elenco vuoto. In questo caso, l'ultima cella contro indica 2, quindi Lisp ci informa che abbiamo un elenco improprio, ma ci consente ancora di farlo, come il modo in cui è possibile creare una stringa C senza un \0.

Lunghezza 11

(cons 1 ())

Ora abbiamo creato il nostro primo elenco correttamente formato. È una cella singola contro con una macchina di 1e un cdr di (). Noterai che per ogni altro elenco, lo guido con un backquote / tick; qualsiasi altro elenco appropriato tenterebbe di valutare il suo primo argomento come una funzione con gli elementi rimanenti come parametri. A rigor di termini, ()non è un elenco però; è un simbolo composto da a (e a )che rappresenta l'elenco vuoto. Lisp ti consente di usare quasi tutti i caratteri stampabili nel nome di un simbolo e ti permetterà di ridefinire qualsiasi simbolo tu voglia.

Lunghezza 12

(cdr `(1 2))

Ciò produrrebbe (2), non 2come alcuni immaginerebbero. Ricorda, ogni cdr dovrebbe puntare a un'altra cella cons o all'elenco vuoto; ovviamente 2non è la lista vuota, quindi deve essere un'altra cella di contro una macchina di 2e un cdr di ().

Lunghezza 13

'#1=(1 . #1#)

Ciò produrrebbe un elenco circolare con solo il singolo valore 1. Se stampato, stamperebbe “(1 1 1 1 ...” per sempre, in modo che in pratica possa essere considerato un elenco infinito (sul quale è possibile fare cdrinfinite volte per ottenere sempre lo stesso risultato!). A meno che non si assegni Talla variabile globale *print-circle*, nel qual caso verrà stampata come #1=(1 . #1#).


L'ultima modifica! Svelto, qualcuno fa un esolang a tema Beatles: D
fede s.

1
@fedes. John McCarthy, Paul McCartney ... la lingua si chiamerà CarthyCartney.
gatto,

33

GNU Make

Esco su un arto su questo. Penso che questa potrebbe essere la prima volta che makecompare in PPCG.

factoid

Make può essere considerato un linguaggio funzionale.

Lunghezza 0 frammento

Non penso che siano richiesti frammenti di lunghezza 0, ma eccone comunque uno. Penso che questo potrebbe essere il più utile di tutti i programmi di lunghezza 0. Con un Makefile vuoto (o addirittura nessun makefile), make ha ancora un sacco di regole integrate. Ad esempio, ci sono regole predefinite integrate per compilare un file .c in un .o o binario, dato che il file .c esiste nella directory corrente. Quindi se lo facciamo:

make hello.o

make troverà la regola .c in .o e compilerà hello.c per dare hello.o

Allo stesso modo se facciamo:

make goodbye

Se nella directory corrente è presente un file goodbye.c, questo verrà compilato nel file binario di arrivederci.

Lunghezza 1 frammento

TAB

Sì, il carattere TAB. Anche se questo non fa molto da solo, ha un grande significato in Make. In particolare, tutte le righe della ricetta che seguono una definizione di destinazione in una regola DEVONO iniziare con una TAB. Ciò provoca ogni sorta di frustrazioni durante il debug di makefile quando TAB e spazi vengono confusi.

Lunghezza 2 frammento

$@

Questa è una variabile automatica da utilizzare nelle ricette. Si espanderà al nome del file del target della regola. Vi sono altre utili variabili automatiche .

Lunghezza 3 frammento

a:=

Assegnazione variabile ampliata semplicemente più breve. La variabile a viene impostata su "" immediatamente quando il Makefile viene analizzato per la prima volta. Se invece lo facciamo a=, allora l'assegnazione viene espansa in modo ricorsivo, ovvero l'espansione viene differita fino al momento in cui la variabile viene effettivamente referenziata.

Lunghezza 4 frammento

W:;w

Specifiche di regole complete marginalmente utili più brevi. Questo definisce una destinazione Wcon una regola che esegue semplicemente il wcomando shell. così

make W

è equivalente a:

w

Questa è una sintassi alternativa della regola in quanto la ricetta segue il target sulla stessa riga separata da una nuova riga. Più comunemente le righe della ricetta seguono immediatamente una riga target separata, con i TABcaratteri che iniziano ogni riga della ricetta.

Lunghezza 5 frammento

$(@D)

Un'altra variabile automatica. Simile a $@, ma questo si espande nella parte della directory del percorso, con il nome del file e trailing / rimosso.


Forse alcune funzioni di stringa come $(basename )o $(patsubst )? ( es. )
luser droog

32

Marbelous

Lunghezza frammento 14

}0}1
Mulx
HxHx

Questo frammento mostra alcune delle librerie Marbelous e introduce un nuovo concetto, vale a dire le schede multi-cella. La Mulxscheda prende due biglie come input e produce 2 biglie. I marmi che entrano nella cella più a sinistra della Mulxcorrispondono ai }0dispositivi in ​​quella scheda e nella cella più a destra a }1. Analogamente, anche le uscite usciranno da celle diverse. La larghezza di una tavola può essere calcolata in quanto le MAX(1, highest output device + 1, highest input device + 1)celle che non corrispondono a un dispositivo di input distruggeranno qualsiasi marmo che vi cade sopra.

Lunghezza 13 frammento

7E
??
>Y!!
{0

Questa è una tavola che sputerà un carattere ASCII stampabile casuale su ogni segno di spunta. Marbelous ha due modi per generare valori casuali. C'è ??che restituisce un valore casuale tra 0 e il marmo di input che riceve, compreso e ?n: rispettivamente ?0fino a ?Z. Che agiscono in modo molto simile a ??. Abbiamo anche !!che termina la scheda anche se non tutte le uscite sono piene. Riesci a capire come i ?ndispositivi potrebbero essere implementati come schede in Marbelous usando ???

Lunghezza 12 frammento

}0}1
Fb//
Dp

Qui vediamo alcune funzioni di libreria di Marbelous in azione. Fbgenera l'ennesimo numero di fibonacci dove n è il marmo di input. Dpstampa il marmo di input su STDOUT come un numero decimale. Entrambi sono implementati in Marbelous e possono essere richiamati quando si controllano le librerie di inclusione nell'interprete online , per l'interprete di Python, è necessario includere esplicitamente ogni file. L'integrazione di queste schede può essere trovata su github . Si noti che questo particolare programma richiede 2 ingressi e chiamerà la scheda Fibonacci due volte. Le bacheche chiamate vengono restituite entro un segno di spunta dalla bacheca che le ha chiamate.

Lunghezza 11 frammento

}0}0
{<{0{>

Questo ha bisogno di qualche spiegazione. I }0dispositivi sono imput, poiché hanno lo stesso numero (0), conterranno lo stesso valore quando viene chiamata questa scheda. I tre dispositivi nella riga inferiore sono output. {<uscite a sinistra della scheda, {0uscite sotto la prima cella della scheda e {>uscite a destra. L'output viene spinto solo quando tutti i dispositivi di output distinti sono pieni. In questo caso, tuttavia, il dispositivo di uscita giusto non viene mai raggiunto. La scheda uscirà a causa della mancanza di attività e produrrà comunque i due valori che ha. Riesci a immaginare come si possa implementare /\come una tavola Marbelous?

Lunghezza frammento 10

..40
FF
\\

Ci sono alcune cose che svolgono un ruolo importante in Marbelous qui. Innanzitutto c'è un'aggiunta. Se traccia il percorso dei due marmi sul tabellone, noterai che finiranno sulla stessa cella allo stesso tempo. Quando ciò accade, verranno aggiunti insieme. (fatto divertente: a un certo punto è stato considerato che invece di essere sommati, i marmi dovrebbero formare una pila) Tuttavia, Marbelous è un linguaggio a 8 bit, quindi aggiungere un marmo a FFequivale a sottrarre 1 da esso.

Lunghezza frammento 9

00
\\/\]]

Questo è il modo più breve per implementare una versione rudimentale di gatto in Marbelous. 00 \ / \ È un loop che inserisce un 00valore marmo sul ]]dispositivo ogni secondo tick. Questo è un dispositivo STDIN. Quando un marmo atterra su questo dispositivo, prova a leggere il primo personaggio di STDIN, se ce n'è uno, viene spinto verso il basso (e in questo caso stampato di nuovo). Se non ce n'è uno, l'ambra originale viene spinta verso destra. (e in questo caso cestinato)

Lunghezza 8 frammento

}0
~~
{0

Questo frammento mostra alcune funzionalità. Innanzitutto accetta input attraverso} 0. In questo caso questa è la scheda madre e questa sarà sostituita dall'input della riga di comando. È inoltre possibile chiamare questa funzione, in tal caso verrà preso l'argomento anziché l'input della riga di comando. Poi c'è ~~, che non è un bit a bit operatore. Successivamente, arriviamo a }0, Se tutti i }ndispositivi sono riempiti, questi valori vengono restituiti quando le funzioni restituiscono valori. (Marbelous supporta più di un valore di ritorno per funzione)

Lunghezza frammento 7

00
\\/\

Questo è il loop infinito più compatto che puoi creare in Marbelous. Il \\dispositivo spinge qualsiasi marmo a destra, /\copia un marmo e ne spinge una copia a sinistra e un'altra a destra. Dato che il tabellone è largo solo due celle, il marmo a destra viene spazzato via.

Lunghezza 6 frammento

46MB75

Ecco un esempio di ricorsione, MB(la scheda madre chiamata in modo implicito viene chiamata ad ogni tick, ma non prima della Stampa Fusu STDOUT ad ogni chiamata FuFuFuFuFuFu....

Lunghezza 5 frammento

2A
++

Un po 'aritmetica, il marmo con valore 2Acade sul primo segno di spunta e si trova sulla ++cella. Questo è un operatore Questo particolare operatore incrementa qualsiasi marmo che vi atterra e lo fa cadere. Il marmo ora ha valore 2Be cade dal tavolo. Questo stampa +su STDOUT.

Lunghezza 4 frammento

:
24

I due interpreti non sono d'accordo qui, ho dato un nome alla prima scheda del file in questo esempio (il nome è una stringa vuota). L'interprete python presuppone che si tratti della scheda principale e la chiama quando esegue il programma (che stampa $). L'interprete javascript non trova la scheda madre e quindi nessun punto di ingresso. Questo può essere utile quando si scrive un file di libreria per Marbelous.

Lunghezza frammento 3

:Bo

Questa è una scheda denominata, senza corpo, possiamo chiamarla scrivendo Boin una cella di qualsiasi scheda (incluso Bose stessa)

Lunghezza 2 frammento

3A

Questo codice è il corpo di una scheda 1x1 (ogni cella ha una larghezza di due caratteri), implicitamente denominata MB(per la scheda principale). Stampa il valore ascii del valore esadecimale di 3Aquando il marmo cade dal tavolo. L'output di questo programma sembra essere il codice sorgente di:

Lunghezza 1 frammento

:

Insieme a #questo, questo è uno dei due programmi a 1 personaggio validi in marbelous. #è un indicatore di un commento e quindi non molto interessante. :dice a Marbelous che stai per dichiarare un consiglio. Nessuno dei due compilatori si preoccupa di non nominare o definire la scheda. Il programma non fa nulla.

factoid:

Marbelous è stato sviluppato da persone su questo sito, alcuni nomi che erano in corsa per questa lingua erano Rube e semplicemente Marmi .


2
battimi. simpatici frammenti!
Sparr,

lo snippet di lunghezza 12 sembra prendere due input e stampare due diversi numeri di fibonacci. era intenzionale?
Sparr,

@Sparr, sì, è stato per mostrare un po 'come funzionano le funzioni in Marbelous.
overactor

forse aggiungerlo alla spiegazione? da quello che hai scritto, mi aspetto che lo snippet prenda un input e produca un numero fib.
Sparr,

Spero davvero che arriverai a 40 punti in modo che la mia funzione fibonacci si adatti ...
Sparr

31

Via

Forth ha solo due tipi, ints e float (e i float sono opzionali!) Ma riesce comunque ad avere caratteri, stringhe, long long ints, puntatori, puntatori a funzione, strutture e altro; è tutto nel modo in cui lo usi!

Lunghezza 1

.

Il .comando (o "parola" come lo chiamiamo) stampa il valore intero in cima allo stack di dati; se lo stack è vuoto, viene visualizzato un errore di runtime. Rimuove anche il valore dallo stack - upvote per vedere come possiamo mantenerlo!

Lunghezza 2

.s

La .sparola mostra i valori attualmente nello stack, senza rimuoverne nessuno. Visualizza anche il numero totale di valori. In Gforth, .sper impostazione predefinita , è limitato a mostrare solo i primi 9 valori; forse scopriremo come mostrare di più?

Lunghezza 3

see

Digitare seeseguito da qualsiasi parola Forth per vedere il codice sorgente di quella parola. La maggior parte delle parole Forth sono definite nello stesso Forth e solo alcune primitive sono definite in assembly.

Lunghezza 4

1 0=

Ho già detto che Forth è un linguaggio basato su stack con operatori postfix? La digitazione 1 0=inserisce 1lo stack e quindi esegue la 0=parola, che estrae il valore più alto dallo stack e trueinvia se è uguale a 0, in falsecaso contrario. 0=è una parola di convenienza per 0 =; ci sono diverse parole abbreviate simili per combinazioni di valori + parole comuni, come 1+e 0<>. Inoltre, mentre falsein Forth è 0 e qualsiasi valore diverso da zero è vero, le parole di test integrate ritornano trueper risultati reali e truevanno fino in fondo - è il valore con tutti i bit impostati, cioè -1!

Lunghezza 5

-1 u.

Spingere -1sulla pila, quindi estrarla e stamparla come numero intero senza segno. Questo può essere usato per vedere rapidamente il valore massimo per un int senza segno nella tua versione di Forth (ma non il valore integrale massimo che supporta nativamente!). Potresti chiederti "Come facciamo a sapere quando un int deve essere stampato con .e quando con u.?" Risposta: .quando è firmato, u.quando non firmato. "Non intendevo questo", dici. "Come facciamo a sapere quando il valore in cima allo stack è firmato e quando non è firmato?" Risposta: sei il programmatore - questo è il tuo lavoro! Devi sapere se ogni numero intero nello stack rappresenta un int, un int senza segno, un int*, achar*, un puntatore a funzione o altro, oppure hai i demoni nel tuo naso. Forth non ne terrà traccia; che cos'è questo, C?

Lunghezza 6

." Hi"

Stampe Hi. ."è una parola Forth (che, come tutte le parole Forth, deve essere seguita da spazi bianchi o EOF) che legge il flusso di input verso l'alto attraverso il successivo "e stampa tutti i byte in mezzo. Se si inserisce più di uno spazio dopo il .", ."verrà stampato tutto tranne lo spazio immediatamente successivo al . Le sequenze di escape non sono supportate (quindi non puoi stampare una stringa con a "in con ."), ma Gforth aggiunge .\"alla lingua, che le supporta.

Lunghezza 7

: + - ;

Definisci le tue parole in avanti scrivendo i due punti, il nome della parola, le parole che vuoi che la tua parola venga eseguita e un punto e virgola. Una parola può essere qualsiasi sequenza di caratteri non bianchi (lo spazio bianco è il modo in cui Forth dice dove finisce una parola e un'altra inizia, dopo tutto), persino la punteggiatura e persino gli operatori (che sono solo parole, dopo tutto). Lo snippet di cui sopra ridefinisce il +significato -, quindi ora ogni volta che provi ad aggiungere, sottrarrai invece. Tutte le parole preesistenti che utilizzano +non sono interessate, poiché memorizzano un riferimento alla definizione originale di +.

Nota: alcune parole fanno cose diverse all'interno delle definizioni di altre parole rispetto a quelle esterne, ma oltre alle strutture di controllo, sono tutte piuttosto esoteriche. La maggior parte delle parole fa la stessa cosa dentro una definizione come all'esterno, ma a volte quella cosa non è ovvia - : show-see see see ;non farà ciò che pensi!

Lunghezza 8

: 42 - ;

Quando ho detto che una parola poteva essere qualsiasi sequenza di caratteri di spazi bianchi, intendevo qualsiasi sequenza. No, Forth non ha una parola per ogni singolo numero; i numeri sono solo un po 'speciali. Quando Forth incontra una sequenza non spaziale, per prima cosa vede se è una parola conosciuta; in caso contrario, tenta di analizzarlo come numero; se fallisce, solo allora ricevi un errore. Definire una parola che è scritta allo stesso modo di un numero significa che non sarai più in grado di inserire direttamente quell'ortografia del numero senza ottenere la parola, ma Gforth e vari altri Forth ti danno comunque più modi di scrivere i numeri .

Lunghezza 9

IF 1 THEN

Finalmente qualcosa di familiare! Ovviamente, questo codice verifica se il suo argomento 1è vero e, in tal caso, esegue ciò che è dopo THEN, giusto? Sbagliato. Quando l'esecuzione raggiunge il IF, il valore in cima allo stack viene saltato fuori, e se quel valore è vero (cioè, diverso da zero), l'esecuzione continua con qualunque cosa sia dentro IF ... THENe poi qualunque sia dopo THEN; se il valore è zero, salteremo subito dopo THEN. Si noti che, a causa del modo in cui queste parole sono implementate internamente (che è in termini di altre parole Forth!), IFE THENpossono essere utilizzate solo all'interno di una definizione di parola, non in "interpretare lo stato".

Lunghezza 12

( x y -- y )

Questo è un commento Passa dal (successivo )immediatamente dopo. (Nell'interprete, una nuova riga può anche terminarlo.) Questo non è "incorporato" nella sintassi di Forth (è qualcosa?); (è solo un'altra parola, una che scarta tutto nel flusso di input fino alla successiva ). (Esatto - Forth può manipolare il modo in cui viene letto il suo codice sorgente. Perl non è l'unico linguaggio che non può essere analizzato senza eseguirlo!) Dato che è una parola, devi seguirlo con uno spazio, altrimenti Forth si lamenterà che (xnon è definito. Possiamo anche ridefinire (come parte della nostra campagna in corso di sparare a noi stessi nel piede.

Il contenuto del commento è comunque più interessante. Questo commento specifica l' effetto dello stack per qualche parola; la parte a sinistra degli --elenchi come dovrebbe essere in cima alla pila prima di eseguire la parola (la parte superiore è a destra), e il lato destro della sezione --descrive come apparirà la parte superiore della pila in seguito (di nuovo , la parte superiore è a destra). La convenzione comune è quella di aggiungere un tale commento alla fonte di qualsiasi parola definita, subito dopo il : namebit, e c'è anche una convenzione molto forte sulla denominazione degli elementi dello stack per indicare il loro tipo che è persino seguito dallo standard .

Per inciso, l'effetto pila mostrato è per la nipparola. Dovresti essere in grado di dire cosa fa solo dal commento.

Lunghezza 13

1 2 3 4 d+ d.

Come precedentemente indicato, il tipo di un valore Forth è tutto nel modo in cui lo usi: se tratti un valore come un puntatore, è un puntatore e se quel valore non è un buon puntatore, è colpa tua se lo tratti come tale. Tuttavia, indipendentemente dal tipo con cui stai trattando un valore, occuperà sempre una cella nello stack di dati; le eccezioni sono numeri interi a doppia cella o doppia precisione . Questi sono numeri interi che sono rappresentati da due valori nello stack, che consente di eseguire l'aritmetica con il doppio dei bit del solito. La cella più significativa o con bit più alto viene posizionata sopra quella meno significativa o con bit inferiore, in modo che 1 0sia la rappresentazione a doppia cella di 1, e0 1è 2 ^ 32 o 2 ^ 64, a seconda di quanto sono grandi le celle normali del tuo Forth. Naturalmente, per trattare un valore di doppia cella in quanto tale, dobbiamo usare parole che operano esplicitamente su valori di doppia cella; questi sono generalmente solo d(o udper non firmati) seguiti dal nome della parola singola cella corrispondente: d+per aggiunta, d<per confronto, d.per stampa, ecc.


+1 per Forth. Stavo iniziando a cercare lingue che non erano state ancora fatte. Felice di vederlo già qui.
mbomb007,

2
Inoltre, se mai arrivassi a +1675, ho una bella immagine ASCII da emettere. : D
mbomb007,

31

Pyth

Per ulteriori frammenti, pubblicherò soluzioni per le sfide del golf e un link al problema.

Lunghezza 17:

<ussC,cG\_GUQ*zQQ

Trova i primi ncaratteri della sequenza infinita formata ripetendo la stringa di input per sempre, quindi riempiendo i caratteri di sottolineatura con la sequenza stessa, quindi ripetendola per sempre.

Riempi gli spazi vuoti

Lunghezza 14:

#QX=Qhf>FT.:Q2

Dato un elenco di elementi univoci, ordina l'elenco scambiando coppie di elementi vicini, stampando tutti i risultati intermedi.

Riorganizzare una serie di numeri in ordine

Lunghezza 13:

?hu]+HG_UQYQY

Creare la seguente struttura: [0, [1, [2, [3]]]].

Home sulla gamma di elenchi

Lunghezza 12:

uxyG*HQjvz2Z

Moltiplicazione XOR.

Moltiplicazione XOR

Lunghezza 11:

lfqSzST.:wz

Conta quante sottostringhe della prima parola sono anagrammi della seconda parola.

Rilevamento di anagrammi all'interno di una stringa padre

Lunghezza 9:

fqJjQT_J2

Trova la base più bassa in cui l'ingresso è un palindromo.

Palindrome della base più bassa

Lunghezza 5:

!%lQ1

Controlla se l'ingresso è una potenza di 2. Prendi la base di registro 2, prendi il risultato mod 1 e prendi il logico no.

Controlla se un numero intero è una potenza di 2 senza usare +, - operazioni

Lunghezza 4:

sjQ2

Calcola il peso di martellamento dell'ingresso sommando la rappresentazione di base 2 dell'ingresso.

Contare il numero di quelli in un numero intero a 16 bit senza segno

Lunghezza 3:

^G2

^ in sequenza, int, fornisce il prodotto cartesiano del primo argomento con se stesso n volte, dove n è il secondo argomento.

In questo caso, dal momento che Gè l'alfabeto ( abcdefghijklmnopqrstuvwxyz), ^G2dà tutte le stringhe 2 lettera, aaattraverso zz.

Lunghezza 2:

lT

l, mentre normalmente serve come len(), può anche essere usato come base di registro 2. Poiché Tè la variabile inizializzata su 10, questa stampa 3.3219280948873626, registra la base 2 di 10.

Lunghezza 1:

H

Hè il dizionario vuoto (tabella hash) in Pyth, ed è l'unico modo per ottenere un dizionario in Pyth, a meno di usare v(eval) o $(Python letterale).

factoid:

Pyth non ha costrutti multi-carattere diversi dai letterali. Inoltre, Pyth compila essenzialmente uno a uno in Python.


Il tuo factoide è stato aggiunto prima di avere comandi che iniziano con .?
Leaky Nun,

@LeakyNun Sì ..
isaacg,
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.