Скасуйте діапазон чисел


34

Досить просто nстворити діапазон від 0до , задавши число n-1. Насправді багато мов забезпечують цю операцію як вбудовану.

Наступна програма CJam зчитує ціле число, а потім виводить такий діапазон ( Спробуйте в Інтернеті! ):

ri,

Зверніть увагу, що він виводить цифри без роздільника.

Змагання

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

Технічні умови

  • Номери даються без роздільника.
  • Ви можете припустити, що рядок утворює допустимий діапазон.
  • Ви можете використовувати індексацію на основі 0 або 1 для свого діапазону.
  • Ви можете припустити, що правильний вихід ніколи не перевищить 32 767 (тому дійсний вхід ніколи не матиме довжини більше 152,725).
  • Ви можете припустити, що правильний вихід завжди буде позитивним (тому вам не доведеться обробляти 0 або мінус).

Це , тому найкоротша конкуруюча відповідь (вимірюється в байтах) виграє.

Випробування

0-індексовано:

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

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

1234 -> 4
1 -> 1
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 -> 100

Чи є низхідні діапазони? Чи потрібно працювати на від’ємні числа?
Даніель

@ Даніель Ні. Забув згадати про це; додано.
Esolanging Fruit

4
Чи справді наші програми потребують обробки порожнього рядка? Я думаю, було б доцільно дозволити нам ігнорувати це. Деякі відповіді взагалі не користуються цим правилом.
Містер Xcoder

Чи може висновок являти собою рядкове представлення числа, тобто взятого як підрядку з вихідного рядка?
користувач2390246

@ user2390246 Так, це добре.
Esolanging Fruit

Відповіді:




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

Я щось роблю не так? Це, здається, повертається 0незалежно від вводу: tio.run/##MzBNTDJM/f8/3efcdi/PbLv//5UMjYxNTM3MLSwNDZQA
Shaggy

@Shaggy: Ви повинні зробити це як це або це , як підраховувати одиничні лапки як частина вхідних даних.
Емінья

Ах, тож рядкові входи в 05AB1E потрібно потрійно цитувати?
Shaggy

@Shaggy: Якщо ви хочете порожній рядок або нові рядки у вводі так. Інакше це зовсім не потрібно цитувати.
Емінья

[NÝJQ#]Nбула моя ідея, але це краще, тому що це працює для "".
Magic Octopus Urn

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)


5

Japt , 8 байт

Початок стискатися з функціональними методами в Japt.

0-індексований. Може приймати введення як рядок, ціле число або масив, що містить 0 або 1 елемент.

_o ´U}a

Перевірте це


Пояснення

Неявне введення рядка U.

_     }a

Отримайте перше ціле число, >=0яке повертає справжнє значення при передачі через функцію, яка ...

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

Функція, яка обертає нульові діапазони.

Дякуємо Лайконі за збереження 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

Тестові справи


1
Знову ж, чи можете ви порівняти рядки лексикографічно?
Esolanging Fruit

Я збирався запропонувати приправи, але, схоже , це вже не консенсус :(
Shaggy


1
@EriktheOutgolfer Standard currying нормально, але Шаггі мав на увазі цю особливу форму currying, яка вимагає дзвінків, таких як f(payload_param)()або навіть f(payload_param)(some_constant). (До речі, я не впевнений, що це спрацює в цьому конкретному випадку, тому що мені потрібно і те, rі nініціалізація.)
Арнольд

2

Математика, 46 байт

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

1-індексований

вхід

["12345678910"]


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, хоча це зробить його ще більш повільним. Зазвичай це нормально і часто економить кілька байт, щоб використовувати анонімні лямбдати для відповідей Рубі: Спробуйте в Інтернеті! (Я змінив ліміт на 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)

Спробуйте в Інтернеті!


Пітон , 46 байт

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

Спробуйте в Інтернеті!

Інша стратегія. Бере кількість символів з кінця, що дорівнює довжині найбільшого пробігу 0s в s.


Пітон , 46 байт

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

Спробуйте в Інтернеті!

Рекурсивна версія вищезазначеного.


Чи працює ваша "інша стратегія" (дуже розумна, допитлива) для діапазонів на основі 0, як це вимагається в заяві про виклик? Чи слід змінити внутрішній біт на ... i*'0'in s[1:] for ...щось подібне?
Лука Сіті

@LucaCiti Він працює для 1-го діапазону, і виклик дозволяє нам обирати.
xnor

Звичайно, ви праві. Я лише переглянув початковий опис і пропустив частину, де це дозволяє для 1-го діапазону.
Лука Сіті

2

R , 47 байт

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

Спробуйте в Інтернеті!

1-індексований


3
Використовуйте "if"замістьifelse
Джузеппе

Влучне зауваження! Але ОП тепер зняла вимогу розібратися зі справою 0, тому я можу позбутися цього біта цілком ...
user2390246

1
Ви можете приймати введення як число, як ncharпрацює, як ви могли очікувати на числах. Однак вам потрібно обробити друк результатів, оскільки це не стане, коли виконується як повноцінна програма.
JAD

1
n=nchar(scan());cat(which(cumsum(nchar(1:n))==n))
JAD

2

APL (Dyalog) , 17 11 байт

-6 байт завдяки ngn .

{,\⍕¨⍳≢⍵}⍳⊂

Спробуйте в Інтернеті!

⍳⊂ знайдіть ɩ ndex всього аргументу в

{} Результат цієї анонімної функції:

 тривалість аргументу

ɩ номери до цього

⍕¨ формат (раціоналізувати) кожен

,\ кумулятивна конкатенація цих


О, я забув, що я міг просто піти з тривалої, приємної роботи.
Zacharý

{,\⍕¨⍳≢⍵}⍳⊂(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-індексованим ... Дякую!
Дом Гастінгс




1

Perl 6 ,  30 28  27 байт

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

Перевірте це

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

Перевірте це

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

Перевірте це

Розширено:

{  # 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"
...

Зауважте, що цей код ніколи не припиниться, якщо ви дасте йому недійсний ввід.


1

Pyth , 11 10 байт

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

fqQ|jkSTk0

Спробуйте тут

Якщо порожній рядок можна ігнорувати, це може бути скорочено до 6 байт :

fqQjkS

-1 байт завдяки @Mnemonic


?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

1

Dyvil , 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байти, використовуючи вираження доступу дужки замість змінної для акумулятора

Класна мова !!
Роберт Фрейзер

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 Кількість, яка використовується для створення масиву

Гольф

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

Безумовно

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

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

    return c;
}

Незрозумілий читабельний

// 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- Початкове рішення.

Примітки

  • Немає

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

Ми ead rвхід і Mеморізувати його (і безпосередньо Lзнову оад), а потім заперечуємо його ( !; веде до значення truthy тільки для порожнього рядка). Якщо це значення truthy ( `), ми переходимо до кінця (; ), де ми pвводимо неявний нуль.

В іншому випадку ми збільшуємо поточне значення стека (спочатку нуль), дублюємо його і ставимо одну копію на стек праворуч, одночасно переміщуючись туди ( Id]). Потім ми побудуємо зменшуючий діапазон ( z), з'єднаємо стек як рядок ( ¥) і знову перемістимо значення (і нас) на початковий стек ( [). МиL зменшуємо значення, яке ми запам'ятали раніше (вхід), і порівнюємо його з цим рядком. Якщо дорівнює, ми знову переходимо до кінця, де друкуємо поточне значення "лічильника" (=`; ).

Інакше проходить багато порожнього простору, поки крива Гільберта врешті-решт не потрапить на те, <що ставить IP Iзнову на вершину , збільшуючи лічильник і тестуючи знову.



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