Гольф вам анаграма для великого блага!


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 У цьому виклику ваше завдання полягає в тому, щоб написати якийсь код, який виводить одну з його анаграм, вибраних випадковим чином, з рівномірним розподілом ... (Перше речення (нижче Завдання ))
Арджун,

@Arjun, так що 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}

Видно, що це квіточка, якщо вона працює сама собою. Це також належна квітка за більшістю визначень, про які я знаю; воно не читає власне джерело (скоріше, воно містить буквальне, що є "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-х.
Ерік Аутгольфер

О так, ти маєш рацію.
Містер 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

Так як strнезмінний, ви можете зберегти байт, роблячи L=Rі використовуючи sampleна Lзамість використання shuffle на list. repl.it . Ідея взята з цієї програми Stackoverflow
Wondercricket

@Wondercricket Sample повертає список символів, тому порівняння його результатів з R завжди поверне помилкове. Але деякі перестановки допомагають, дякую s за ідею!
Мертвий Поссум

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 байти для двох виправлень помилок. Я не перевіряв (правильно), чи випадково генерується String дорівнює вихідному вихідному коду. Шанси на це астрономічно невеликі, враховуючи кількість залучених персонажів, але мені доведеться перевірити це незалежно від правил виклику.

Мій перший відповідь в 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()}();

Використовує сортування (), повертаючи випадкові -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
Чи є шанс вивести сам код без змін?
Мертвий Поссум

Також, здається, тільки перетасовуються рядки, тому не всі перестановки можливі, тим більше, що програма має лише один рядок ...
Мартін Ендер

Можливі всі перестановки, протестуйте їх. Я виправляю проблему, можливо, витісняючи її з себе
DrnglVrgs

1
Це $0виглядає як порушення "Ваша програма не повинна брати жодного внеску".
манатура

Я впевнений, що це лише ім'я файлу. Тому, навіть якщо це не було введення, це хитрість :(
CalculatorFeline
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.