Гольф тебе анаграмма на отлично!


12

Задание

В этой задаче ваша задача - написать некоторый код, который выводит одну из анаграмм, выбранных случайным образом, с равномерным распределением, но он никогда не должен выводить сам.


разработка

При отсутствии ввода ваша программа должна вывести любую из анаграмм своего исходного кода. Ваша программа никогда не должна выводить свой собственный источник как есть, то есть она никогда не должна быть квинной.


вход

Ваша программа не должна принимать никаких данных. Однако, если ваш язык требует ввода как необходимости, вы можете предположить, что он будет представлен строчными буквами a. Вы не должны использовать вход каким-либо образом.


Выход

Ваша программа может выводить любым способом, кроме записи в переменную. Запись в файл, консоль, экран и т. Д. Разрешена. Функция также returnразрешена.


Дополнительные правила

  • Исходный код вашей программы должен содержать не менее 3 символов (не 3 байта).

  • Исходный код вашей программы должен содержать как минимум 3 возможных анаграммы (исключая саму себя). Например, aabне считается действительным представлением, поскольку aabимеет только две анаграммы, отличные от aab( baaи aba).

  • Ваша программа не должна выдавать никаких ошибок.

  • Ваша программа должна выводить свои анаграммы точно .

  • Применяются стандартные правила лазеек и стандартные правила .


пример

Предположим, исходный код вашей программы abc. Он должен случайным образом вывести любое из следующего (с равномерным распределением):

  1. acb
  2. bca
  3. bac
  4. cba
  5. cab

И это никогда не должно выводиться abc.


Критерий победы

Это , поэтому выигрывает самый короткий код в байтах! В случае ничьей решение, опубликованное ранее, выигрывает!



Нужно ли гарантировать правильное поведение или только с вероятностью 1?
PyRulez

@PyRulez В этом задании ваша задача состоит в том, чтобы написать некоторый код, который выводит одну из ее анаграмм, выбранных случайным образом, с равномерным распределением ... (Первое предложение (ниже Задачи ))
Арджун

@ Арджун, так что 0% шанс неудачи в порядке?
PyRulez

@PyRulez Неудача? Код должен выводить одну из его анаграмм (кроме себя), выбранных случайным образом, с равными шансами на вывод любой из его анаграмм. Я не знаю, что вы имеете в виду под "неудачей".
Арджун

Ответы:


5

Желе , 15 байт

“v0¡µṾ;ḢŒ!QḊX”v

Просто чтобы все началось; это почти наверняка можно победить. В основном это просто комбинация универсального конструктора quine и функции «выбрать случайную перестановку, отличную от входной»; последнее может быть улучшенным, первое почти наверняка есть.

объяснение

Универсальный конструктор Quine

“v0¡µṾ;Ḣ”v
“       ”v   Evaluate the following, given {itself} as argument:
 v0¡µ          No-op (which starts with "v")
     Ṿ         Escape string
      ;Ḣ       Append first character of {the argument}

Это может быть видно, как quine, если запустить сам по себе. Это также правильный quine по большинству определений, о которых я знаю; он не читает свой собственный источник (скорее, он содержит литерал «eval» ed, и ему предоставляется копия самого себя в качестве аргумента), он может нести полезную нагрузку (как показано здесь!) и vвнешнюю строку литерал закодирован vизнутри.

Выберите случайную анаграмму

Œ!QḊX
Œ!     All permutations
  Q    Discard duplicates
   Ḋ   Discard the first (i.e. the string itself)
    X  Choose random element

Это действительно неэффективно для такой длинной строки, поэтому я не смог протестировать программу в целом, но я протестировал ее на более коротких строках, и, похоже, она работает правильно.


Почему не работает на TIO?
г-н Xcoder

@ Mr.Xcoder Вероятно, он обходит ограничение 60-х годов.
Эрик Outgolfer

Ах да, ты прав.
г-н Xcoder

Пока он есть в вашем счетчике байтов, ваш код пропускает необходимое Q. Однако я думаю , что вы можете изменить этот метод «все перестановки» с в «перетасовать» один , используя Ẋ⁼¿, сохраняя байт в то же время позволяя ему работать на TIO.
Джонатан Аллан

4

CJam , 17 байт

{`"_~"+m!(a-mR}_~

Это не закончится в ближайшее время, поэтому на этот раз не будет ссылки TIO.

Как утешение, вот 20-байтовое решение, которое очень быстро завершается:

{`"_~"+:S{mr_S=}h}_~

Попробуйте онлайн!

объяснение

{`"_~"+   e# Standard quine framework, leaves a string equal to the source
          e# code on the stack.
  m!      e# Get all permutations. The first one will always be the original order.
  (a      e# Remove that copy of the source code and wrap it in a new list.
  -       e# Remove all copies of the source code from the list of permutations.
  mR      e# Pick a random permutation.
}_~

Вместо этого 20-байтовое решение перетасовывает исходный код, пока он не будет отличаться от исходного.


4

Python 2, 117 байт

Удивительно, но это решение короче, чем я ожидал. Перемешивает исходный код, пока он не отличается от оригинала.

-2 байта, благодаря @ mbomb007
-3 байта, благодаря @Wondercricket

Попробуйте онлайн

s=r"""from random import*;R='s=r\"""'+s+'\"""'+';exec s';L=R
while L==R:L=''.join(sample(R,len(R)))
print L""";exec s

Это один из основных квинов в Python, который я изменил

s = r"print 's = r\"' + s + '\"' + '\nexec(s)'"
exec(s)

Генерация анаграммы осуществляется случайным модулем

L=R
while L==R:L=''.join(sample(L,len(L)))

Где R содержит исходный код

s=...
R='s=r\"""'+s+'\"""'+'\nexec s'

Тройные кавычки были необходимы, так как я был вынужден сохранять фактические разделители строк в коде. В любом случае анаграммы будут иметь 3 строки.


1
exec sвместоexec(s)
mbomb007

Поскольку a strявляется неизменным, вы можете сохранить байты, выполнив L=Rи используя sampleon Lвместо использования shuffleon list. repl.it . Идея взята из этого Stackoverflow
Wondercricket

@Wondercricket Sample возвращает список символов, поэтому сравнение его результатов с R всегда возвращает False. Но некоторая перестановка помогает, спасибо за идею!
Мертвый опоссум

3

Java 7, 376 428 426 428 байт

import java.util.*;class M{public static void main(String[]a){String s="import java.util.*;class M{public static void main(String[]a){String s=%c%s%1$c,x=s=s.format(s,34,s);for(List l=Arrays.asList(x.split(%1$c%1$c));x.equals(s);s=s.join(%1$c%1$c,l))Collections.shuffle(l);System.out.print(s);}}",x=s=s.format(s,34,s);for(List l=Arrays.asList(x.split(""));x.equals(s);s=s.join("",l))Collections.shuffle(l);System.out.print(s);}}

+52 и +2 байта для двух исправлений ошибок. Я не проверял (правильно), была ли случайно генерируемая строка равной исходному исходному коду. Шансы на это астрономически малы, учитывая количество задействованных персонажей, но я должен проверить это независимо от соответствия правилам испытания.

Мой первый ответ на на Java ..
Попробуйте здесь.

Вы можете удалить оба Collections.shuffle(l)и добавить !перед обоими, x.equals(s)чтобы убедиться, что вывод действительно равен программе:
попробуйте здесь.

Объяснение:

  • String sСодержит исходный код отформатирован.
  • %s используется для ввода этой строки в себя с s.format(...) .
  • %c, %1$cИ34 используются для форматирования двойных кавычек.
  • s.format(s,34,s) складывает все вместе

И эта часть кода отвечает за вывод случайной анаграммы:

// Strings `s` and `x` now both contain the source-code:
x=s=s.format(s,34,s);

// Create a list with the characters of this source-code-String and loop
for(List l=Arrays.asList(x.split(""));
    // as long as String `x` equals String `s`
    x.equals(s);
    // Shuffle the list, and set it to `s` in every iteration of the loop:
    s=s.join("",l))Collections.shuffle(l);
// End of loop (implicit / single-line body)

// And then print the random anagram to STDOUT:
System.out.print(x);

1

05AB1E , 22 байта

"34çìDJœ¦.R"34çìDJœ¦.R

Это создает список, который слишком велик для TIO, поэтому ссылка использует меньшую строку, но идея та же.

Попробуйте онлайн!

"34çìDJœ¦.R"           # Push this string
            34ç        # Push "
               ì       # Prepend
                DJ     # Duplicate and join 
                  œ¦   # Push all permutations except the original
                    .R # Pick a random element

1

Javascript (ES6), 128 байт

!function a(){b="!"+a+"()",c=b.split(""),c.sort(()=>Math.round(Math.random())-.5),c!=b.split("")?console.log(c.join("")):a()}();

Использует sort (), возвращая случайное значение -1,0 или 1, чтобы перемешать вывод.


0

Баш, 27 96 байт

i=`cat $0`&&e=`fold -w1 $0|shuf|tr -d '\n'`&&while [ "$e" = "$i" ]; do `$0`; exit; done&&echo $e

foldделит код на строки, shufперетасовывает строки и trобъединяет код

исправлена ​​проблема выдачи себя, теперь она никогда не выдаст себя

Попробуйте онлайн!


1
Есть ли шанс вывести сам код без изменений?
Мертвый опоссум

Кажется также, что он только перетасовывает строки, поэтому не все перестановки возможны, в частности, поскольку в программе есть только одна строка ...
Мартин Эндер

Все перестановки возможны, проверьте это. Я исправляю проблему этого, может быть, сам
вывод

1
Это $0выглядит как нарушение «Ваша программа не должна принимать никаких данных».
manatwork

Я уверен, что это просто имя файла. Поэтому, даже если он не был
CalculatorFeline
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.