"Обман" лайки


56

Довгий час ховається, плакат вперше. Так ось іде.

На сторінці у Вікіпедії для quine написано, що "квітка вважається" обманом ", якщо вона дивиться на власний вихідний код". Ваше завдання - зробити одну з таких «лайків обману», яка зчитує власний вихідний код.

Це , тому найкоротший код у байтах - кожною мовою - виграє. Це означає, що 5-байтний Pyt-скрипт не бив 21-байтовий сценарій Python - але 15-байтовий сценарій Python.

Для читання вихідного коду потрібно використовувати введення / виведення файлів, тому такий код JavaScript, узятий із офіційної сторінки Вікіпедії, є недійсним:

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

Він повинен отримати доступ до вихідного коду файлу на диску .

Вам не дозволяється вказувати ім'я файлу. Ви повинні змусити його визначати саме ім’я файлу.

Всім ясно? Ідіть!


1
Чи дозволені нові початкові рядки в оригінальному файлі?
isaacg

3
@isaacg IMHO Це не квин, оскільки це не вихідний код.
mınxomaτ

3
Ви повинні вказати вимогу, щоб вона визначала фактичне ім'я файлу, а не вважати твердо кодовану рядок для місця розташування джерела.
feersum

3
Я погоджуюся з @feersum, але необхідність отримання конкретного імені файлу робить цей непростий шлях тривіальним.
mınxomaτ

1
Чи можна припустити, що (для скомпільованих мов) вихідний код знаходиться в одній папці (тобто ми можемо просто додати ".cpp" або ".hs" до arg [0], щоб отримати джерело).
HEGX64

Відповіді:


60

Zsh , 4 байти

<$0

Оболонка Z має вбудовану котячу функціональність. Четвертий символ - це передача ліній.

Спробуйте в Інтернеті!

Код жодним чином не залежить від імені файлу; він працює, навіть якщо ім'я файлу містить спеціальний символ, наприклад пробіли чи нові рядки.

Тестовий запуск

$ 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

Баш, 6 байт

cat $0

В основному.


3
Він не друкує новий рядок.
Аддісон Кримп

2
catне додає новий рядок (принаймні у моїй системі).
спагето

7
@isaacg catдрукує вміст байта, що додається, на байт.
Денніс

2
@LukStorms Але чи не було б catтоді рішенням замість bashрішення? І кіт насправді не кваліфікується як мова програмування
Фабіан Шменглер

30
Чи спрацює це, якщо файл буде названий -e?
Марк Плотнік

32

Виконавчий завантажувач UNIX, 10 байт

#!/bin/cat

Якщо вам не байдуже спам на стандартній помилці, ви можете зробити його на один байт коротшим:

#!/bin/dd

7
Мені подобається це. Не впевнений, чи кваліфікується він як "мова".
Кевін

Можливо, трохи обдурили, але ти не зміг перейменувати свою папку для сміття та програму для котів, щоб скоротити шлях?
Джеймс Вебстер

3
Я не пропоную вам робити допит. Я пропоную вам міг
Джеймс Уебстер

3
@Kevin "Мова" (тобто перекладач) є cat. І я думаю, якщо ви хочете бути дуже конкретними, catпрограма просто роздруковує себе і сумісна з усіма існуючими файловими форматами :)
l0b0

1
@JamesWebster sudo install /bin/cat /c. Знаєте, про всяк випадок /binнемає у кореневій файловій системі. Маємо це catв одиночному користувачі…
Blacklight Shining

25

С, 52

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

Звичайно, це читає вихідний код, а не компільовану програму - я припускаю, що це в межах специфікації.


Ви можете використовувати printfзамість цього, putsщоб уникнути зворотного нового рядка.
feersum

@feersum так, хороший улов
Digital Trauma

19
@DigitalTrauma Це, звичайно, через ваш аватар
Пітер Олсон

3
Насправді putsїх можна використовувати, потрібно просто readменше символів.
user4098326


13

PHP, 21 байт

<?=file(__FILE__)[0];

fileчитає файл рядок у рядок в масив, а файл має лише один рядок. Це економить байт порівняно з readfile(__FILE__).


Зауважте, що це працює лише з PHP5.4 і новіших версій, що було першою версією, яка підтримувала дереференціацію масиву. Але крім цього, досить приємна відповідь!
Ісмаїл Мігель

1
readfileтакож 21: <?readfile(__FILE__);.
прим

1
Правильно, це не потрібно<?=
Фабіан Шменглер

12

Perl, 15 байт

open 0;print<0>

Збережено 3 байти завдяки @ ThisSuitIsBlackNot !


2
Ви можете зберегти 3 байти за допомогоюopen 0;print<0>
ThisSuitIsBlackNot

@ThisSuitIsBlackNot Я був впевнений, що існує коротший спосіб зробити це, але я не міг протягом життя моєї роботи це вийти ... Використовуючи 0припущення, $0то?
Дом Гастінгс

3
Так. Дивіться perldoc -f open: "В якості ярлика виклик з одною аргументацією приймає ім'я файлу з глобальної скалярної змінної з тим же ім'ям, що і файловий зв'язок: $ARTICLE = 100; open(ARTICLE) or die "Can't find article $ARTICLE: $!\n";"
ThisSuitIsBlackNot

11

Perl 6, 20 байт

print slurp $?FILE

Я не працював з Perl 6 дуже довго, тому не впевнений, чи є якісь хитрощі, щоб зробити це коротше.


2
ви можете видалити другий пробіл?
Eevee

3
@Eevee nope, це сердиться
Hotkeys

11

osascript (AppleScript з командного рядка), 40 33 32 байт

(читати шлях до мене) пункт 1

Виконання у файлі під назвою a osascript a.

Отримує перший абзац (рядок) файлу і друкує його до STDOUT з проміжним новим рядком, тому новий рядок у коді.


1
Дивіться мою
редакцію

Працюємо над тим, щоб змусити його працювати.
Аддісон Кримп

read path to meздається, працює на мене. El Cap.
Цифрова травма

Я не бачив цього, але саме так я і закінчив це робити. : P Спасибі, @DigitalTrauma. РЕДАКТУВАННЯ: слід враховувати тривалість нових рядків, тому ви додаєте новий рядок і використовуєте пункти 1.
Addison Crump

11

Python 2, 32 байти

В кінці файлу є новий рядок.

print open(__file__).readline()

Python 3, 33 байти

В кінці файлу є новий рядок.

print(open(__file__).readline())

Завдяки feersum для вирішення проблеми та постачання __file__, Loovjo за новий підхід до рішення Python 2, який врятував 17 байт, і Skyler за рішення, яке врятувало ще один байт і працювало в Python 2 і 3 (очікуючи, printщо це функція в Python 3)!

Посилання на документ для readline


Це також дозволить зберегти 2 байти в python3, оскільки ви можете відкинути endпараметр.
Skyler

@Skyler Ви абсолютно праві.
Селео

Як це працює в Python 3, для якого потрібні паролі print?
Дверна ручка

На Python 3 повинен print(open(__file__).readline())слідувати новий рядок.
Skyler

У вашому прикладі Python 3 сказано, що Python 2, а не Python 3
TheInitializer


10

Python 2.7, 30 байт

print open(__file__).read(29)

Редагувати: Для того, щоб було зрозуміло, у наведеному вище коді має бути новий рядок в кінці як 30-й байт. Я недостатньо знайомий з розміткою, щоб зрозуміти, як відобразити його в кодовому блоці.

Я використовую ту саму хитрість, що і в моєму поданні C. Це зчитує весь вихідний файл, виключаючи зворотний новий рядок для обліку додаткового нового рядка, який printбуде доданий до виводу.


Чи стикається це з тією самою проблемою, що і в новому рядку, який було зроблено іншим?
Коул

Ні. Передбачається, що в початковому коді буде тривалий новий рядок, який робить 30-й байт, але я не можу його відобразити в блоці коду. Моє подання працює, оскільки воно зчитує перші 29 байт вихідного коду, щоб новий рядок printне був стороннім.
xsot

4
Це не те, що робить кома. Він додає пробіл замість нового рядка.
xsot

2
міг би використовувати ␤, щоб позначити семантично важливий новий рядок
Eevee

9

Java, 212 196 байт (171 байт із сумнівними правилами жорсткого кодування)

Дякуємо @Cruncher за скорочення його на ~ 15 байт!

Я не сумніваюся, це може бути гольф.

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){}}}

Або іншим методом, використовуючи статичний метод (і назву класу), я отримую 171 байт. Я не впевнений, якщо це кваліфікується як жорсткий код.

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"))));}}

Використовує конструктор для отримання імені класу нестатичним методом. Використання статичного методу ( A.class.getName()) було дуже важко закодовано, тому я використав "правильний" спосіб. Використовуючи A.class.getName()цей код, скорочується до 171 байт.

Прочитані версії:

Використання конструктора та 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) {}
    }
}

Використовуючи статичний метод 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"))));
    }
}

Схопить усі байти файлу одразу і виводить його в STDOUT. Досить прямо.


Чому просто не використовувати A.class.getName()?
Фабіо Ф.

3
Це CodeGolf не CodeReview! ;)
Фабіо Ф.

1
@FabioF. Так, але я думаю, що танцює в рядку того, що це жорстке кодування імені файлів, що суперечить правилам. Сенс у тому, що якщо ви зміните ім'я файлу, вам доведеться змінити ім'я класу (очевидно), але також змінити цей рядок, який схожий на жорстке кодування файлу.
Cruncher

1
Ви не можете зателефонувати в оператор друку для друку і вберегти себе від встановлення статичної змінної?
Cruncher

1
@Cruncher Nah. Ви отримаєте java.io, я буду дотримуватися java.nio - справа не в тому, щоб виграти, а показати способи зробити це надзвичайно стисло за допомогою різних методів.
Аддісон Кримп

8

AutoIt, 34 байти

Виводить себе в буфер обміну:

ClipPut(FileRead(@ScriptFullPath))


7

Ідіть, 111 105 байт

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

Мій перший кодовий гольф у Go - я думаю, що ви можете скористатись трьома трюками.


У Go вже є відповідь - чи використовується цей же метод?
Аддісон Кримп

@VoteToClose: Я усвідомлюю, що мене надихнуло інше, але тут я використовував перейменування пакунків (дешевий трюк), а також різну техніку відкриття та передачі файлів у stdout. Врятувало мене масовим 22
байтом

Метод насправді трохи інший, хороший!
Фабіан Шменглер

7

PowerShell, 39 36 31 25 байт

Приблизно стільки, наскільки я можу це зрозуміти:

gc $MyInvocation.MyCommand.Path | oh

Підкріплений популярним попитом, це було змінено на:

gc $PSCommandPath|echo -n

друкує на стандартний вихідний сигнал оболонки хоста .


gc $MyInvocation.MyCommand.Pathдостатньо. Це автоматично роздрукує його.
Андрій

це не гарантується особливо, якщо сценарій працює безшумно
Чад Бакстер

Ха-ха, мені все одно. Я збирався дописувати, якщо ніхто більше не мав відповіді PowerShell. Але я забув, що gcце псевдонім і збирався просто використовувати cat, тож ви все одно байтавали мене.
Андрій

А, я б не був таким суворим щодо цього. В іншому випадку кожна відповідь PS повинна явно передати на оболонку хоста, але це залежить від вас ...
Ендрю

Ви можете замість цього використовувати gc $PSCommandPath17 байт. Я бачу проблему в тому, що це випльовує новий рядок (якого немає в джерелі). Зараз це неоднозначно, якщо введення нового рядка нормально чи ні ... залежно від того, як це правила, нам може знадобитися зробити щось хитро, як, наприклад, gc $PSCommandPath|write-host -n31 байт.
AdmBorkBork


5

C, 49 байт

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

Редагувати: Для уточнення, 49-й байт - це новий рядок.

Це зчитує вихідний код мінус новий рядок в кінці, щоб врахувати новий рядок, який putsбуде доданий до кінця виводу.


Цей код двічі викликає невизначене поведінку.
Джошуа

5
Ну, це кодовий гольф. Мій код видає потрібний вихід, тому це дійсне подання.
xsot

1
@xsot У цьому випадку вам, мабуть, слід перерахувати версію компілятора + параметри; інакше це може бути неможливо перевірити.
Джастін

1
Якщо невизначена поведінка дозволена до тих пір, поки ви можете мати якийсь компілятор, який виробляє бажаний висновок на якійсь машині протягом деякої фази місяця, я пропоную int main (void) {* 0; } як рішення. Зрештою, стандарт дозволить реалізувати, що компілює це в програму, яка вирішує проблему. Я б добре використовував поведінку, що залежить від реалізації, доки ви не вкажете компілятор, але з невизначеною поведінкою ви навіть не можете гарантувати, що ви не отримаєте десять різних відповідей, якби ви побігли це десять разів поспіль на та ж машина.
Рей

1
@MDXF Я серйозно не пропонував написати це рішення. Я сперечався проти дозволеного невизначеного поведінки. int main() {*0;} може працювати навіть на існуючих компіляторах, оскільки містить невизначене поведінку. Аналогічно, рішення xsot може працювати на існуючих компіляторах, оскільки містить не визначене поведінку. Жоден із них не гарантовано вирішить проблему. (Хоча, правда, у xsot's це швидше , це може так само легко вийти з ладу ). Мій власний аргумент полягає в тому, що ми повинні дозволити рішення, які залежать від поведінки, що залежить від впровадження, або не визначено, але не визначено.
Рей


4

Pyth, 25 байт

$import sys$h'e$sys.argv

Це читає його ім'я файлу. По суті, він шукає argv, відкриває файл, що відповідає його останньому аргументу, і друкує його перший рядок.


Ви не можете просто зробити h'$__file__$?
kirbyfan64sos

@ kirbyfan64sos Це дає мені помилку NameError: name '__file__' is not defined. Pyth компілюється в Python, а потім виконується результуюча рядок. Тому я не очікував, що це спрацює.
isaacg

4

Ідіть, 133 байт

Всім ясно? Ідіть!

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

2
Це надихнуло мене написати власне (і найперше) рішення з кодом-гольфу в Go. Шукаючи деякі загальні хитрощі, ви можете легко спуститися до 123 символів, застосувавши, наприклад, однобуквені імена для пакетів r"runtime".
tomasz

4

> <> , 13 байт

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

Випробовували як онлайн, так і офлайн перекладачі. gКоманда ближче до можливості читання з вихідного файлу , і якщо це не вважається для цілей цього завдання я буду відзначати свій запис , не конкуруємо; Я вважаю, що це нормально вважається "обманом" лайків.

Спробуйте в Інтернеті.


4

Хаскелл, 63 байти

Для науки!

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

Працює лише з runhaskellкомандою. Дуже круто, хоча
HEGX64

4

> <> , 31 байт

Відмова: у файлі вводу </ I> немає файлу, але я вважав, що було б цікаво продемонструвати його вхідно-вихідний простір коду, успадкований від Befunge, однієї з мов, що надихнула> <>.

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

Квінт, що читає самостійно, я створив деякий час тому, ви можете спробувати тут .

Я щойно побачив, що існує коротша> <> квітка для самостійного читання . Хоча в стандартах коду-гольфу це явно краще, я хотів би зазначити, що він має жорстку кодову довжину, тоді як мій копіює додаткові рядки або стовпці коду (до тих пір, поки вони не порушують вихідний код).


Я думав надсилати повідомлення в <<>, але думав, що <<> буде неможливо через правило: "Ви повинні використовувати введення / виведення файлів для читання вихідного коду"
Sp3000

@ Sp3000 справді виглядає так, схоже, що я недостатньо добре прочитав виклик. Додам відмову
Аарон

3

F #, 54 байт

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

Використання:

fsi --exec a.fsx

3

Perl 5, 15 13 байт

Заслуга рішення Bash за натхнення на це:

print`cat $0`

РЕДАКТУВАННЯ: Вам не потрібно напівкрапки або першого пробілу.


Не чистий перл, він потребує деяких інших виконуваних файлів, а саме cat, присутніх та змінних у $PATH. Але якщо він присутній, його можна вважати просто доступною командою perl, так чому б ні.
Голар Рамблар

3

Node.js, 66 63 байт

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

Не використовується console.log, що додає новий рядок.


1
Ви можете зберегти кілька байтів за допомогою синхронної програми:p=process;p.stdout.write(require('fs').readFileSync(p.argv[1]))
TehShrike

1
Чому б не console.log(require('fs').readFileSync(process.argv[1]))\nза 57 байт?
Conor O'Brien

Це не завжди працює. Скажіть, що файл названий test.js. Допустимо викликати його, запустивши node test, що призведе до помилки.
Патрік Робертс



3

HTML з JavaScript, 115 байт (насправді не рахується)

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

Чи враховується це? Я не проти, це було весело :)

Технічно він не відкриває файл. Це також добре сформований документ HTML5. XMLSerializer був єдиним інструментом, який також повертав частину DOCTYPE, але є нестандартним. І все-таки він працює на chrome та firefox, і я ставлю ставку на інші браузери.

І як бонус:

JavaScript, 41 байт

alert(document.currentScript.textContent)

Видалити ";" наприкінці, збережіть 1 байт :)
Евгеній Новиков

1
@ ЕвгенийНовиков Ти маєш рацію, не знаєш, чому я тоді залишив це. Здається, я не порахував, хоча.
Доміно
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.