Zahlenbereich rückgängig machen

34

Es ist ziemlich einfach, bei einer bestimmten Zahl neinen Bereich von 0bis zu erstellen n-1. Tatsächlich bieten viele Sprachen diese Operation als eingebaut an.

Das folgende CJam-Programm liest eine Ganzzahl und druckt dann einen solchen Bereich aus ( Online ausprobieren ! ):

ri,

Beachten Sie, dass Zahlen ohne Trennzeichen ausgedruckt werden.

Die Herausforderung

Ihre Aufgabe ist es, diesen Prozess umzukehren. Sie sollten ein Programm schreiben, das anhand einer Zeichenfolge, die einen Bereich darstellt, die Zahl zurückgibt, mit der dieser Bereich erstellt wurde.

Spezifikationen

  • Die Zahlen sind ohne Trennzeichen angegeben.
  • Sie können davon ausgehen, dass die Zeichenfolge einen gültigen Bereich bildet.
  • Sie können eine 0- oder 1-basierte Indizierung für Ihren Bereich verwenden.
  • Sie können davon ausgehen, dass eine korrekte Ausgabe niemals 32.767 überschreitet (eine gültige Eingabe hat also niemals eine Länge von mehr als 152.725).
  • Sie können davon ausgehen, dass eine korrekte Ausgabe immer positiv ist (Sie müssen also nicht mit 0 oder negativ umgehen).

Dies ist , also gewinnt die kürzeste konkurrierende Antwort (gemessen in Bytes).

Testfälle

0-indiziert:

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

1-indiziert:

1234 -> 4
1 -> 1
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 -> 100
Esolanging Fruit
quelle
Gibt es absteigende Bereiche? Muss es für negative Zahlen funktionieren?
Daniel
@ Daniel Nein. Ich habe vergessen, das zu erwähnen. hinzugefügt.
Esolanging Fruit
4
Müssen unsere Programme wirklich mit dem leeren String umgehen? Ich denke, es wäre vernünftig, uns zu erlauben, das zu ignorieren. Einige Antworten profitieren überhaupt nicht von dieser Regel.
Mr. Xcoder
Kann die Ausgabe eine Zeichenfolgendarstellung der Zahl sein, dh als Teilzeichenfolge aus der ursprünglichen Zeichenfolge übernommen?
user2390246
@ user2390246 Ja, das ist in Ordnung.
Esolanging Fruit

Antworten:

11

Prolog (SWI) , 91 bis 80 Bytes

0-indiziert.

X*L:-atom_length(X,L),
     between(0,L,Y),
     numlist(0,Y,B),
     atomic_list_concat(B,X)
     ;L=0.

Zeilenumbrüche zur besseren Lesbarkeit hinzugefügt.

Probieren Sie es online!

Emigna
quelle
11

Schale , 5 Bytes

LCmLN

Probieren Sie es online!

Nur Buchstaben!

Nimmt die Eingabe als String, das Ergebnis ist 1-indiziert.

Erläuterung

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
Löwe
quelle
8

05AB1E , 7 6 Bytes

1-indiziert.

āηJsk>

Probieren Sie es online! oder als Testsuite

Erläuterung

ā        # 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
quelle
Mache ich etwas falsch? Dies scheint 0unabhängig von der Eingabe zurückzugeben: tio.run/##MzBNTDJM/f8/3efcdi/PbLv//5UMjYxNTM3MLSwNDZQA
Shaggy
@Shaggy: Du musst es so oder so machen, da einfache Anführungszeichen als Teil der Eingabe zählen.
Emigna
Ah, also müssen String-Eingänge in 05AB1E mit dreifachen Anführungszeichen versehen werden?
Shaggy
@Shaggy: Wenn Sie die leere Zeichenfolge oder Zeilenumbrüche in der Eingabe ja möchten. Ansonsten brauchen Sie es gar nicht zu zitieren.
Emigna
[NÝJQ#]Nwar meine Idee, aber das ist besser, weil es funktioniert "".
Magic Octopus Urn
7

Java 8, 66 59 Bytes

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

0-indiziert

-7 Bytes dank @ PunPun1000 .

Ich habe das Gefühl, dass dies verkürzt werden kann, indem nur die Länge der Eingabe überprüft wird, da davon ausgegangen werden kann, dass die Eingabe immer gültig ist. Ich finde das immer noch heraus. Kann dies nicht herausfinden, und es wird wahrscheinlich zu viele Bytes in Java kosten, um trotzdem nützlich zu sein (dasselbe gilt für die Rückgabe eines Teilstrings am Ende einer 1-indizierten Eingabe).

Erläuterung:

Probieren Sie es hier aus.

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
Kevin Cruijssen
quelle
1
59 Bytes: TIO
PunPun1000
Es gibt wahrscheinlich eine absurde Abkürzung wie das Zählen der Anzahl von Einsen oder das Verwenden des Logarithmus der Länge, um die Länge des benötigten Teilstrings zu erhalten ... Ich scheine nur schlechte Ideen dafür zu haben.
JollyJoker
6

Brachylog , 9 7 Bytes

⟦kṫᵐc,Ẹ

Probieren Sie es online!

0-indiziert.

Erläuterung

Hier übergeben wir die Eingabe über die Variable Output und greifen über die Variable Input auf das Ergebnis zu.

⟦          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)
Tödlich
quelle
5

Ly , 29 Bytes

iys&p>0<11[ppl>s1+<lfspSylL]>

Probieren Sie es online!

Ich kann nicht glauben, dass dies so gut funktioniert hat wie es ...

Textlich
quelle
5

Japt , 8 Bytes

Beginnend mit Funktionsmethoden in Japt.

0-indiziert. Kann Eingaben als Zeichenfolge, Ganzzahl oder Array mit 0 oder 1 Elementen annehmen.

_o ´U}a

Probier es aus


Erläuterung

Implizite Eingabe eines Strings U.

_     }a

Ruft die erste Ganzzahl ab >=0, die true zurückgibt, wenn sie eine Funktion durchläuft, die ...

o

Erzeugt ein Array von ganzen Zahlen von 0bis 1 weniger als die aktuelle ganze Zahl ...

¬

Verbindet es mit einer Schnur ...

¥U

Überprüft diese Zeichenfolge auf Gleichheit mit U.

Implizite Ausgabe der resultierenden Ganzzahl.


Alternativ 8 Bytes

ÊÇo ¬ÃbU

Probier es aus

Zottelig
quelle
4

Kohle , 13 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

          λ     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
Neil
quelle
4

Haskell, 40 37 Bytes

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

Funktion, die nullbasierte Bereiche umkehrt.

Danke an Laikoni für das Speichern von 3 Bytes!

Probieren Sie es online aus.

Cristian Lupascu
quelle
1
37 Bytes mit einer Liste Verständnis: f s=[n|n<-[0..],(show=<<[0..n])>s]!!0.
Laikoni
1
Und nur zu erwähnen , es, Sie ein Byte unter Verwendung des zweiten Musters Wache retten kann: |m<-n+1=s!m.
Laikoni
4

Netzhaut , 30 Bytes

+1`(\d+?)(?!\D)(?<!\1.+)
$0;
;

Fügt nach jeder Zahl rekursiv ein Semikolon hinzu und zählt dann die Anzahl der Semikolons

Probieren Sie es online!

PunPun1000
quelle
2

JavaScript (ES6), 32-31 Byte

Dank Challenger5 1 Byte gespart

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

Testfälle

Arnauld
quelle
1
Können Sie die Saiten wieder lexikografisch vergleichen?
Esolanging Fruit
Ich wollte Currys vorschlagen, aber es sieht so aus, als ob dies kein Konsens mehr ist :(
Shaggy
1
@ Shaggy Umm, es ist eigentlich ...
Erik der Outgolfer
1
@EriktheOutgolfer Standardcurrying ist in Ordnung, aber Shaggy bezog sich auf diese spezielle Form des Currys, die Anrufe wie f(payload_param)()oder sogar erfordert f(payload_param)(some_constant). (Übrigens bin ich mir nicht sicher, ob das in diesem speziellen Fall funktionieren würde, da ich beides brauche rund ninitialisiert werden muss.)
Arnauld
2

Mathematica, 46 Bytes

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

1-indiziert

Eingang

[12345678910]

J42161217
quelle
2

Ruby , 51 50 46 Bytes

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

(Dies ist mein erstes Ruby-Programm überhaupt, daher muss es einfach sein, weiter Golf zu spielen.)

-4 Bytes dank @Nnnes

Elazar
quelle
1
Sie brauchen nicht die letzten Klammern: .index(gets)=> .index gets. Sie können 4e4anstelle von verwenden 8**5. Dadurch wird die Ausführung jedoch noch langsamer. Es ist im Allgemeinen in Ordnung und spart oft ein paar Bytes, anonyme Lambdas für Ruby-Antworten zu verwenden: Probieren Sie es online aus! (Ich habe das Limit auf 100 geändert, damit keine
Zeitüberschreitung eintritt
2

Python 2 , 43 Bytes

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

Probieren Sie es online!


Python 2 , 43 Bytes

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

Probieren Sie es online!


Python , 46 Bytes

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

Probieren Sie es online!

Eine andere Strategie. Nimmt eine Anzahl von Zeichen vom Ende, die der Länge des größten Laufs von 0's in s entspricht.


Python , 46 Bytes

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

Probieren Sie es online!

Rekursive Version des oben genannten.

xnor
quelle
Funktioniert Ihre "andere Strategie" (übrigens sehr clever) für Bereiche mit 0-Werten, wie in der Erklärung der Herausforderung gefordert? Solltest du das innere Bit ändern ... i*'0'in s[1:] for ...oder so?
Luca Citi
@LucaCiti Funktioniert für 1-basierte Bereiche und die Herausforderung lässt uns wählen.
21.
Klar hast du recht. Ich habe nur die ursprüngliche Beschreibung betrachtet und den Teil verpasst, in dem 1-basierte Bereiche zulässig sind.
Luca Citi
2

R , 47 Bytes

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

Probieren Sie es online!

1-indiziert

user2390246
quelle
3
Verwenden Sie "if"anstelle vonifelse
Giuseppe
Guter Punkt! Aber OP hat jetzt die Anforderung entfernt, sich mit dem Fall 0 zu befassen, damit ich dieses Bit vollständig loswerden kann ...
user2390246
1
Sie können Eingaben als Zahl annehmen, ncharwie Sie es von Zahlen erwarten. Sie müssen sich jedoch um das Drucken Ihrer Ausgabe kümmern, da dies bei der Ausführung als vollständiges Programm nicht möglich wäre.
JAD
1
n=nchar(scan());cat(which(cumsum(nchar(1:n))==n))
JAD
2

APL (Dyalog) , 17 11 Bytes

-6 Bytes dank ngn .

{,\⍕¨⍳≢⍵}⍳⊂

Probieren Sie es online!

⍳⊂ finden Sie den Index des gesamten Arguments in

{} Das Ergebnis dieser anonymen Funktion:

 Länge des Arguments

ɩ ntegers bis das

⍕¨ jeweils formatieren (stringifizieren)

,\ kumulative Verkettung dieser

Adam
quelle
Oh, ich habe vergessen, dass ich einfach von der Länge gehen konnte, nette Arbeit.
Zacharý
{,\⍕¨⍳≢⍵}⍳⊂(11 Zeichen)
ngn
@ngn Blöd mich. Na sicher!
Adám
2

Perl 5 , 19 Bytes

18 Byte Code + 1 für -p.

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

Verwendet 1-basierte Indizierung. -7 Bytes dank @ nwellnhof ‚s viel Ansatz besser!

Probieren Sie es online!

Erläuterung

$\ist eine spezielle Variable, die printnach jeder Anweisung automatisch bearbeitet wird. Wenn Sie also diese Variable verwenden, um unsere Nummer zu speichern, müssen wir sie nicht aktualisieren $_(was automatisch als Teil der Funktionalität des -pFlags gedruckt wird ), um die gewünschte Ausgabe zu enthalten. Dann, während die Eingabe mit beginnt $\, entfernen Sie es und redodas Programm, das es erneut inkrementiert $\und ersetzt. Wenn die Nummer am Anfang der Zeichenfolge nicht mehr gefunden wird, sind wir fertig! Zum Schluss dekrementieren, $\damit wir die letzte Nummer im Bereich haben.

Dom Hastings
quelle
Was ist mit $i++while s/$i\B//(18 + 1 Byte)?
Nwellnhof
@nwellnhof Das ist viel besser! Ich glaube, ich bin eine komplexere Route eingeschlagen, als ich die Antwort zuerst mit 0 indexiert habe ... Danke!
Dom Hastings
1

CJam , 13 Bytes

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

So viele Kommas ...

Probieren Sie es online!

Erläuterung

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
Geschäfts-Katze
quelle
1

Perl 6 ,  30 28  27 Bytes

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

Probier es aus

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

Probier es aus

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

Probier es aus

Erweitert:

{  # 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...*eine unendliche Folge von Werten erzeugt '', 0, 1, 2, 3...

[\~] '',0...* Erzeugt eine unendliche Folge aller möglichen Eingaben

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

Beachten Sie, dass dieser Code niemals beendet wird, wenn Sie eine ungültige Eingabe machen.

Brad Gilbert b2gills
quelle
1

Pyth , 11 10 Bytes

1-indiziert.

fqQ|jkSTk0

Probieren Sie es hier aus

Wenn die leere Zeichenfolge ignoriert werden konnte, kann dies auf 6 Byte verkürzt werden :

fqQjkS

-1 Byte dank @Mnemonic

Mr. Xcoder
quelle
?QfqQjkUT)1Ich kann es auch in 11 machen, aber ich habe das Gefühl, dass ein Nachbestellen von einem Byte weg Golf spielen kann. Irgendwelche Ideen?
Dave
Sie können ein Byte speichern, indem Sie jkanstelle von s`m verwenden.
Mnemonic
1

CJam, 14 12 11 Bytes

q,_){,s,}%#

Probieren Sie es 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
Geokavel
quelle
1

Dyvil , 42 38 Bytes

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

Gleicher Algorithmus wie diese Java-Antwort , außer dass (ab) einige syntaktische Besonderheiten von Dyvil verwendet.

Erläuterung:

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

  • Gespeicherte 4Bytes mithilfe eines geschweiften Zugriffsausdrucks anstelle einer Variablen für den Akkumulator
Clashsoft
quelle
Coole Sprache !!
Robert Fraser
0

MATL , 14 Bytes

`@q:VXzGX=~}@q

1-indiziert.

Probieren Sie es online!

Erläuterung

`       % 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)
Luis Mendo
quelle
1
Warten Sie, Holzkohle schlagen MATL?
Neil
0

C # , 72 Bytes


Daten

  • Eingabe String i Das zu entschlüsselnde Int-Array
  • Ausgabe Int32 Die Nummer, mit der das Array erstellt wird

Golf gespielt

(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 lesbar

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

Vollständiger Code

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

Releases

  • v1.0 - 72 bytes- Anfangslösung.

Anmerkungen

  • Keiner
auhmaan
quelle
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 Bytes

1-indiziert.

I∫HΔ∑=?f←

Probieren Sie es hier aus!

Erläuterung:

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

..oder 7 Bytes ohne den leeren Fall

∫Δ∑=?F←

Probieren Sie es hier aus!

dzaima
quelle
0

Aceto , 27 25 Bytes

1-basierter Index.

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

Wir rlesen den Input und Memorisieren ihn (und Lladen ihn direkt wieder), dann negieren wir ihn ( !was nur für einen leeren String zu einem Wahrheitswert führt). Wenn dieser Wert wahr ist ( `), springen wir zum Ende ( ;), wo wir pdie implizite Null eingeben .

Andernfalls erhöhen wir den aktuellen Stapelwert (anfangs eine Null), duplizieren ihn und legen eine Kopie auf den Stapel nach rechts, während wir uns ebenfalls dorthin bewegen ( Id]). Dann konstruieren wir einen abnehmenden Bereich ( z), verbinden den Stapel als String ( ¥) und verschieben den Wert (und uns) wieder auf den ursprünglichen Stapel ( [). Wir Lladen den zuvor gespeicherten Wert (die Eingabe) und vergleichen ihn mit dieser Zeichenfolge. Wenn gleich, springen wir wieder zum Ende, wo wir den aktuellen "Zähler" -Wert ( =`;) ausgeben .

Andernfalls wird viel leerer Raum durchlaufen, bis die Hilbert-Kurve schließlich den <Wert erreicht, mit dem die IP Iwieder oben liegt, der Zähler erhöht und erneut getestet wird.

L3viathan
quelle
0

Gestapelt , 23 Bytes

{!0$#+[::>''#`n=]until}

Probieren Sie es online!

Grundsätzlich wird 0solange inkrementiert, bis der Bereich von 0bis zur Zahl der Eingabe entspricht, wobei zuerst auf Gleichheit geprüft wird.

Conor O'Brien
quelle