Отменить ряд чисел

34

При заданном числе достаточно просто nсоздать диапазон от 0до n-1. Фактически, многие языки предоставляют эту операцию как встроенную.

Следующая программа CJam читает целое число, а затем распечатывает такой диапазон ( попробуйте онлайн! ):

ri,

Обратите внимание, что он печатает числа без разделителя.

Соревнование

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

Характеристики

  • Числа даны без разделителя.
  • Вы можете предположить, что строка образует допустимый диапазон.
  • Вы можете использовать индексацию на основе 0 или 1 для своего диапазона.
  • Вы можете предположить, что правильный вывод никогда не превысит 32 767 (поэтому допустимый ввод никогда не будет иметь длину больше 15 275).
  • Вы можете предположить, что правильный вывод всегда будет положительным (поэтому вам не нужно обрабатывать 0 или отрицательный результат).

Это , поэтому выигрывает самый короткий конкурирующий ответ (измеряемый в байтах).

Тестовые случаи

0 индексированные:

0123 -> 4
0 -> 1
0123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 -> 101

1-индексированный:

1234 -> 4
1 -> 1
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 -> 100
Esolanging Fruit
источник
Есть ли нисходящие диапазоны? Нужно ли работать на отрицательные числа?
Даниэль
@ Дэниэл Нет. Забыл упомянуть это; добавлено.
Esolanging Fruit
4
Наши программы действительно должны обрабатывать пустую строку? Я думаю, что было бы разумно позволить нам игнорировать это. Некоторые ответы не получают выгоды от этого правила вообще.
г-н Xcoder
Может ли вывод быть строковым представлением числа, т.е. взятым как подстрока из исходной строки?
user2390246
@ user2390246 Да, все в порядке.
Esolanging Fruit

Ответы:

11

Шелуха , 5 байт

LCmLN

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

Только буквы!

Принимает ввод в виде строки, результат индексируется 1.

объяснение

LCmLN
  mLN    get the list of lengths of all positive naturals
 C       cut the input into slices of those lengths
L        get the length of the resulting list
Лео
источник
8

05AB1E , 7 6 байтов

1-индексироваться.

āηJsk>

Попробуйте онлайн! или как тестовый набор

объяснение

ā        # push range [1 ... len(input)]
 η       # compute prefixes of the range
  J      # join each prefix to a string
   sk    # get index of the input in the list of prefixes
     >   # increment
Emigna
источник
Я делаю что-то неправильно? Похоже, это возвращает 0независимо от ввода: tio.run/##MzBNTDJM/f8/3efcdi/PbLv//5UMjYxNTM3MLSwNDZQA
Shaggy
@Shaggy: Вы должны сделать это как это или это , как подсчитывать одиночные кавычки как часть входных данных.
Emigna
Ах, так что строковые входы в 05AB1E должны быть в тройных кавычках?
Лохматый
@ Shaggy: Если вы хотите пустую строку или символы новой строки во входных да. В противном случае вам не нужно цитировать это вообще.
Emigna
[NÝJQ#]Nбыла моя идея, но это лучше, потому что это работает для "".
Волшебная Урна Осьминога
7

Java 8, 66 59 байт

s->{int r=0;for(String c="";!c.equals(s);c+=r++);return r;}

0 индексированные

-7 байт благодаря @ PunPun1000 .

У меня такое чувство, что это можно сократить, только проверив длину входных данных, поскольку мы можем предположить, что входные данные всегда действительны. Все еще выясняю это. Невозможно понять это, и это, вероятно, будет стоить слишком много байтов в Java, чтобы быть полезным в любом случае (то же самое относится к возврату подстроки конца 1-индексированного ввода).

Объяснение:

Попробуй это здесь.

s->{                 // Method with String parameter and integer return-type
  int r=0;           //  Result-integer
  for(String c="";   //  Check-String
      !c.equals(s);  //  Loop as long as the sum-String doesn't equal the input-String
    c+=r++           //   Append the number to the the Check-String,
                     //   and increase the Result-integer by 1
  );                 //  End of loop
  return r;          //  Return the result-integer
}                    // End of method
Кевин Круйссен
источник
1
59 байт: TIO
PunPun1000
Вероятно, есть какой-то абсурдный ярлык, например, подсчет числа единиц или использование логарифма длины для получения длины необходимой подстроки ... У меня только плохие идеи для этого.
JollyJoker
6

Брахилог , 9 7 байт

⟦kṫᵐc,Ẹ

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

0 индексированные.

объяснение

Здесь мы передаем входные данные через переменную Output и получаем доступ к результату через переменную Input.

⟦          The result is the input to a range…
 k         …with the last element removed…
  ṫᵐ       …which when all elements are casted to string…
    c      …and are then concatenated results in the input string
     ,Ẹ    (Append the empty string, this is necessary for it to work in the case where the 
             input is the empty string)
Fatalize
источник
5

Japt , 8 байт

Начинаем разбираться с методами функций в Japt.

0 индексированные. Может принимать входные данные в виде строки, целого числа или массива, содержащего 0 или 1 элемент.

_o ´U}a

Попробуй это


объяснение

Неявный ввод строки U.

_     }a

Получите первое целое число, >=0которое возвращает true, когда передано через функцию, которая ...

o

Генерирует массив целых чисел от 01 до текущего целого числа ...

¬

Присоединяет это к строке ...

¥U

Проверяет эту строку на равенство с U.

Неявный вывод результирующего целого числа.


Альтернатива, 8 байт

ÊÇo ¬ÃbU

Попробуй это

мохнатый
источник
4

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

I⌕E⁺ψθ⪫EκIλωθ

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

          λ     Inner map variable (μ inner map index also works)
         I      Cast to string
        κ       Outer map index
       E        Map over implicit range
      ⪫    ω    Join result
     θ          Input string
   ⁺ψ           Plus an extra character
  E             Map over each character
 ⌕          θ   Find the index of the original string
I               Cast from integer to string
                Implicit print
Нил
источник
4

Haskell, 40 37 байт

f s=[n|n<-[0..],(show=<<[0..n])>s]!!0

Функция, которая меняет диапазоны с нуля.

Спасибо Laikoni за сохранение 3 байта!

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

Кристиан Лупаску
источник
1
37 байт со списком понимания: f s=[n|n<-[0..],(show=<<[0..n])>s]!!0.
Лайкони
1
И только упомянуть об этом, вы можете сохранить байты с помощью второго шаблона караула: |m<-n+1=s!m.
Лайкони
2

JavaScript (ES6), 32 31 байт

Сохранено 1 байт благодаря Challenger5

f=(s,r=n='')=>r<s?f(s,r+n++):+n

Контрольные примеры

Arnauld
источник
1
Опять же, вы можете сравнить строки лексикографически?
Esolanging Fruit
Я собирался предложить карри, но похоже, что это уже не консенсус :(
Лохматый
1
@ Шэгги Хмм, это на самом деле ...
Эрик Аутгольфер
1
@EriktheOutgolfer Стандартное карри хорошо, но Шегги имел в виду эту особую форму карри, которая требует таких звонков, как f(payload_param)()или даже f(payload_param)(some_constant). (Между прочим, я не уверен, что это сработает в данном конкретном случае, потому что мне нужно и то, rи другое nнужно инициализировать.)
Арно
2

Mathematica, 46 байтов

Array[""<>ToString/@Range@#&,2^15]~Position~#&

1-индексированных

вход

[ "12345678910"]

J42161217
источник
2

Рубин , 51 50 46 байтов

->n{(0..4e4).map{|x|(1..x).to_a.join}.index n}

(Это моя первая программа на Ruby, так что дальше будет легко играть в гольф)

-4 байта благодаря @Nnnes

Элазар
источник
1
Вам не нужен последний набор скобок: .index(gets)=> .index gets. Вы можете использовать 4e4вместо 8**5, хотя это сделает его еще медленнее. Обычно это нормально, и часто экономит несколько байтов, используя анонимные лямбды для ответов Ruby: попробуйте онлайн! (Я изменил лимит на 100, чтобы он не
истекал
2

Python 2 , 43 байта

f=lambda s,i=1,r='':r<s and-~f(s,i+1,r+`i`)

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


Python 2 , 43 байта

f=lambda s,i=1:s>''and-~f(s[len(`i`):],i+1)

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


Python , 46 байт

lambda s:s[-sum(i*'0'in s for i in range(5)):]

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

Другая стратегия. Принимает количество символов с конца, равное длине наибольшей серии 0s в s.


Python , 46 байт

f=lambda s,c=0:c*'0'in s and f(s,c+1)or s[-c:]

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

Рекурсивная версия вышеперечисленного.

XNOR
источник
Ваша «другая стратегия» (очень умная, кстати) работает для диапазонов от 0, как требуется в постановке задачи? Вы должны изменить внутренний бит ... i*'0'in s[1:] for ...или что-то в этом роде?
Лука
@ LucaCiti Это работает для 1-диапазонов, и задача позволяет нам выбирать.
xnor
Конечно, вы правы. Я только посмотрел на первоначальное описание и пропустил ту часть, где он допускает диапазоны на основе 1.
Лука
2

R , 47 байт

n=nchar(scan(,""));which(cumsum(nchar(1:n))==n)

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

1-индексированных

user2390246
источник
3
Используйте "if"вместоifelse
Джузеппе
Хорошая точка зрения! Но теперь OP снял требование иметь дело со случаем 0, поэтому я могу полностью избавиться от этого бита ...
user2390246
1
Вы можете принять ввод как число, так как ncharработает, как вы можете ожидать от чисел. Тем не менее, вам нужно обрабатывать вывод вашей продукции, так как это не будет работать при полной программе.
JAD
1
n=nchar(scan());cat(which(cumsum(nchar(1:n))==n))
JAD
2

APL (Дьялог) , 17 11 байтов

-6 байт благодаря ngn .

{,\⍕¨⍳≢⍵}⍳⊂

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

⍳⊂ найти ɩ NDEX всего аргумента в

{} Результат этой анонимной функции:

 длина аргумента

ɩntegers до этого

⍕¨ форматировать (stringify) каждый

,\ совокупное объединение тех

Адам
источник
О, я забыл, что могу просто отойти от дел, отличная работа.
Захари
{,\⍕¨⍳≢⍵}⍳⊂(11 символов)
нгн
@ngn Глупый я. Конечно!
Адам
2

Perl 5 , 19 байт

18-байтовый код + 1 для -p.

$i++while s/$i\B//

Использует индексирование на основе 1. -7 байт благодаря @ nwellnhof «S гораздо лучше подход!

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

объяснение

$\это специальная переменная, которая printредактируется автоматически после каждого оператора, поэтому, используя ее для хранения нашего номера, нам не нужно обновлять $_(которая автоматически печатается как часть функциональности -pфлага), чтобы содержать желаемый результат. Затем, пока ввод начинается с $\, удалите его и redoпрограмму, которая снова увеличивает $\и заменяет ее. Когда он больше не находит число в начале строки, мы закончили! Наконец, уменьшаем, $\чтобы у нас был последний номер в диапазоне.

Дом Гастингс
источник
Как насчет $i++while s/$i\B//(18 + 1 байт)?
nwellnhof
@nwellnhof Это намного лучше! Я думаю, что я начал более сложный маршрут, так как я сделал ответ 0-indexed прежде всего ... Спасибо!
Дом Гастингс
1

CJam , 13 байтов

q:Q,),{,sQ=}#

Так много запятых ...

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

объяснение

q:Q            Read the input and store it in Q
   ,           Get its length
    ),         Get the range 0..n
      {,sQ=}#  Find the index of the first number in the range to satisfy this block:
       ,        Get the range 0..(number)-1
        s       Stringify it
         Q=     Check if it equals the input
Бизнес Кот
источник
1

Perl 6 ,  30 28  27 байтов

{first :k,*eq$_,[\~] '',0...*}

Попробуй это

{[\~]('',0...*).first($_):k}

Попробуй это

{first :k,$_,[\~] '',0...*}

Попробуй это

Expanded:

{  # bare block lambda with implicit parameter 「$_」

  first       # find the first one
  :k,         # return the index into the Seq instead of what matched
  $_          # that matches the input

  # from the following

  [\~]        # triangle reduce using &infix:«~» (string concatenation)

              # a Seq
    '',       #   that starts with an empty Str
    0         #   then a 0
    ...       #   generate values
    *         #   indefinitely
}

'',0...*производит бесконечную последовательность значений '', 0, 1, 2, 3...

[\~] '',0...* производит бесконечную последовательность всех возможных входов

""
"0"
"01"
"012"
"0123"
...

Обратите внимание, что этот код никогда не остановится, если вы введете неверный ввод.

Брэд Гилберт b2gills
источник
1

Pyth , 11 10 байт

1-индексироваться.

fqQ|jkSTk0

Попробуй здесь

Если пустую строку можно игнорировать, ее можно сократить до 6 байт :

fqQjkS

-1 байт благодаря @Mnemonic

Мистер Xcoder
источник
?QfqQjkUT)1Я могу сделать это и в 11, но я чувствую, что какой-то переупорядочивание может отыграть байт. Любые идеи?
Дэйв
Вы можете сохранить байт, используя jkвместо s`m.
1

CJam, 14 12 11 байтов

q,_){,s,}%#

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

q,   e# Get length of input string
_)   e# Duplicate length, increment by 1
{    e# Generate array by mapping [0,1,2,...,length] using the following function: 
,    e# Generate range [0,x] (x is the int we're mapping)
s    e# Convert range to string (e.g [0,1,2,3] => "0123"
,    e# Get the length of that string
}%   e# Map the int to the length of it's range string
#    e# Return the index of the length of the input string in the generated array
geokavel
источник
1

Дивиль , 42 38 байт

s=>"".{var r=0;while($0!=s)$0++=r++;r}

Тот же алгоритм, что и в этом ответе Java , за исключением того, что (ab) использует некоторые синтаксические особенности Dyvil.

Объяснение:

s=>          // starts a lambda expression with one parameter
"".{         // begins a brace access expression, the value before the '.'
             // is available within the braces as a variable named '$0'
var r=0;     // variable with inferred type int
while($0!=s) // while the accumulator $0 does not (structurally) equal s
$0++=r++     // concatenate $0 and the String representation of r,
             // then store the result in $0 and increment r by 1
;            // end of while
r}           // return r as the result of the lambda

  • Сохраненные 4байты с использованием выражения доступа скобки вместо переменной для аккумулятора
Clashsoft
источник
Классный язык !!
Роберт Фрейзер,
0

MATL , 14 байтов

`@q:VXzGX=~}@q

1-индексироваться.

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

объяснение

`       % Do...while
  @     %   Push iteration index (1-based), k
  q     %   Subtract 1: gives k-1
  :     %   Range: [1 2 ... k-1]. Will be empty for k=1
  V     %   Convert to string
  Xz    %   Remove spaces
  G     %   Push input
  X=    %   Are the two strings equal?
  ~     %   Negate. This is the loop condition. If true: next iteration
}       % Finally (execute at the end of the loop)
  @     %   Push k
  q     %   Subtract 1: gives k-1. This is the solution
        % End (implicit). Display (implicit)
Луис Мендо
источник
1
Подождите, древесный уголь победил MATL?
Нил
0

C # , 72 байта


Данные

  • Входные данные String i Массив int для расшифровки
  • Выходные данные Int32 Число, используемое для создания массива

Golfed

(string i)=>{int c,p=c=0;for(;p<i.Length;c++)p+=(c+"").Length;return c;}

Ungolfed

( string i ) => {
    int
        c,
        p = c = 0;

    for( ; p < i.Length; c++ )
        p += ( c + "" ).Length;

    return c;
}

Ungolfed читаемый

// Takes the string with the int array
( string i ) => {
    int
        c,         // Counter, it will count how many ints the array has.
        p = c = 0; // Padding, it will help jumping from int to int on the string.

    // Start counting. If 'i' is empty, the 'c' will be 0.
    for( ; p < i.Length; c++ )

        // Increase the number of digits with the length of 'c'.
        p += ( c + "" ).Length;

    // Return the counter.
    return c;
}

Полный код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestBench {
    public static class Program {
        private static Func<String, Int32> f = ( string i ) => {
            int
                c,
                p = c = 0;

            for( ; p < i.Length; c++ )
                p += ( c + "" ).Length;

            return c;
        };

        static void Main( string[] args ) {
            List<String>
                testCases = new List<String>() {
                    "0123",
                    "0",
                    "",
                    "0123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100",
                };

            foreach(String testCase in testCases) {
                Console.WriteLine($" Input: {testCase}\nOutput: {f(testCase)}\n");
            }

            Console.ReadLine();
        }
    }
}

релизы

  • v1.0 - 72 bytes- Исходное решение.

Заметки

  • Никто
auhmaan
источник
1
i=>{int c,p=c=0;for(;p<i.Length;)p+=(c+++"").Length;return c;}62 байта
TheLethalCoder
0

Ацето , 27 25 байт

1 основанный индекс.

;L[¥
`=]z
MLdI<
r!`;   p

Мы rчитаем ввод и Mзачаровываем его (и Lснова непосредственно добавляем), затем отрицаем его ( !; приводя к истинному значению только для пустой строки). Если это значение truey ( `), мы переходим к концу ( ;), где pнабираем неявный ноль.

В противном случае мы увеличиваем текущее значение стека (изначально ноль), дублируем его и помещаем одну копию в стек справа, а также перемещаемся туда ( Id]). Затем мы создаем убывающий диапазон ( z), объединяем стек как строку ( ¥) и снова перемещаем значение (и нас) в исходный стек ( [). Мы Lприсваиваем значение, которое мы запомнили ранее (вход), и сравниваем его с этой строкой. Если равно, мы снова прыгаем до конца, где печатаем текущее значение счетчика ( =`;).

Иначе, много пустого пространства пройдено до тех пор, пока кривая Гильберта в конечном итоге не достигнет точки, <которая Iснова ставит IP на вершину , увеличивая счетчик и снова тестируя.

L3viathan
источник