Bir Sayı Aralığını Geri Al


34

Bu oldukça basit bir numara verilir n, bir dizi oluşturmak 0için n-1. Aslında, birçok dil bu işlemi yerleşik olarak sağlar.

Aşağıdaki CJam programı bir tamsayı okur ve sonra böyle bir aralığı yazdırır ( Çevrimiçi deneyin! ):

ri,

Ayırıcı olmadan sayıları yazdırdığına dikkat edin .

Meydan okuma

Görevin bu süreci tersine çevirmek. Bir aralığı temsil eden bir dize verildiğinde, bu aralığı üretmek için kullanılan sayıyı döndüren bir program yazmalısınız.

Özellikler

  • Rakamlar herhangi bir ayırıcı olmadan verilir.
  • Dize geçerli bir aralık oluşturduğunu varsayabilirsiniz.
  • Menziliniz için 0- veya 1 tabanlı indeksleme kullanabilirsiniz.
  • Doğru bir çıkışın asla 32.767'yi aşmayacağını varsayabilirsiniz (bu nedenle geçerli bir giriş asla 152.725'ten daha uzun olamaz).
  • Doğru bir çıkışın her zaman pozitif olacağını varsayabilirsiniz (bu nedenle 0 veya negatif ile işlem yapmanıza gerek yoktur).

Bu , bu nedenle en kısa sürede cevap veren (byte olarak ölçülen) kazanır.

Test Kılıfları

0 endeksli:

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

1 endeksli:

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

Azalan aralıklar var mı? Negatif sayılar için çalışması gerekiyor mu?
Daniel

@ Daniel Hayır. Söylemeyi unuttum; katma.
Esolanging Fruit,

4
Programlarımızın gerçekten boş dizgiyi kullanması gerekiyor mu? Bunu görmezden gelmemize izin vermenin makul olacağını düşünüyorum. Bazı cevaplar bu kuraldan hiçbir şekilde faydalanmıyor.
Bay Xcoder

Çıktı, örneğin orijinal dizeden bir alt dize olarak alınan sayının dizgi gösterimi olabilir mi?
user2390246

@ user2390246 Evet, sorun değil.
Esolanging Fruit,

Yanıtlar:



11

Kabuğu , 5 bayt

LCmLN

Çevrimiçi deneyin!

Sadece harfler!

Dizge olarak girdi alır, sonuç 1 dizinlidir.

açıklama

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 bayt

1 endeksli.

āηJsk>

Çevrimiçi deneyin! veya Test Paketi olarak

açıklama

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

Yanlış bir şey mi yapıyorum? Bu 0girdi ne olursa olsun geri dönüyor gibi görünüyor : tio.run/##MzBNTDJM/f8/3efcdi/PbLv//5UMjYxNTM3MLSwNDZQA
Shaggy

@Shaggy: Sen gibi yapmak zorunda bu ya bu tek tırnak giriş parçası olarak sayarken.
Emigna

Ah, bu yüzden 05AB1E'deki dize girişlerinin üçlü alıntı yapılması gerekir.
Shaggy

@Shaggy: Girişte boş dizgiyi veya yeni satırları istiyorsanız, evet. Aksi takdirde, hiçbir şekilde alıntı yapmanız gerekmez.
Emigna

[NÝJQ#]Nbenim fikrimdi ama bu daha iyi çünkü işe yarıyor "".
Magic Octopus Urn

7

Java 8, 66 59 bayt

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

0 endeksli

@ PunPun1000 sayesinde -7 bayt .

Girişin her zaman geçerli olduğunu varsayacağımız için girişin uzunluğunu yalnızca bir şekilde kontrol ederek bunun kısaltılabileceğini hissediyorum. Hala bunu çözüyorum. Bunu çözememek mümkün ve muhtemelen Java'da yine de faydalı olması için çok fazla bayta mal olacak (aynı, 1 indeksli bir girişin sonunun alt dizesini döndürmek için de geçerlidir).

Açıklama:

Burada dene.

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

Muhtemelen, sayıları saymak ya da gerekli altlığın uzunluğunu almak için uzunluk logaritmasını kullanmak gibi saçma bir kısayol var. Bunun için sadece kötü fikirlerim var.
JollyJoker

6

Brachylog , 9 7 bayt

⟦kṫᵐc,Ẹ

Çevrimiçi deneyin!

0 endeksli.

açıklama

Burada girdiyi Output değişkeninden geçirir ve sonuca Input değişkeninden erişiriz.

⟦          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 bayt

Japt'ta fonksiyon metodları ile baş etmeye başlıyorum.

0 endeksli. Bir dize, bir tam sayı veya 0 veya 1 öğe içeren bir dizi girişi alabilir.

_o ´U}a

Dene


açıklama

Dizenin örtük girişi U.

_     }a

>=0Bir fonksiyondan geçildiğinde doğru olan ilk tamsayıyı al ...

o

0Geçerli tam sayıdan 1 ile 1 arasında bir tam sayı dizisi oluşturur ...

¬

Bir dizeye katılır ...

¥U

Bu dize ile eşitlik için denetler U.

Sonuç tamsayısının örtük çıktısı.


Alternatif, 8 bayt

ÊÇo ¬ÃbU

Dene


4

Kömür , 13 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

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

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

Sıfır tabanlı aralıkları tersine çeviren işlev.

3 byte kaydettiğin için Laikoni'ye teşekkürler!

Çevrimiçi deneyin.


1
37 listesi anlayışı ile bayt: f s=[n|n<-[0..],(show=<<[0..n])>s]!!0.
Laikoni

1
Ve sadece ikinci desen görevlisi kullanarak bir bayt kaydedebilir, bunu söz: |m<-n+1=s!m.
Laikoni,


2

JavaScript (ES6), 32 31 bayt

Challenger5 sayesinde 1 bayt kaydedildi

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

Test durumları


1
Yine, dizeleri sözlüksel olarak karşılaştırabilir misiniz?
Esolanging Fruit

Currying'i önerecektim ama artık bir fikir birliği gibi görünmüyor :(
Shaggy

1
@Shaggy Umm, aslında ...
Outgolfer Erik,

1
@EriktheOutgolfer Standart tımar iyi, ama Shaggy atıfta -işlemden bu özel formu gibi telefon aramalarını f(payload_param)()hatta f(payload_param)(some_constant). (Bu arada, ben de ihtiyacım var çünkü bu özel durumda çalışacak emin değilim rve nbaşlatılması için.)
Arnauld

2

Mathematica, 46 bayt

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

1 endeksli

giriş

[ "12345678910"]


2

Ruby , 51 50 46 bayt

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

(Bu benim ilk Ruby programım, bu yüzden daha fazla golf oynamak kolay olmalı)

@Nnnes sayesinde -4 bayt


1
Son parantez kümesine ihtiyacınız yok: .index(gets)=> .index gets. Bunun 4e4yerine kullanabilirsiniz 8**5, bu daha yavaş çalışmasına rağmen. Genelde tamamdır ve Ruby cevapları için anonim lambdaları kullanmak için genellikle bir kaç bayt kazandırır: Çevrimiçi deneyin! (Limiti 100 olarak değiştirdim, böylece zaman aşımına
uğramaz

2

Python 2 , 43 bayt

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

Çevrimiçi deneyin!


Python 2 , 43 bayt

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

Çevrimiçi deneyin!


Python , 46 bayt

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

Çevrimiçi deneyin!

Farklı bir strateji. Uçtan s cinsinden en büyük koşunun uzunluğuna eşit sayıda karakter alır 0.


Python , 46 bayt

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

Çevrimiçi deneyin!

Yukarıdakilerin özyinelemeli versiyonu.


"Farklı stratejiniz" (çok zekice, btw), zorluk beyanında belirtildiği gibi 0 tabanlı aralıklar için çalışıyor mu? İç kısmını değiştirmeli ... i*'0'in s[1:] for ...mi yoksa böyle bir şey mi?
Luca Citi

@ LucaCiti 1 tabanlı aralıklar için çalışır ve zorluk bizi seçmemize izin verir.
xnor

Tabii haklısın. Sadece ilk açıklamaya baktım ve 1 tabanlı aralıklar için izin verdiği kısmı özledim.
Luca Citi

2

R , 47 bayt

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

Çevrimiçi deneyin!

1 endeksli


3
Yerine "if"kullanınifelse
Giuseppe

İyi bir nokta! Ama OP şimdi ... tamamen o bit kurtulmak, böylece 0 dava ile uğraşmak şartını kaldırmıştır
user2390246

1
Girdiyi nchar, sayılarda beklediğiniz gibi çalıştığı gibi sayı olarak alabilirsiniz. Ancak, çıktılarınızı yazdırmanız gerekir çünkü bu tam bir program olarak çalıştığında olmaz.
JAD

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

2

APL (Dyalog) , 17 11 bayt

-Ygn sayesinde 6 bayt .

{,\⍕¨⍳≢⍵}⍳⊂

Çevrimiçi deneyin!

⍳⊂ bulmak ɩTüm argümanın .

{} Bu isimsiz işlevin sonucu:

 argümanın uzunluğu

untiltegers o zamana kadar

⍕¨ her birini biçimlendir (dize)

,\ bunların kümülatif bitiştirilmesi


Oh, unutmuşum, uzağa gidebilirim, iyi iş.
Zacharý,

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

@ngn Aptal ben. Tabii ki!
Adám,

2

Perl 5 , 19 bayt

İçin 18 bayt kodu + 1 -p.

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

1 tabanlı indeksleme kullanır. @ Nwellnhof 'un çok daha iyi bir yaklaşımı sayesinde -7 bayt !

Çevrimiçi deneyin!

açıklama

$\printher bir ifadeden sonra otomatik olarak girilen özel bir değişkendir; bu nedenle, numaramızı saklamak için kullanarak , istenen çıktıyı içerecek şekilde güncellememiz gerekir $_(otomatik olarak -pbayrağın işlevinin bir parçası olarak basılır ). Ardından, giriş başladığında $\, onu kaldırın ve redoprogramı tekrar yükseltir $\ve değiştirir. Dizenin başındaki sayıyı artık bulamadığında, bittik! Son olarak, azalış, $\bu yüzden aralıktaki son sayıya sahibiz.


Peki ya $i++while s/$i\B//(18 + 1 bayt)?
nwellnhof

@nwellnhof Bu çok daha iyi! Her şeyden önce 0 indeksli cevabı verdiğimden daha karmaşık bir yoldan başladığımı düşünüyorum ... Teşekkürler!
Dom Hastings,



1

CJam , 13 bayt

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

Çok virgül ...

Çevrimiçi deneyin!

açıklama

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 bayt

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

Dene

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

Dene

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

Dene

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...*değerlerin sonsuz bir dizi üreten '', 0, 1, 2,3 ...

[\~] '',0...* olası tüm girdilerin sonsuz bir dizisini üretir

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

Geçersiz bir giriş yaparsanız bu kodun asla durmayacağını unutmayın.


1

Pyth , 11 10 bayt

1 endeksli.

fqQ|jkSTk0

Burada dene

Boş dize göz ardı edilebilirse, bu 6 bayta kısaltılabilir :

fqQjkS

@Mnemonic sayesinde -1 bayt


?QfqQjkUT)111 de yapabilir, ancak bazı yeniden sıralama bir bayt kapalı golf olabilir gibi hissediyorum. Herhangi bir fikir?
Dave

Bir bayt'ı jks'm yerine kullanarak kaydedebilirsiniz.
Anma

1

CJam, 14 12 11 bayt

q,_){,s,}%#

Çevrimiçi Deneyin

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 bayt

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

Bu Java cevabıyla aynı algoritma , (ab) Dyvil'in sözdizimsel özelliklerinden bazılarını kullanması dışında.

Açıklama:

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

  • 4Akümülatör için bir değişken yerine bir ayraç erişim ifadesi kullanarak kaydedilmiş baytlar

Harika dil !!
Robert Fraser,

0

MATL , 14 bayt

`@q:VXzGX=~}@q

1 endeksli.

Çevrimiçi deneyin!

açıklama

`       % 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
Bekle, Kömür MATL yendi?
Neil

0

C # , 72 bayt


Veri

  • Giriş String i Deşifre edilecek int dizisi
  • Çıktı Int32 Dizi yapmak için kullanılan sayı

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 okunabilir

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

Tam kod

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

Bültenleri

  • v1.0 - 72 bytes- İlk çözüm.

notlar

  • Yok

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

0

SOGL V0.12 , 11 10 9 bayt

1 endeksli.

I∫HΔ∑=?f←

Burada dene!

Açıklama:

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

..veya boş kutu olmadan 7 bayt

∫Δ∑=?F←

Burada dene!


0

Aseto , 27 25 bayt

1 tabanlı dizin.

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

Biz rgirdi EAD ve Monu emorize (ve doğrudan L(daha sonra biz onu boşa tekrar OAD) !, sadece boş bir dize için truthy değere yol açan). Eğer bu değer truthy ( `) ise, sonuna atlarız (; )p örtülü sıfır Rint.

Aksi takdirde, geçerli yığın değerini artırır (başlangıçta sıfır), çoğaltır ve orada da hareket ettirirken bir kopyayı sağa koyarız ( Id]). Daha sonra azalan bir aralık ( z) oluştururuz, yığını bir dizge ( ¥) olarak birleştiririz ve değeri (ve bizi) tekrar orijinal yığında ( [) hareket ettiririz . Daha Lönce ezberlediğimiz değeri (girdi) ödedik ve bu dizeyle karşılaştırdık. Eşitse, geçerli "sayaç" değerini ( =`;) bastığımız yere tekrar atlarız .

Aksi halde, Hilbert eğrisi en sonunda <IP'yi Itekrar üste koyana kadar çarpar , sayacı yükseltir ve tekrar test eder.



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.