Quining, але з файлами Windows!


9

Напишіть quine, яка під час запуску створює себе у поточному каталозі у вихідному файлі, який назвав себе. У цьому ми будемо використовувати Windows, тому ім'я файлу (а отже, і quine) повинно мати такі обмеження:

  • Жоден із цих символів \ / : ? * < > |
  • Менше 211 255 символів

Обмеження та припущення

  • Ваш код повинен бути повноцінною програмою (він буде запущений зрештою).

  • Немає копіювання з вихідного файлу.

  • Ви можете припустити, що не існує ще одного файлу з вашим ім'ям Quine (так як це створило б Quine (1)).

  • Помилки дозволені (до тих пір, поки вони не потрапляють у вихідний код

Це є , найкоротший код в байтах виграє!

Редагувати

Можливо, мені не було зрозуміло, що файл з назвою quine повинен насправді містити quine. Моє ліжко.


Які обмеження щодо символів, що не належать до ASCII, у програмі? (У Windows це може цілком залежати від того, на якій мовній версії Windows встановлена; я забуваю точні правила та чи змінювалися вони з часом.)

Чому менше 211 байт? Це якесь довільне обмеження ...
mbomb007

@ mbomb007 Максимальний розмір імені файлу, я вважаю.
Аддісон Кримп

1
@VoteToClose Це 255. stackoverflow.com/a/265782/2415524
mbomb007

@ mbomb007 Typo, можливо?
Аддісон Кримп

Відповіді:


6

Віци, 10 27 байт

'rddd++&"rdd8++a[v}v1-D);].

Якщо це :було дозволено, я міг би скоротити це до 11 байт. :(

Пояснення:

'rddd++&"rdd8++a[v}v1-D);].
'                           Capture all instructions as a string until encountering
                              ' again, looping if necessary.
 r                          Reverse the current stack (output is top-down).
  ddd++                     Push char literal ' to the stack.
       &                    Push a new stack to the stack stack.
        "                   Same as ', but " specific.
         r                  Reverse the current stack.
          dd8++             Push char literal " to the stack.
               a            Push 10 to the stack.
                [        ]  Loop forever.
                 v          Capture the top value as a variable.
                  }         Take the bottom item of the stack and put it on the top.
                   v        Dump the variable to the stack.
                    1-      Subtract 1.
                      D     Duplicate the top item.
                       );   Pop n; if n is 0, exit the loop.
               a[v v1-D);]  This is a makeshift for loop with 10 iterations.
                          . Pop the top stack as n, and the second stack as o. 
                              Write a file called "n" with the contents of "o".

Дві стеки будуть в кінці однакові. У деяких версіях Java це може викликати FileNotFoundExceptionрізні реалізації FileInputStreamкласу.

Попередня відповідь перед редагуванням:

&'rddd++}.

Пояснення:

&           Push a new stack to the stack stack.
 'rddd++    Modified standard quine.
        }   Move the ' to the right place.
         .  Pop the top stack as n, and the second stack as o. Write a file called
                 "n" with the contents of "o". (Quine name, no content)

Оскільки я міг би також навести ось схему кроків, що відбуваються в стеках (кожен стек представлений символом []):

Initial state: [[]]

&              [[], []]
                  Push a new stack to the stack stack.

 '             [[], ["r", "d", "d", "d", "+", "+", "}", ".", "&"]]
                  This stack state occurs because ' will loop around the line
                    until finding the next '.

  r            [[], ["&", ".", "}", "+", "+", "d", "d", "d", "r"]]
                  Reverses the top (last) stack.

   ddd         [[], ["&", ".", "}", "+", "+", "d", "d", "d", "r", 13, 13, 13]
                  Push thirteen thrice.

      ++       [[], ["&", ".", "}", "+", "+", "d", "d", "d", "r", "'"]
                  Because char ' is 39 = 13 + 13 + 13.

        }      [[], [".", "}", "+", "+", "d", "d", "d", "r", "'", "&"]]
                  Takes the bottom item, then puts it on the top.

         .     []
                  Writes a file with content from the second-to-top stack and the
                    name as the concatenation of all elements in the top stack,
                    with top member priority (backwards from my representation).

Я насправді не впевнений, як це працює правильно; хвилинні зміни призводять до цього порушення. Наприклад, розміщення &в різних інших місцях повинно працювати так само добре, але це спричиняє ClassCastExceptions, IOExceptions і ArrayOutOfBoundsExceptions залежно від того, де ви його помістили. Мені може знадобитися зробити виправлення помилок.


1
+1 заPush a new stack to the stack stack.
Павло

1
+1 від мене, якщо ви можете натиснути новий стек на стек стека стека, інакше забудьте це! ... Жартую +1, я теж сміявся.
Чарівний восьминога Урна

2
@carusocomputing Що робити, якщо я сказав вам, що я можу o? ;)
Аддісон Кримп

Зітхніть розпакуйте ...
Чарівний восьминіг Урна

1
Гм ... Я думаю, що генерований файл повинен містити код (тобто його вміст повинен дорівнювати назви файлу)
Лев

5

Node.js, 56 52 байти

function f(){require('fs').writeFile(f+='f()',f)}f()

Це друкує попередження

DeprecationWarning: виклик асинхронної функції без зворотного дзвінка застарілий.

Якщо ви хочете, щоб все-зелений, він коштує 4 байта на зміну writeFileв writeFileSync.


2

Луа, 96 байт.

s="s=%qs=string.format(s,s)f=io.open(s)f.write(f,s)"s=string.format(s,s)f=io.open(s)f.write(f,s)

Набрав це на своєму телефоні, повинен працювати, але я перевірю його, коли доберуся до комп’ютера.


12
Думаю, щонайменше вам потрібно буде змінитись sting.formatу string.formatдва рази.
Пітер Тейлор

@PeterTaylor вам не подобається Стінг, чи не так?
KeyWeeUsr

5
@KeyWeeUsr, я нічого проти нього особисто не маю, і насправді він допоміг оплатити моє виховання, але я думаю, що стандартна бібліотека Lua, ймовірно, була розроблена для загальної зручності використання людьми, знайомими з подібними API, а не спеціально для фанатів поліції.
Пітер Тейлор

1

C, 134 байти

s[255];fd;char p[255]="s[255];fd;char p[255]=%c%s%c;main(){sprintf(s,p,34,p,34);creat(s,0);}";main(){sprintf(s,p,34,p,34);creat(s,0);}

Джерело тут містить, *щоб воно не виглядало так, як це дозволено згідно з правилами.
Значення чорнила

Виправлено @ValueInk. Дякуємо, що вказали на це!
MD XF
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.