Число Рина


38

Константа Champernowne - это число, которое строится путем объединения первых nчисел с nтенденцией к бесконечности. Это выглядит примерно так:

0.123456789101112131415161718192021222324252627282930...

Теперь я опишу вам число Рина . Его можно рассматривать как минимизацию константы Champernowne как целого числа. Я буду ссылаться на число Рина с первыми nцифрами как Ri ( n ). Вот как это сформулировать:

  1. Первые nнатуральные числа (последовательность {1,2,3, ...}) объединяются.
  2. Этот результат затем сортируется в соответствии с цифровым значением. Так 1..12бы выглядело 011111223456789.
  3. Поскольку Rien число не может иметь ведущие нули, мы перемещаем все 0S так , что они имеют важное значение, в то время сохраняя количество сведено к минимуму, в результате чего, скажем, 101111223456789. Это Ri ( n ), в данном случае Ri (12).

Вот некоторые результаты для Ri ( n ):

n     Ri ( n )
1 1
2 12
3 123
7 1234567
9 123456789
10 10123456789
15 101111111223344556789
34 10001111111111111222222222222223333333334444555666777888999
42 1000011111111111111222222222222222333333333333334444455556666777788889999
45 1000011111111111111222222222222222333333333333344444444444555556666777788889999
55 10000011111111111111122222222222222223333333333333333444444444444444455555555555566666777778888899999
100 100000000000111111111111111111112222222222222222222233333333333333333344444444444444444444555555555555555555566556666666666666666777777777777777777887777778888888888889999999999999999
999100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999

Цель Учитывая число 1 ≤ n<10000 в качестве ввода (через аргументы, STDIN или жесткое кодирование, если ваш язык не поддерживает обычный ввод), выведите / верните Ri ( n).

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

Ссылочная реализация

Я проверял это в IE, поэтому проблем не должно быть. Если есть проблема, есть простое решение: получить вменяемый браузер.

function min(n) {
  var seq = [];
  for(var i = 1; i <= n; i++) seq.push(i);
  seq = seq.join("").split("").map(Number);
  var to;
  if(seq.indexOf(1) >= 0) to = seq.splice(seq.indexOf(1), 1);
  seq.sort(function(a, b) {
    return a - b;
  });
  if(to) seq = to.concat(seq);
  return seq.join("");
}
t.onchange = t.onkeyup = function() {
  h.innerHTML = min(this.value)
}
* {
  font-family: Consolas, monospace;
}
input {
  border: 2px dotted #aaaaaa;
  border-radius: 5px;
  margin: 10px;
}
<input id="t" type="number">
<div id="h">


Leaderboard

Фрагмент стека в нижней части этого поста создает каталог из ответов а) в виде списка кратчайшего решения для каждого языка и б) в качестве общей таблицы лидеров.

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

## Language Name, N bytes

где Nразмер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Если вы хотите включить в заголовок несколько чисел (например, потому что ваш результат равен сумме двух файлов или вы хотите перечислить штрафы за флаг интерпретатора отдельно), убедитесь, что фактический результат является последним числом в заголовке:

## Perl, 43 + 2 (-p flag) = 45 bytes

Вы также можете сделать имя языка ссылкой, которая будет отображаться во фрагменте кода:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


22
Я всегда думал , что 0это пеп номер.
flawr

Не уверен, что я что-то упустил, но мы можем просто переместить одну из 1s перед 0s, да?
FryAmTheEggman

@FryAmTheEggman Вы правы.
Конор О'Брайен

@ MartinBüttner \ o / вы нашли это.
Конор О'Брайен

@ CᴏɴᴏʀO'Bʀɪᴇɴ Нет, этот был другим. Этот допускал только перестановки целых чисел, а не их отдельных цифр.
Мартин Эндер

Ответы:



13

Perl, 44 42 41 33 31 байт

Yaaay, первый пост когда-либо!

Спасибо primo за сохранение 2 байтов.

print 1,sort"@{[2..<>]}"=~/\d/g

Как и другие, удаление 1 и добавление его вручную делает работу.

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


2
Добро пожаловать в PPCG и поздравляю вас с первым постом (хотя странно, что я приветствую вас, поскольку вы присоединились раньше, чем я ...). Две вещи - я считаю 43 байта ... во-вторых, ваша ссылка "Попробуйте онлайн" указывает на более старую / другую версию вашего кода. Копирование кода в Ideone работает вручную, но не ваша ссылка.
AdmBorkBork

Спасибо за ваш комментарий ! Я использовал TextWrangler для подсчета байтов, думаю, я зашел слишком далеко ... (плюс пробел не понадобился, так что весь счетчик сократился до 42). Ideone должен быть исправлен сейчас.
Пол Пикард

О, не знал об этом. Также работает на моем Perl на моем Mac (5.18) Спасибо!
Пол Пикард


2
Сохраняя два байта, избавившись от split / join:print 1,sort"@{[2..<>]}"=~/\d/g
primo

11

Japt, 14 12 байт

1+2o°U ¬¬n ¬

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

Как это работает

1+2o°U ¬¬n ¬  // Implicit: U = input integer
  2o°U        // Generate the range of integers from 2 to U, inclusive.
       ¬¬     // Join, then split into chars.
         n    // Sort.
1+         ¬  // Join again, and add a 1 to the beginning.
              // Implicit: output last expression

4
о_о вы играли в гольф за 5 минут льготного периода? самое быстрое оружие на западе
Конор О'Брайен

@ CᴏɴᴏʀO'Bʀɪᴇɴ Я полагаю, что после этого вы не захотите публиковать новые кодовые гольфы: D
Пьер Арло

9

Сетчатка , 78 байт

Пришло время продемонстрировать некоторые новые функции Retina (это все еще не очень конкурентоспособно, но до сегодняшнего дня это, вероятно, было бы ближе к 300 байтам).

.+
$0$*1
\B
 $`
(1)+
$#1
^1| 

.
 1$0$*1
+r`(1+\2) (1+)\b
$2 $1
 1(1)*
$#1
^
1

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

объяснение

Несмотря на то, что теперь можно удобно конвертировать между десятичным и унарным, это все еще довольно долго, потому что мне приходится конвертировать туда и обратно несколько раз, потому что некоторые операции более выполнимы в десятичной, чем в унарной и наоборот.

.+
$0$*1

Давайте начнем с преобразования ввода в унарный. Это работает путем сопоставления ввода и последующего использования, $*1которое повторяется 1столько раз (эта функция повторения является новой на сегодняшний день).

\B
 $`

Далее мы генерируем диапазон от 1до Nв унарном. Я объяснил, почему это работает в моем ответе FizzBuzz .

(1)+
$#1

Мы конвертируем каждое число в диапазоне обратно в десятичное, чтобы мы могли работать с десятичными цифрами. Это делается путем сопоставления каждого из одинарных чисел таким образом, чтобы каждый 1генерировал отдельный захват. Затем мы заменим это числом захватов в группе один, используя новый синтаксис числа захватов $#1.

^1| 

Это удаляет начальные 1и все пробелы в строке, поэтому у нас остаются только цифры (кроме одного 1).

.
 1$0$*1

Мы конвертируем обратно в унарное число и добавляем 1к каждой цифре (чтобы гарантировать, что четное 0число непусто). Мы также вставляем пробел перед каждой цифрой, чтобы обеспечить их разделение.

+r`(1+\2) (1+)\b
$2 $1

Мы постоянно сопоставляем небольшое число, которому предшествует большее число, и меняем их местами. Это пузырчатка в сетчатке. :)

 1(1)*
$#1

Ааа и обратно в десятичную.

^
1

Наконец, мы вставляем сингл 1спереди, чтобы учесть тот, который мы удалили ранее.


1
О каких новых функциях вы говорите?
Конор О'Брайен

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Я добавлю объяснение позже. Этот использует новый синтаксис замещения для подсчета перехватов и повторяющихся символов, которые можно использовать для достаточно короткого десятичного / унарного преобразования. Вот полный список изменений: github.com/mbuettner/retina/blob/master/CHANGELOG.md
Мартин Эндер

@ MartinBüttner приятно. Значит ли это, что Retina больше не может претендовать на это освобождение ?
Цифровая травма

@DigitalTrauma Я думаю, что это все еще самая естественная форма ввода. Кроме того, я никогда не понимал, как такого рода языковая поддержка получила такую ​​большую поддержку на этом сайте.
Мартин Эндер

6

Haskell, 44 байта

import Data.List
f n='1':sort(show=<<[2..n])

К сожалению , sortв Data.List, который 17 байт!


6

JavaScript (ES6), 65 62 54 52 байта

Сохранено 3 байта благодаря edc65

x=>eval("for(b='';x>1;)1+[...b+=x--].sort().join``")

Создает строку из всех чисел от 2 до x, затем разбивает, сортирует, объединяет и добавляет 1 в начало. Это все еще может быть пригодным для игры в гольф; предложения приветствуются!


У меня нет ES6 под рукой, но вы не можете просто использовать (новый) Array(x-1).map((_,y)=>y+2)?
Конор О'Брайен

Карта @ CᴏɴᴏʀO'Bʀɪᴇɴ пропускает пустые элементы массива, поэтому вам следует использовать Array(n).fill().map(...(см. Советы по ES6)
edc65

Слишком поздно, чтобы опубликовать мой, но подсказка для вас: n=>1+[...[...Array(n-1)].map(_=>++n,n=1).join``].sort().join`` (1 байт короче, это раскол)
edc65

@ edc65 и Cᴏɴᴏʀ O'Bʀɪᴇɴ Спасибо за советы! Мне было интересно, почему использование .split()было так странно ...
ETHproductions

@ edc65 Да, мое решение такой же длины, как и ваше:n=>1+[...[...Array(n+1).keys()].slice(2).join``].sort().join``
Нил



4

APL (17)

'1',∆[⍋∆←1↓∊⍕¨⍳⎕]

Объяснение:

'1',∆[⍋∆←1↓∊⍕¨⍳⎕]
-----------------
               ⎕   read a number from the keyboard
               ⍳    get the natural numbers up to and including that number
             ⍕¨    get the string representation for each number
           ∊       flatten the array (giving a string of digits)
         1↓        remove the first digit (which is always 1)
       ∆←          store the result in ∆
      ⍋            get a permutation to sort ∆ upwards
    ∆[           ] rearrange ∆ so that it is sorted
'1',               add a 1 to the front

Тест:

      '1',∆[⍋∆←1↓∊⍕¨⍳⎕]
⎕:
      1
1
      '1',∆[⍋∆←1↓∊⍕¨⍳⎕]
⎕:
      10
10123456789
      '1',∆[⍋∆←1↓∊⍕¨⍳⎕]
⎕:
      55
10000011111111111111122222222222222223333333333333333444444444444444455555555555566666777778888899999

Ницца! Гораздо лучше, чем у меня. : D Я не знал, что это сгладит массив и даст вам строку. Это хорошо знать.
Алекс А.


3

ClojureScript, 48 байт

#(apply str"1"(sort(apply str(range 2(inc %)))))

Так же, как и все остальные, в значительной степени. REPL доступно здесь .


3

Рубин, 48 байтов

Анонимная функция. В основном просто Rubyfied некоторые другие ответы здесь ..

->n{n>1?(?1+[*2..n].join.chars.sort*'').to_i: n}

3

Brachylog , 76 41 байт

1 .;{,1:.e?}?:1fcbZlL,ZoOlM,10^(L-M)=:Oc.

Принимает число в качестве ввода.

Это решение работает с несколькими изменениями, которые я внес во встроенный предикат Findall f . OP, по-видимому, в порядке с использованием языков старше, чем ответ, поэтому я думаю, что это нормально (изменения, которые я сделал, были сделаны давно, я просто мотивировал себя сделать это из-за этой проблемы).

объяснение

1 .                                            § If the input is 1, unify output with 1

   ;                                           § Else

    {      }?:1f                               § Output a list of all inputs which satisfy
                                               § the predicate in brackets with the input
                                               § of the main predicate (ie the input number)
                                               § as output

     ,1:.e?                                    § True if the input is an integer between 1
                                               § and . (the output)

                cbZ                            § Concatenate everything into a single number,
                                               § remove the first digit (1) and call it Z

                   lL,ZoOlM,                   § L is the length of Z, M is the length of O
                                               § O being Z sorted (which removes the leading
                                               § 0s)

                            10^(L-M)=:Oc.      § Concatenate 10^(L-M) at the beginning of O
                                               § and unify it with the output

3

Smalltalk, 76 байт

Как обычно в Smalltalk, концептуально очень кратко, но текстуально очень многословно ...

f:l^'1',((2to:l)fold:[:p :q|p asString,q asString])asByteArray sort asString

Добавьте это как метод класса для Stringи вызовите как, например, для 20,String f: 20



3

Bash, 35 34 байта

printf %d 1`seq 2 $1|fold -1|sort`

Это основано на ответах @DigitalTrauma и @OlivierDulac . Попробуйте онлайн с Ideone .

Как это работает

  • seq 2 $1печатает все целые числа из 2 до указанного в командной строке

  • fold -1 оборачивает все строки шириной 1, т.е. размещает каждый символ на отдельной строке.

    -1 кажется недокументированной функцией.

  • sort сортирует символы по их числовому значению.

  • printf %d 1`...`​предваряется 1 к первой строке и печатает каждую строку как целое число ( %d) без разделения.

    Это использует любопытную реализацию Bash printf, которая повторяет строку формата снова и снова, пока все аргументы не будут использованы.


+1, мне он больше нравится, чем у нас :)
Оливье Дюлак

3

JavaScript ES6, 49 46 байт

Спасибо edc65 за 2 байта

F=
x=>1+[...(g=_=>x>1?x--+g``:_)``].sort().join``

;console.log(F(15))


1
Я получил нечто подобное, но на 1 байт короче. Попробуйте использовать рекурсивную функцию без аргументов, просто уменьшив исходный параметр x
edc65

2

Юлия, 33 байта

n->"1"*join(sort([join(2:n)...]))

Это лямбда-функция, которая принимает целое число и возвращает строку. Чтобы вызвать его, присвойте его переменной.

Мы строим диапазон 2:n, который будет пустым для n<2, соединяем его в строку, разбиваем строку на массив символов, сортируем их, соединяем в строку и добавляем 1.


2

APL, 21 байт

{' '~⍨⍕1,x[⍋x←⍕1↓⍳⍵]}

Это безымянная монадическая функция, которая принимает целое число справа и возвращает строку. Чтобы вызвать его, присвойте его переменной.

Объяснение:

            x←⍕1↓⍳⍵]}   ⍝ Get the numbers 1:input, drop 1, convert to string
         x[⍋            ⍝ Sort
      ⍕1,               ⍝ Tack 1 onto the front, flatten to string
{' '~⍨                  ⍝ Remove the spaces (side effect of ⍕ on an array)

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


2

Python 2, 60 байт

P=input();print"1"+"".join(sorted(`range(2,P+1)`)[P*2-4:-2])

Индексирование на победу. :-)


Python 2, 60 байт

P=input();print"1"+"".join(sorted(`range(-P,-1)`))[P*3-5:-2]

Просто альтернатива.


2

Млечный Путь 1.6.4 , 22 байта (не конкурирует)

^^'LH=^^JB", "-Q"1";+!

Мне пришлось добавить код операции сортировки для этого вызова.


объяснение

^^                      ` pop the TOS
  '                     ` read input from the command line
   LH                   ` push a reversed Pythonic range(TOS+1)
     =^^J               ` remove the top 2 items from the TOS
         B              ` push the string literal of the TOS
          ", "-         ` remove ", " from the TOS
               Q        ` sort the TOS
                "1";+   ` add "1" to the beginning of the TOS
                     !  ` output the TOS


2

Инструменты Bash и GNU, 58 52 байта

echo 1$(seq 2 $1|sed -e 's/./&\n/g'|sort|tr -d \\n)

похожий подход, чем @ Digital-trauma, но другой способ добавить 1, и нет необходимости в -n, так как числа имеют длину 1 цифра. (Я увидел его ответ после первой попытки)
Оливье Дюлак

2

PowerShell, 61 59 байт

param($a)(("1"+-join([char[]]-join(2..$a)|sort)),1)[$a-eq1]

Принимает ввод param($a)и затем использует его для индексации в массив с [$a-eq1]. Если true, мы индексируем второй элемент и выводим 1. В противном случае, мы сцепить "1"с joinмассивом эд , созданного 1) , определяющей новый диапазон , 2..$aкоторый был сам joinад вместе, 2) отливки , что в качестве полукокса массива, и 3) посылая его через Sort-Objectкомандлет, все из которых затем выводится.

Edit1 - Сохранено 2 байта путем перемещения внутреннего -joinоператора.


2

Гога , 9 7 байт

GJT1-1P

Вы можете запустить это используя:

$ ./gogh noi 'GJT1-1P' <input>

G     “ Push a range (1, TOS]       ”
J     “ Join the TOS                ”
T     “ Sort the TOS                ”
1-    “ Remove the first 1          ”
P     “ Prepend the TOS to the STOS ”

«Вы можете использовать язык, созданный после этого конкурса, если только он не предназначен для ответа на этот вызов». Я позволяю таким языкам быть конкурентоспособными в своих задачах, обычно;)
Конор О'Брайен

@ CᴏɴᴏʀO'Bʀɪᴇɴ: О, классно! Спасибо за указание на это :)
Зак Гейтс

2

Желе , 8 байт

RDFṢ1œ|Ḍ

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

Как это работает

RDFṢ1œ|Ḍ  Main link. Argument: n (integer)

R         Range; yield r := [1, ..., n].
 D        Convert each k in r into the array of its digits in base 10.
  F       Flatten the resulting array of lists.
   Ṣ      Sort the resulting flat list of digits.
    1œ|   Perform multiset union with 1 as left argument.
          This moves a single 1 to the beginning of the list.
       Ḍ  Convert the resulting list of base 10 to integer.

2

Oracle SQL 11.2, 222 211 байт

SELECT 1||TRIM(xmlagg(xmlelement(e,c)).EXTRACT('//text()'))FROM(SELECT SUBSTR(s,LEVEL+2,1)c FROM(SELECT MAX(sys_connect_by_path(LEVEL,' '))s FROM DUAL CONNECT BY LEVEL<=:1)CONNECT BY LEVEL<=LENGTH(s)ORDER BY 1);

Un-golfed

SELECT 1||TRIM(xmlagg(xmlelement(e,c)).EXTRACT('//text()'))  -- add leading 1, concatenate each char and remove spaces
FROM   (
         SELECT SUBSTR(s,LEVEL+2,1)c                          -- split the string in characters, omiting the first number (1)   
         FROM   (
                  SELECT MAX(sys_connect_by_path(LEVEL,' '))s -- create a string by concatenating numbers
                  FROM   DUAL 
                  CONNECT BY LEVEL<=:1
                )
         CONNECT BY LEVEL<=LENGTH(s)ORDER BY 1
       )

2

MATL , 17 байт

Использует текущую версию (7.0.0) языка / компилятора.

49[]i:"@YUh]6L)Sh

Вдохновленный ответом FryTheEgggman .

РЕДАКТИРОВАТЬ (29 июля 2016 г.): вы можете попробовать его онлайн с некоторыми изменениями, чтобы соответствовать изменениям в языке.

пример

>> matl
 > 49[]i:"@YUh]6L)Sh
 >
> 12
101111223456789

объяснение

49        % push '1'
[]        % push empty array
i:        % input "N" and build vector [1, 2, ... N]
"         % for each number in this vector
   @      % push that number
   YU     % convert to string
   h      % concatenate horizontally
]         % end
6L)       % remove first element
S         % sort
h         % concatenate horizontally

1

05AB1E , 6 байтов

Примечание. В этом материале используются функции, которые устарели после этого вызова и поэтому не являются конкурентоспособными.

Код:

Lß?J{?

Объяснение:

L      # Creates the list [1 .. input]
 ß     # Extract the smallest value of the list
  ?    # Print this value (always 1)
   J   # ''.join(list)
    {  # Sort the string
     ? # Print this value

Использует кодировку ISO 8859-1


Как это работает?
lirtosiast

@ThomasKwa Объяснение добавлено
Аднан

Вау. Это фантастика!
Конор О'Брайен

1

Mathcad, 86 "байтов"

Функция s (n) использует цикл for для построения "целого числа" Champernowne путем преобразования каждого числа в его строковую форму и объединения их вместе. Затем строка преобразуется в эквивалентный вектор кодов ASCII и сортируется. Затем функция заменяет любые ведущие нули на первый, и, наконец, преобразует вектор обратно в строку.

Чтобы проверить функцию, я поместил тестовые случаи в вектор vn, затем применил s к vn, используя оператор векторизации. Затем я сравниваю результаты с данными значениями тестового примера.

enter image description here


Mathcad - это математическое приложение, основанное на двухмерных рабочих листах, состоящих из «областей», каждая из которых может быть текстом, математическим выражением, программой, графиком или компонентом со скриптом.

Математическая или программная инструкция выбирается из панели инструментов палитры или вводится с помощью сочетания клавиш. В целях игры в гольф под операцией («байтом») понимается количество операций клавиатуры, необходимых для создания имени или выражения (например, чтобы установить для переменной a значение 3, мы бы написали a: = 3. Оператор определения : = - это одиночное нажатие клавиши ":", равно как a и 3, дающие в общей сложности 3 "байта". Для программирования оператора требуется набрать ctl-shft- # (или один щелчок на панели инструментов программирования), поэтому снова эквивалентно 1 байт

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