Quining, но с файлами Windows!

9

Напишите квинну, которая при запуске создает себя в текущем каталоге, в исходном файле с именем себя. В этом случае мы будем использовать Windows, поэтому имя файла (и, следовательно, quine) должно иметь следующие ограничения:

  • Ни один из этих персонажей \ / : ? * < > |
  • Менее 211 255 символов

Ограничения и предположения

  • Ваш код должен быть полной программой (в конце концов, он будет запущен).

  • Нет копирования из исходного файла.

  • Вы можете предположить, что нет другого файла с именем Quine в качестве его имени (так как это приведет к Quine (1)).

  • Допускаются ошибки (если они не попадают в исходный код

Это , кратчайший код в байтах выигрывает!

редактировать

Может быть, я не совсем понял, файл с названием квин должен содержать квин. Виноват.

Thunda
источник
Каковы ограничения на символы не ASCII в программе? (В Windows это вполне может зависеть от того, какая языковая версия Windows установлена; я забыл точные правила и изменились ли они с течением времени.)
Почему меньше 211 байтов? Это своего рода произвольное ограничение ...
mbomb007
@ mbomb007 Максимальный размер файла, я полагаю.
Аддисон Крамп
1
@VoteToClose Это 255. stackoverflow.com/a/265782/2415524
mbomb007
@ mbomb007 Опечатка, возможно?
Аддисон Крамп

Ответы:

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)

Напечатал это на моем телефоне, должно работать, но я проверю это, когда доберусь до компьютера.

Ataco
источник
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);}
MD XF
источник
Источник здесь содержится, *поэтому он не выглядит как разрешенный в соответствии с правилами.
Value Ink
@ValueInk Исправлено. Спасибо что подметил это!
MD XF