Перестановка источников

14

Перестановка из множества S={s1,s2,,sn} является биективен функция π:SS . Например, если S={1,2,3,4} то функция π:x1+(x+1mod4) перестановка:

π(1)=3,π(2)=4,π(3)=1,π(4)=2

Мы также можем иметь перестановки на бесконечных множествах, давайте возьмем N в качестве примера: функция π:xx1+2(xmod2) является перестановкой, меняющей четные и нечетные целые на блоки по два. Первые элементы следующие:

2,1,4,3,6,5,8,7,10,9,12,11,14,13,16,15,

Вызов

Ваша задача для этой задачи - написать функцию / программу, реализующую любую 1 перестановку натуральных чисел. Оценка вашего решения - это сумма кодовых точек после сопоставления их с реализованной перестановкой.

пример

Предположим, мы берем вышеупомянутую перестановку, реализованную с помощью Python:

def pi(x):
    return x - 1 + 2*(x % 2)

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

Символ dимеет кодовую точку 100 , pi(100)=99 . Если мы сделаем это для каждого персонажа, мы получим:

99,102,101,31,111,106,39,119,42,57,9,31,31,31,31,113,102,115,118,113,109,31,119,31,46,31,50,31,44,31,49,41,39,119,31,38,31,49,42

Сумма всех этих сопоставленных символов составляет 2463 , это будет оценка для этой функции.

правила

Вы будете реализовывать перестановку π как функцию или программу

  • учитывая натуральное число x , возврат / вывод π(x)
  • для целей этой задачи N вовсе не содержит 0
  • перестановка должна нетривиально переставлять бесконечное подмножество N
  • вашей функции / программе не разрешено читать собственный источник

счет

Оценка дается суммой всех кодовых точек (нулевые байты могут не быть частью исходного кода) при этой перестановке (кодовые точки зависят от вашего языка 2 , вы можете свободно использовать SBCS, UTF-8 и т. Д., Пока ваш язык поддерживает это).

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


  1. За исключением перестановок, которые переставляют только конечное подмножество N , что означает, что множество {x|π(x)x} должно быть бесконечным.

  2. Если это улучшает ваш счет, вы можете, например, использовать кодировку Jelly в кодировке UTF-8 вместо обычной SBCS.

ბიმო
источник
1
@JoKing «нулевые байты не могут быть частью исходного кода» re: второй вопрос
только ASCII
Относящиеся .
Питер Тейлор

Ответы:

6

Желе , оценка  288 250 212  199

-38 спасибо Эрику Аутгольферу!

C-*+

Меняется даже с нечетным.

Счет 67+45+44+43=199 - см. Самооценку здесь .

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

Джонатан Аллан
источник
По-видимому, у Лики Нун -*ạесть оценка 300 ... однако, -*_@есть оценка 250. Возможно, я должен опубликовать это как мой собственный, хотя это та же самая перестановка.
Эрик Outgolfer
Ах, хорошее наблюдение Лики Нун, так что -*N+оценка 212
Джонатан Аллан
Это не было наблюдением, это был ответ на его (теперь довольно старый) вызов . ;-)
Эрик Outgolfer
3
C-*+звучит как какой-то будущий вариант C++.
говорит
5

JavaScript (ES6), оценка =  276  268

$=>(--$^40)+!0

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

Arnauld
источник
но 54^54это0
Джонатан Аллан
@JonathanAllan Спасибо за уведомление. Я как-то пропустил эту часть. Должно быть правильно сейчас.
Арно
4

Perl 6 , оценка: 201

*-!0+^40+!0

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

Порт Арнаулда ответ . Это дает преимущество xor ( +^), имеющему тот же приоритет, что -и+ , и от использования лямбды-бы то ни было для уменьшения общих символов. Кроме этого, я не мог найти способ представить это по-другому, чтобы получить лучший результат.

Perl 6 , оценка 804 702

{{(++$ords(q[!$%()+-2?[]_doqrsx{}∉])??++$+22-$++%2-$++%2!!++$)xx$_}()[-!$+$_]}

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

Здесь первый ответ типа quine-y, и я думаю, что он набрал неплохие результаты.

В результате получается последовательность 23,22,25,24... из тела вопроса с диапазоном 1,2,3,4...21 вставленным в индексы уникальных отсортированных кодовых точек кода. Например, элементы последовательности с 30-го по 35-й - это 50,53,52,1,55,54 поскольку 33-я кодовая точка - !это самая низкая кодовая точка в моем коде.

Джо Кинг
источник
О_о, это значительное улучшение
только ASCII
4

Оценка Python 2 : 742 698 694 балла

lambda a:a^96or~~96

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

-44 балла благодаря Орджану Йохансену; -4 балла спасибо xnor.

Час Браун
источник
Эрджан Йохансен: исправлено (и это спасло мне 44 байта!)
Час Браун
Хорошее сохранение (хотя это не байты)
Орджан Йохансен
Это щедрое кредитование!
Эрджан Йохансен
Не отредактировал бы, если бы вы не указали на недостаток :)
Chas Brown
Это дешевле заменить пробел перед 96с ~~.
xnor
2

Сетчатка 0.8.2 , 6 байт, оценка 260

T`O`RO

Попробуйте онлайн! Ссылка включает нижний колонтитул. Просто меняются цифры 1и, 9и 3и 7в десятичных представлениях, так что числа, не содержащие цифр, взаимно просты 10и не затрагиваются.

Нил
источник
2

C # (интерактивный компилятор Visual C #) , 22 байта, оценка 247 245

A=>A>65?A-1+A%2*2:66-A

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

Простой, если меньше 66, возвращает 66 минус ввод, иначе используйте формулу в вопросе, которая меняет четные и нечетные числа.

Воплощение невежества
источник
Что не так с предыдущей версией A=>A<66?66-A:A?
Джо Кинг,
2
@JoKing За исключением перестановок, которые переставляют только конечное подмножествоNЭто означает, что множество {Икс|π(Икс)Икс}должен быть бесконечным. Набор не бесконечен, поскольку единственными значениями в наборе являются 1-65, так как выше 65 все значения A отображаются на A
Воплощение Невежества
О черт, я этого не заметил. Это означает, что мой собственный ответ тоже недействителен :(
Джо Кинг,
2

TI-BASIC, 9 байтов, оценка 1088 1051 1000

Ans-cos(π2fPart(2⁻¹Ans

Меняется даже с нечетным. Четные карты Ans-1и нечетные карты Ans+1.

TI-BASIC является токенизированным, поэтому эта программа будет иметь следующие шестнадцатеричные значения:

Ans   -    cos(  π    2    fPart(  2   ⁻¹  Ans
72    71   C4    AC   32   BA      32  0C  72

Таким образом, оценка: 113+114+195+171+49+185+49+11+113знак равно1000

Выходная тестовая программа:

For(I,1,10
I
Ans-cos(π2fPart(2⁻¹Ans
Disp Ans
Pause
End

Какие выводы:

2
1
4
3
6
5
8
7
10
9

Примечания:

  • Значения токенов TI-BASIC можно найти здесь .

  • Pauseиспользуется в программе вывода, чтобы лучше видеть перестановку, поскольку калькулятор имеет только 8 строк. Нажмите [ENTER], чтобы просмотреть следующую перестановку.

Тау
источник
1

Древесный уголь , 13 байт, оценка 681

⁻⁺²³²ι⊗﹪⊖ι²³³

Попробуйте онлайн! Ссылка на самооценочную версию с заголовком для сопоставления с массивом байтовых кодов. (У древесного угля есть пользовательская кодовая страница, поэтому я вручную вставил правильные байтовые коды во вход.) Работает путем изменения диапазонов из 233 чисел, так что 117, 350, 583 ... остаются неизменными. Объяснение:

     ι          Value
 ⁺              Plus
  ²³²           Literal 232
⁻               Minus
         ι      Value
        ⊖       Decremented
       ﹪        Modulo
          ²³³   Literal 233
      ⊗         Doubled
Нил
источник
1

Хаскелл, оценка 985

(\((.),(-))->(.)*200+mod(-39+(-))200+1).(\(*)->divMod((*)-1)200)

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

Джозеф Сибл-Восстановить Монику
источник
Я не думаю, что это перестановка, так как добавление a*200не имеет эффекта по модулю 200, поэтому a не имеет значения.
xnor
@xnor Хороший улов. Это должно быть за пределами мода. В какой-то момент, играя в гольф, я, должно быть, испортил порядок операций. Исправлено сейчас, спасибо!
Джозеф Сибл-Восстановить Монику
Я думаю, что есть еще одна проблема, связанная с тем, что 40 отображается в 0, но для задачи требуются натуральные числа, что делает такие подходы сложными.
xnor
1
Использование sum[1|...]более if..then..elseдолжно помочь.
ბიმო
1
Давайте продолжим эту дискуссию в чате .
Только для ASCII
1

05AB1E , счет: 488 в кодовой странице 05AB1E

È·<-

Меняет местами странные и четные функции примера.

Постараюсь улучшить счет отсюда.

Попробуйте онлайн с вводом в диапазоне[1, 100] или Попробуйте онлайн с кодовыми точками.

Объяснение:

È     # Check if the (implicit) input is even (1 if truthy; 0 if falsey)
 ·    # Double (2 if truthy; 0 if falsey)
  <   # Decrease by 1 (1 if truthy; -1 if falsey)
   -  # Subtract it from the (implicit) input (and output implicitly)
Кевин Круйссен
источник
0

Brainfuck, 47 байт, оценка 2988

,[-<+<+>>]<[->[>+<[-]]+>[<->-]<<]>[-<<++>>]<<-.

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

Я использовал перестановку, приведенную во введении. Поскольку это биекция, вы можете использовать ее как простой симметричный шифр, подобный ROT13 или Atbash. Мое решение работает на неограниченных клетках. Однако, ограничившись 8-битными ячейками, вы можете сэкономить 2 балла, заменив их [-]на [+].

orthoplex
источник