Batalkan Rentang Angka


34

Ini cukup sederhana untuk, mengingat angka n, membuat rentang dari 0hingga n-1. Bahkan, banyak bahasa menyediakan operasi ini sebagai builtin.

Program CJam berikut membaca bilangan bulat, dan kemudian mencetak kisaran seperti itu ( Coba online! ):

ri,

Perhatikan bahwa ia mencetak angka tanpa pemisah.

Tantangan

Tugas Anda adalah membalik proses ini. Anda harus menulis sebuah program yang, dengan string yang mewakili suatu rentang, mengembalikan angka yang digunakan untuk menghasilkan rentang itu.

Spesifikasi

  • Angka-angka diberikan tanpa pemisah apa pun.
  • Anda dapat menganggap string membentuk rentang yang valid.
  • Anda dapat menggunakan pengindeksan berbasis 0 atau 1 untuk rentang Anda.
  • Anda dapat berasumsi bahwa output yang benar tidak akan pernah melebihi 32.767 (jadi input yang valid tidak akan pernah memiliki panjang lebih besar dari 152.725).
  • Anda dapat berasumsi bahwa output yang benar akan selalu positif (sehingga Anda tidak harus menangani 0 atau negatif).

Ini adalah , sehingga jawaban bersaing terpendek (diukur dalam byte) menang.

Uji Kasus

Diindeks 0:

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

1-diindeks:

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

Apakah ada rentang menurun? Apakah perlu untuk angka negatif?
Daniel

@Aniel No. Lupa menyebutkan itu; ditambahkan.
Buah Esolanging

4
Apakah program kami benar-benar perlu menangani string kosong? Saya pikir masuk akal untuk membiarkan kita mengabaikannya. Beberapa jawaban tidak mendapat manfaat dari aturan itu sama sekali.
Tn. Xcoder

Bisakah output menjadi representasi string dari nomor yaitu diambil sebagai substring dari string asli?
user2390246

@ user2390246 Ya, tidak apa-apa.
Buah Esolanging

Jawaban:



11

Sekam , 5 byte

LCmLN

Cobalah online!

Hanya surat!

Mengambil input sebagai string, hasilnya 1-diindeks.

Penjelasan

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 byte

1-diindeks.

āηJsk>

Cobalah online! atau sebagai Test Suite

Penjelasan

ā        # 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

Apakah saya melakukan sesuatu yang salah? Ini tampaknya mengembalikan 0tidak peduli input: tio.run/##MzBNTDJM/f8/3efcdi/PbLv//5UMjYxNTM3MLSwNDZQA
Shaggy

@Shaggy: Anda harus melakukannya seperti ini atau ini sebagai tanda kutip tunggal dihitung sebagai bagian dari input.
Emigna

Ah, jadi input string di 05AB1E harus dikutip tiga kali lipat?
Shaggy

@Shaggy: Jika Anda ingin string kosong atau baris baru di input ya. Kalau tidak, Anda tidak perlu mengutipnya sama sekali.
Emigna

[NÝJQ#]Nadalah ide saya, tetapi ini lebih baik karena berfungsi untuk "".
Magic Octopus Mm

7

Java 8, 66 59 byte

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

Diindeks 0

-7 byte terima kasih kepada @ PunPun1000 .

Saya merasa ini dapat dipersingkat dengan hanya memeriksa panjang input, karena kita dapat menganggap input selalu valid. Masih mencari tahu ini. Tidak dapat mengetahuinya, dan mungkin akan memakan biaya terlalu banyak byte di Jawa untuk berguna (hal yang sama berlaku untuk mengembalikan substring pada akhir input yang diindeks 1).

Penjelasan:

Coba di sini.

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 byte: TIO
PunPun1000

Mungkin ada beberapa jalan pintas yang tidak masuk akal seperti menghitung jumlah yang atau menggunakan logaritma panjang untuk mendapatkan panjang substring yang dibutuhkan ... Saya sepertinya hanya punya ide buruk untuk ini.
JollyJoker

6

Brachylog , 9 7 byte

⟦kṫᵐc,Ẹ

Cobalah online!

Diindeks 0.

Penjelasan

Di sini kita melewatkan input melalui variabel Output, dan mengakses hasilnya melalui variabel 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 byte

Mulai untuk memahami metode fungsi di Japt.

Diindeks 0. Dapat mengambil input sebagai string, integer atau array yang mengandung 0 atau 1 elemen.

_o ´U}a

Menguji


Penjelasan

Input string yang tersirat U.

_     }a

Dapatkan bilangan bulat pertama >=0yang mengembalikan true ketika melewati fungsi yang ...

o

Menghasilkan array bilangan bulat dari 0ke 1 kurang dari bilangan bulat saat ini ...

¬

Bergabung ke string ...

¥U

Memeriksa string untuk kesetaraan dengan U.

Output implisit bilangan bulat yang dihasilkan.


Alternatif, 8 byte

ÊÇo ¬ÃbU

Menguji


4

Arang , 13 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

          λ     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 byte

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

Fungsi yang membalikkan rentang berbasis nol.

Terima kasih kepada Laikoni karena telah menghemat 3 byte!

Cobalah online.


1
37 byte dengan daftar pemahaman: f s=[n|n<-[0..],(show=<<[0..n])>s]!!0.
Laikoni

1
Dan hanya untuk menyebutkan itu, Anda dapat menyimpan byte dengan menggunakan penjaga pola kedua: |m<-n+1=s!m.
Laikoni


2

JavaScript (ES6), 32 31 byte

Disimpan 1 byte berkat Challenger5

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

Uji kasus


1
Sekali lagi, dapatkah Anda membandingkan string secara leksikografis?
Buah Esolanging

Saya akan menyarankan kari tapi sepertinya itu tidak lagi konsensus :(
Shaggy

1
@ Shaggy Umm, sebenarnya ...
Erik the Outgolfer

1
@EriktheOutgolfer Standard currying baik-baik saja, tetapi Shaggy merujuk pada bentuk khusus currying ini yang membutuhkan panggilan seperti f(payload_param)()atau bahkan f(payload_param)(some_constant). (Kebetulan, saya tidak yakin itu akan berhasil dalam kasus khusus ini karena saya perlu keduanya rdan ndiinisialisasi.)
Arnauld

2

Mathematica, 46 byte

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

1-diindeks

memasukkan

["12345678910"]


2

Ruby , 51 50 46 byte

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

(Ini adalah program Ruby saya yang pertama sehingga mudah untuk golf lebih jauh)

-4 byte terima kasih kepada @Nnnes


1
Anda tidak memerlukan set kurung terakhir: .index(gets)=> .index gets. Anda dapat menggunakannya 4e4sebagai gantinya 8**5, meskipun ini akan membuatnya berjalan lebih lambat. Secara umum OK, dan sering menghemat beberapa byte, untuk menggunakan lambda anonim untuk jawaban Ruby: Coba online! (Saya mengubah batas ke 100 sehingga tidak ada batas waktu.)
Nnnes

2

Python 2 , 43 byte

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

Cobalah online!


Python 2 , 43 byte

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

Cobalah online!


Python , 46 byte

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

Cobalah online!

Strategi yang berbeda. Membawa sejumlah karakter dari akhir sama dengan panjang run terbesar 0di.


Python , 46 byte

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

Cobalah online!

Versi rekursif di atas.


Apakah "strategi berbeda" Anda (sangat pintar, btw) bekerja untuk rentang berbasis 0 seperti yang diperlukan dalam pernyataan tantangan? Haruskah Anda mengubah bit bagian dalam ... i*'0'in s[1:] for ...atau sesuatu seperti itu?
Luca Citi

@LucaCiti Ini berfungsi untuk rentang berbasis 1, dan tantangannya memungkinkan kita memilih.
xnor

Tentu Anda benar. Saya hanya melihat deskripsi awal dan melewatkan bagian yang memungkinkan rentang berbasis 1.
Luca Citi

2

R , 47 byte

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

Cobalah online!

1-diindeks


3
Gunakan "if"sebagai gantiifelse
Giuseppe

Poin bagus! Tapi OP sekarang telah menghapus persyaratan untuk menangani 0 case, jadi saya dapat membuang bit itu sepenuhnya ...
user2390246

1
Anda dapat mengambil input sebagai angka, ncharberfungsi seperti yang Anda harapkan pada angka. Namun, Anda perlu menangani pencetakan output Anda, karena ini tidak akan ketika dijalankan sebagai program lengkap.
JAD

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

2

APL (Dyalog) , 17 11 byte

-6 byte terima kasih kepada ngn .

{,\⍕¨⍳≢⍵}⍳⊂

Cobalah online!

⍳⊂ temukan ɩ ndex dari seluruh argumen dalam

{... } hasil dari fungsi anonim ini:

 panjang argumen

eg ntegers sampai itu

⍕¨ format (stringify) masing-masing

,\ gabungan kumulatif dari mereka


Oh, aku lupa aku bisa menyelesaikan pekerjaan yang bagus.
Zacharý

{,\⍕¨⍳≢⍵}⍳⊂(11 karakter)
ngn

@ ngn aku konyol. Tentu saja!
Adám

2

Perl 5 , 19 byte

Kode 18 byte +1 untuk -p.

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

Menggunakan pengindeksan berbasis 1. -7 byte berkat @ nwellnhof 's banyak lebih baik pendekatan!

Cobalah online!

Penjelasan

$\adalah variabel khusus yang printdiedit secara otomatis setelah setiap pernyataan, jadi dengan menggunakannya untuk menyimpan nomor kita, kita tidak perlu memperbarui $_(yang secara otomatis dicetak sebagai bagian dari fungsi -pflag) untuk mengandung output yang diinginkan. Kemudian, sementara input dimulai dengan $\, hapus dan redoprogram, yang lagi menambah $\dan menggantinya. Ketika tidak lagi menemukan nomor di awal string, kita selesai! Akhirnya, pengurangan $\jadi kami memiliki angka terakhir dalam kisaran.


Bagaimana dengan $i++while s/$i\B//(18 + 1 byte)?
nwellnhof

@wellwell Itu jauh lebih baik! Saya pikir saya mulai menyusuri rute yang lebih kompleks ketika saya membuat jawaban 0-diindeks pertama-tama ... Terima kasih!
Dom Hastings



1

CJam , 13 byte

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

Begitu banyak koma ...

Cobalah online!

Penjelasan

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 byte

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

Menguji

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

Menguji

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

Menguji

Diperluas:

{  # 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...*menghasilkan urutan yang tak terbatas dari nilai-nilai '', 0, 1, 2, 3...

[\~] '',0...* menghasilkan urutan tak terbatas dari semua input yang mungkin

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

Perhatikan bahwa kode ini tidak akan pernah berhenti jika Anda memberikan input yang tidak valid.


1

Pyth , 11 10 byte

1-diindeks.

fqQ|jkSTk0

Coba di sini

Jika string kosong dapat diabaikan, ini dapat disingkat menjadi 6 byte :

fqQjkS

-1 byte berkat @Mnemonic


?QfqQjkUT)1dapat melakukannya di 11 juga, tapi saya merasa seperti pemesanan ulang bisa golf dari byte. Ada ide?
Dave

Anda dapat menyimpan byte dengan menggunakan jkalih-alih s`m.

1

CJam, 14 12 11 byte

q,_){,s,}%#

Cobalah secara Online

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 byte

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

Algoritma yang sama dengan jawaban Java ini , kecuali itu (ab) menggunakan beberapa spesialisasi sintaksis Dyvil.

Penjelasan:

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

  • 4Bytes yang disimpan dengan menggunakan ekspresi akses penjepit, bukan variabel untuk akumulator

Bahasa keren !!
Robert Fraser

0

MATL , 14 byte

`@q:VXzGX=~}@q

1-diindeks.

Cobalah online!

Penjelasan

`       % 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
Tunggu, Arang mengalahkan MATL?
Neil

0

C # , 72 byte


Data

  • Input String i Array int yang akan diuraikan
  • Output Int32 Jumlah yang digunakan untuk membuat array

Golf

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

Tidak disatukan

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

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

    return c;
}

Tidak terbaca dibaca

// 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;
}

Kode lengkap

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();
        }
    }
}

Rilis

  • v1.0 - 72 bytes- Solusi awal.

Catatan

  • Tidak ada

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

0

SOGL V0.12 , 11 10 9 byte

1-diindeks.

I∫HΔ∑=?f←

Coba Di Sini!

Penjelasan:

I∫         repeat input+1 times
  HΔ         create a range from 1 to the 0-indexed iteration, inclusive
    ∑        join it
     =?      if it's equal to the input
       f←      exit, pushing the 0-indexed counter

..atau 7 byte tanpa kasing kosong

∫Δ∑=?F←

Coba Di Sini!


0

Aceto , 27 25 byte

Indeks berbasis 1.

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

Kami rmenghasilkan input dan Mmengemorasinya (dan langsung mem -input- kannya L), lalu kami meniadakannya ( !; mengarah ke nilai yang sebenarnya hanya untuk string kosong). Jika nilai ini benar ( `), kami melompat ke akhir (; ), di mana kitap mematahkan nol implisit.

Jika tidak, kami menambah nilai tumpukan saat ini (awalnya nol), menduplikatnya, dan meletakkan satu salinan di tumpukan di sebelah kanan, sementara juga memindahkannya ke sana ( Id]). Kami kemudian membangun rentang menurun ( z), bergabung dengan tumpukan sebagai string ( ¥), dan memindahkan nilai (dan kami) pada tumpukan asli lagi ( [). Kami Lmemiliki nilai yang kami hafal sebelumnya (input) dan membandingkannya dengan string ini. Jika sama, kita melompat ke ujung lagi, tempat kita mencetak nilai "penghitung" saat ini ( =`;).

Jika tidak, banyak ruang kosong dilalui hingga kurva Hilbert akhirnya menyentuh <yang menempatkan IP di atas Ilagi, menambah penghitung dan menguji lagi.



Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.