Una quinta "barare"


56

Lurker di lunga data, poster per la prima volta. Quindi ecco qui.

Nella pagina di Wikipedia per quine , si dice che "un quine è considerato un 'imbroglione' se osserva il proprio codice sorgente". Il tuo compito è creare una di queste "cheat quines" che legge il suo codice sorgente.

Questo è , quindi vince il codice più breve in byte - in ogni lingua . Ciò significa che uno script Python a 5 byte non batterebbe uno script Python a 21 byte, ma uno script Python a 15 byte.

È necessario utilizzare l'I / O dei file per leggere il codice sorgente, quindi il seguente codice JavaScript, preso dalla pagina Wikipedia ufficiale, non è valido:

function a() {
    document.write(a, "a()");
}
a()

Deve accedere al codice sorgente del file sul disco .

Non è consentito specificare il nome del file. Devi fare in modo che rilevi il nome del file stesso.

Tutti chiari? Partire!


1
Sono consentite nuove righe finali non presenti nel file originale?
isaacg,

3
@isaacg IMHO Questo non è un quine, dal momento che non è il codice sorgente.
mınxomaτ,

3
È necessario dichiarare che è necessario determinare il nome file effettivo anziché assumere una stringa codificata per la posizione di origine.
feersum

3
Sono d'accordo con @feersum, tuttavia, che richiedere un nome file specifico rende questa sfida banale.
mınxomaτ,

1
Possiamo supporre che (per le lingue compilate) il codice sorgente sia nella stessa cartella (cioè possiamo semplicemente aggiungere ".cpp" o ".hs" a arg [0] per ottenere il sorgente).
HEGX64,

Risposte:


60

Zsh , 4 byte

<$0

La shell Z ha funzionalità feline integrate. Il quarto personaggio è un avanzamento di riga.

Provalo online!

Il codice non dipende in alcun modo dal nome del file; funziona anche se il nome del file contiene caratteri speciali, come spazi o righe.

Prova

$ cat "my quine.sh"
<$0
$ zsh "my quine.sh" 
<$0
$ diff -s <(zsh "my quine.sh") <(cat "my quine.sh")
Files /dev/fd/63 and /dev/fd/62 are identical

28
feline functionalities:)
theB

48

Bash, 6 byte

cat $0

Fondamentalmente.


3
Non stampa una riga.
Addison Crump,

2
catnon aggiunge una nuova riga (almeno sul mio sistema).
uno spaghetto il

7
@isaacg catstampa il contenuto del byte di file fornito per byte.
Dennis,

2
@LukStorms Ma questa non sarebbe una catsoluzione, anziché una bashsoluzione? E il gatto non si qualifica davvero come linguaggio di programmazione
Fabian Schmengler,

30
Funzionerà se il file è nominato -e?
Mark Plotnick,

32

Caricatore eseguibile UNIX, 10 byte

#!/bin/cat

Se non ti interessa lo spam in caso di errore standard, puoi ridurlo di un byte:

#!/bin/dd

7
Mi piace questo. Non sono sicuro se si qualifica come "lingua", però.
Kevin,

Forse imbrogliare un po ', ma non è possibile rinominare la cartella bin e il programma cat per abbreviare il percorso?
James Webster,

3
Non sto suggerendo di farlo a proposito. Sto suggerendo che potresti
James Webster il

3
@Kevin Il "linguaggio" (cioè interprete) è cat. E immagino che se vuoi essere molto specifico, un catprogramma stampa semplicemente se stesso ed è compatibile con ogni formato di file esistente :)
l0b0

1
@JamesWebster sudo install /bin/cat /c. Sai, per ogni evenienza /binnon si trova sul filesystem di root. Devo averlo catin single-user ...
Blacklight Shining

25

C, 52

s[99];main(){read(open(__FILE__,0),s,99);printf(s);}

Naturalmente, questo legge il codice sorgente e non il programma compilato - suppongo che sia all'interno delle specifiche.


È possibile utilizzare printfinvece di putsevitare una nuova riga finale.
feersum

@feersum sì, buona cattura
Digital Trauma,

19
@DigitalTrauma È a causa del tuo avatar, ovviamente
Peter Olson,

3
In realtà, putspuò essere utilizzato, hai solo bisogno di un readminor numero di caratteri.
user4098326


13

PHP, 21 byte

<?=file(__FILE__)[0];

filelegge un file riga per riga in un array e il file ha solo una riga. Ciò consente di risparmiare un byte rispetto a readfile(__FILE__).


Si noti che funziona solo da PHP5.4 in poi, che è stata la prima versione a supportare la de-referenziazione dell'array. Ma a parte questo, una bella risposta!
Ismael Miguel,

1
readfileè anche 21: <?readfile(__FILE__);.
primo

1
Bene, non è necessario<?=
Fabian Schmengler,

12

Perl, 15 byte

open 0;print<0>

Salvato 3 byte grazie a @ ThisSuitIsBlackNot !


2
È possibile salvare 3 byte conopen 0;print<0>
ThisSuitIsBlackNon

@ThisSuitIsBlackNot Ero sicuro che ci fosse un modo più breve per farlo, ma non potevo per la vita del mio lavoro farlo ... Usando 0assume $0allora?
Dom Hastings,

3
Sì. Vedi perldoc -f open: "Come scorciatoia una chiamata a un argomento prende il nome del file dalla variabile scalare globale con lo stesso nome del filehandle: $ARTICLE = 100; open(ARTICLE) or die "Can't find article $ARTICLE: $!\n";"
ThisSuitIsBlackNon


11

osascript (AppleScript dalla riga di comando), 40 33 32 byte

(leggi il percorso per me) il paragrafo 1

Esecuzione su un file chiamato a con osascript a.

Ottiene il primo paragrafo (riga) del file e lo stampa su STDOUT con una nuova riga finale, quindi la nuova riga nel codice.


1
Vedi la mia modifica
all'OP

Lavorando per farlo funzionare.
Addison Crump,

read path to meSembra funzionare per me. El Cap.
Trauma digitale,

Non l'ho visto, ma è così che ho finito per farlo. : P Grazie, @DigitalTrauma. EDIT: le nuove righe finali devono essere considerate, quindi aggiungi la nuova riga e usa i paragrafi 1.
Addison Crump

11

Python 2, 32 byte

C'è una nuova riga alla fine del file.

print open(__file__).readline()

Python 3, 33 byte

C'è una nuova riga alla fine del file.

print(open(__file__).readline())

Grazie a feersum per la risoluzione di un problema e la fornitura __file__, Loovjo per un nuovo approccio alla soluzione Python 2 che ha salvato 17 byte e Skyler per una soluzione che ha salvato ancora un altro byte e funzionava sia in Python 2 che 3 (in attesa di printessere una funzione in Python 3)!

Doc link per readline


Ciò risparmierebbe anche 2 byte in python3 perché potresti scartare il endparametro.
Skyler,

@Skyler Hai assolutamente ragione.
Celeo,

Come funziona in Python 3, che necessita di parentesi print?
Maniglia della porta

Python 3 dovrebbe essere print(open(__file__).readline())seguito da una nuova riga.
Skyler,

Il tuo esempio di Python 3 dice Python 2 piuttosto che Python 3
TheInitializer


10

Python 2.7, 30 byte

print open(__file__).read(29)

Modifica: Giusto per essere chiari, il codice sopra dovrebbe avere una nuova riga alla fine come 30 ° byte. Non conosco abbastanza il markdown per capire come visualizzarlo nel blocco di codice.

Sto usando lo stesso trucco qui come quello nella mia presentazione C. In questo modo viene letto l'intero file di origine esclusa la nuova riga finale per tenere conto della nuova riga aggiuntiva che printverrà aggiunta all'output.


Questo incontra lo stesso problema con la nuova riga finale che ha fatto l'altro invio?
Cole

No. Dovrebbe esserci una nuova riga finale che crea il 30 ° byte nel codice sorgente ma non riesco a visualizzarlo nel blocco di codice. La mia presentazione funziona perché legge i primi 29 byte del codice sorgente in modo che la nuova riga da printnon sia estranea.
xsot,

4
Non è quello che fa la virgola. Aggiunge uno spazio anziché una nuova riga.
xsot

2
potrebbe usare ␤ per indicare una newline semanticamente importante
Eevee

9

Java, 212 196 byte (171 byte con regole di codifica rigida discutibili)

Grazie a @Cruncher per accorciarlo di ~ 15 byte!

Non ho dubbi che si possa giocare a golf.

import java.nio.file.*;class A{public static void main(String[]a){new A();}A(){try{System.out.print(new String(Files.readAllBytes(Paths.get(getClass().getName()+".java"))));}catch(Exception e){}}}

Oppure, un altro metodo, usando il metodo statico (e il nome della classe), ottengo 171 byte. Non sono sicuro se questo si qualifica come hard-coded, però.

import java.nio.file.*;class A{public static void main(String[]a)throws Exception{System.out.print(new String(Files.readAllBytes(Paths.get(A.class.getName()+".java"))));}}

Utilizza un costruttore per ottenere il nome della classe con un metodo non statico. L'uso di un metodo statico ( A.class.getName()) è stato davvero codificato, quindi ho usato il modo "corretto". Utilizzando A.class.getName(), questo codice si accorcia fino a 171 byte.

Versioni leggibili:

Utilizzando il costruttore e this.getClass():

import java.nio.file.*;
class A{
    public static void main(String[]a) {
        new A();
    }
    A(){
        try{
            System.out.print(
                new String(
                Files.readAllBytes(
                Paths.get(
                getClass().getName()+".java"))));
        }
        catch(Exception e) {}
    }
}

Utilizzando il metodo statico A.class.getName():

import java.nio.file.*;
class A {
    public static void main(String[] a) throws Exception {
        System.out.print(
             new String(
                  Files.readAllBytes(
                       Paths.get(
                            A.class.getName()+".java"))));
    }
}

Cattura tutti i byte del file contemporaneamente e lo invia a STDOUT. Abbastanza diretto.


Perché semplicemente non usarlo A.class.getName()?
Fabio F.

3
Non è CodeGolf, non CodeReview! ;)
Fabio F.

1
@FabioF. Sì, ma penso che balli sulla linea di essere un nome di file hardcoded, che è contro le regole. Il punto è che se cambi il nome del file, devi cambiare il nome della classe (ovviamente), ma anche cambiare questa linea, che è come un nome di file hardcoded.
Cruncher,

1
Non puoi chiamare l'istruzione print all'interno del costruttore e salvarti dall'impostazione di una variabile statica?
Cruncher,

1
@Cruncher Nah. Ottieni java.io, mi limiterò a java.nio - il punto non è vincere, ma mostrare modi per farlo in modo estremamente conciso con metodi diversi.
Addison Crump,

8

AutoIt, 34 byte

Si genera negli Appunti:

ClipPut(FileRead(@ScriptFullPath))


7

Vai, 111 105 byte

package main
import("io"
."os"
."runtime")
func main(){_,p,_,_:=Caller(0)
f,_:=Open(p)
io.Copy(Stdout,f)}

Il mio primo codice-golf in Go - solo alcuni trucchi che puoi usare qui immagino.


Esiste già una risposta in Go: utilizza lo stesso metodo?
Addison Crump,

@VoteToClose: me ne rendo conto, in effetti mi sono ispirato all'altro, ma ho usato qui la ridenominazione dei pacchetti (trucco economico) e una tecnica diversa per aprire e reindirizzare il file su stdout. Mi ha salvato un enorme 22 byte ;-)
tomasz

Il metodo è in realtà un po 'diverso, buono!
Fabian Schmengler,

7

PowerShell, 39 36 31 25 byte

Circa il più stretto possibile:

gc $MyInvocation.MyCommand.Path | oh

Sostenuto dalla domanda popolare, questo è stato modificato in:

gc $PSCommandPath|echo -n

stampa per ospitare l'output standard corrente della shell .


gc $MyInvocation.MyCommand.Pathè abbastanza. Lo stamperà automaticamente.
Andrew,

non è garantito soprattutto se lo script funziona in silenzio
Chad Baxter il

Ah ah sì, non mi interessa. Avrei pubblicato se nessun altro avesse avuto una risposta in PowerShell. Ma ho dimenticato che gcera un alias e che stavo per usare cat, quindi avevi comunque un byte su di me.
Andrew,

Uh, non sarei così severo al riguardo. Altrimenti ogni risposta PS dovrebbe esplicitamente eseguire il pipe alla shell host, ma dipende da te ...
Andrew

È possibile invece utilizzare gc $PSCommandPathper 17 byte. Il problema che vedo è che questo sputa una nuova riga (che non esiste nella fonte). È ambiguo ora che il trailing newline sia OK o meno ... a seconda di come queste regole, potremmo aver bisogno di fare qualcosa di complicato come gc $PSCommandPath|write-host -nper 31 byte.
AdmBorkBork,


5

C, 49 byte

s[];main(){read(open(__FILE__,0),s,48);puts(s);}

Modifica: per chiarire, il 49 ° byte è una nuova riga.

Questo legge il codice sorgente meno la nuova riga alla fine per tenere conto della nuova riga che putsverrà aggiunta alla fine dell'output.


Questo codice richiama due volte un comportamento indefinito.
Giosuè,

5
Bene, questo è il golf del codice. Il mio codice produce l'output desiderato, quindi è un invio valido.
xsot,

1
@xsot In tal caso, probabilmente dovresti elencare la versione + opzioni del compilatore; altrimenti questo potrebbe non essere verificabile.
Giustino,

1
Se è consentito avere un comportamento indefinito fintanto che è possibile avere un compilatore che produce l'output desiderato su qualche macchina durante una fase lunare, allora propongo int main (void) {* 0; } come soluzione. Dopotutto, lo standard consentirebbe un'implementazione che lo compila in un programma che risolve il problema. Starei bene con l'uso del comportamento dipendente dall'implementazione fintanto che specifichi il compilatore, ma con un comportamento indefinito, non puoi nemmeno garantire che non otterrai dieci risposte diverse se lo eseguissi dieci volte di seguito sul stessa macchina.
Ray,

1
@MDXF Non stavo seriamente suggerendo di scrivere quella soluzione. Stavo litigando per consentire un comportamento indefinito. int main() {*0;} potrebbe funzionare anche su compilatori esistenti, poiché contiene un comportamento indefinito. Allo stesso modo, la soluzione di xsot potrebbe funzionare su compilatori esistenti, poiché contiene un comportamento indefinito. Nessuno dei due è garantito per risolvere il problema. (Anche se xsot's è certamente più probabile che lo faccia, potrebbe facilmente bloccarsi). La mia vera argomentazione è che dovremmo consentire soluzioni che dipendono da comportamenti dipendenti dall'implementazione o non specificati, ma non da comportamenti indefiniti.
Ray,


4

Pyth, 25 byte

$import sys$h'e$sys.argv

Questo legge il nome del suo file. In sostanza, cerca argv, apre il file corrispondente al suo ultimo argomento e stampa la sua prima riga.


Non puoi farlo h'$__file__$?
kirbyfan64sos,

@ kirbyfan64sos Questo mi dà l'errore NameError: name '__file__' is not defined. Pyth viene compilato in Python, quindi viene eseguita la stringa risultante. Quindi non mi aspetto che funzioni.
isaacg,

4

Vai, 133 byte

Tutti chiari? Partire!

package main
import("fmt"
"io/ioutil"
"runtime")
func main(){_,f,_,_:=runtime.Caller(0)
s,_:=ioutil.ReadFile(f)
fmt.Print(string(s))}

2
Questo mi ha ispirato a scrivere la mia (e la prima) soluzione di code-golf su Go. Alla ricerca di alcuni trucchi generali, puoi facilmente scendere a 123 caratteri qui applicando nomi a lettera singola per i pacchetti, ad esempio r"runtime".
Tomasz,

4

> <> , 13 byte

0:0go:c=?;1+!

Testato su interpreti online e offline. Il gcomando è il più vicino a poter leggere dal file sorgente e se non conta ai fini di questa sfida, segnerò la mia iscrizione come non competitiva; Credo che normalmente considerato "barare" per i quines.

Provalo online.


4

Haskell, 63 byte

Per la scienza!

import System.Environment
main=getProgName>>=readFile>>=putStr

Funziona solo con il runhaskellcomando. Molto bello però
HEGX64

4

> <> , 31 byte

Disclaimer: non vi è alcun I / O di file in> <>, tuttavia ho pensato che sarebbe stato interessante mostrare il suo I / O dello spazio dei codici ereditato da Befunge, uno dei linguaggi che ha ispirato> <>.

00voa0+1;!?$~<
1+> :r:@g: ?!^o$

Un Quine a lettura automatica che ho realizzato qualche tempo fa, puoi provarlo qui .

Ho appena visto che c'è un quine più breve> <> auto-lettura . Mentre è chiaramente migliore negli standard di code-golf, vorrei sottolineare che ha una lunghezza del codice hardcoded, mentre il mio copia le righe aggiuntive o le colonne di codice (purché non infrangano il codice originale).


Stavo pensando di pubblicare in> <>, ma ho pensato che> <> sarebbe stato impossibile a causa della regola: "Devi usare l'I / O dei file per leggere il codice sorgente"
Sp3000,

@ Sp3000 anzi, sembra che non abbia letto abbastanza bene la sfida. Aggiungerò una dichiarazione di non responsabilità
Aaron,

3

F #, 54 byte

printf"%s"(System.IO.File.ReadAllText __SOURCE_FILE__)

Uso:

fsi --exec a.fsx

3

Perl 5, 15 13 byte

Ringraziamo la soluzione Bash per aver ispirato questo:

print`cat $0`

EDIT: non è necessario il punto e virgola o il primo spazio.


Non puro perl, ha bisogno di qualche altro eseguibile, vale a dire cat, presente e reperibile nel $PATH. Ma se è presente, può essere assunto solo come un comando disponibile perl, quindi perché no.
Golar Ramblar,

3

Node.js, 66 63 byte

p=process;p.stdout.write(require('fs').readFileSync(p.argv[1]))

Non utilizza console.log, che aggiunge una nuova riga.


1
È possibile salvare alcuni byte utilizzando l'API sincrono: p=process;p.stdout.write(require('fs').readFileSync(p.argv[1]))
TehShrike

1
Perché non console.log(require('fs').readFileSync(process.argv[1]))\nper 57 byte?
Conor O'Brien,

Questo non funziona sempre. Supponiamo che il file sia denominato test.js. È valido invocarlo eseguendolo node test, il che causerà un errore.
Patrick Roberts,

3

C, 31 byte

main(){system("cat "__FILE__);}

La soluzione bash è così corta, quindi perché non basare una soluzione C su di essa?


3

Haskell , 49 byte

{-#LANGUAGE CPP#-}main=putStr=<<readFile __FILE__

Provalo online!

(GHC) Haskell ha un'estensione per usare il preprocessore C (comunemente usato per la portabilità tra versioni e architetture.) Si spera si spieghi da sé.


3

HTML con JavaScript, 115 byte (non conta davvero)

<!DOCTYPE html><html><title>x</title><script>alert(new XMLSerializer().serializeToString(document))</script></html>

Questo conta? Non mi dispiace, è stato divertente :)

Tecnicamente non apre un file. È anche un documento HTML5 ben formato. XMLSerializer è stato l'unico strumento che ha restituito anche la parte DOCTYPE, ma non è standard. Tuttavia, funziona su Chrome e Firefox e scommetto altri browser.

E come bonus:

JavaScript, 41 byte

alert(document.currentScript.textContent)

Rimuovi ";" alla fine, salva 1 byte :)
Евгений Новиков

1
@ ЕвгенийНовиков Hai ragione, non so perché l'ho lasciato allora. Sembra che non lo abbia contato però.
Domino,
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.