Annulla un intervallo di numeri


34

È abbastanza semplice, dato un numero n, creare un intervallo da 0a n-1. In effetti, molte lingue forniscono questa operazione come integrata.

Il seguente programma CJam legge un numero intero e quindi stampa tale intervallo ( Provalo online! ):

ri,

Si noti che stampa i numeri senza un separatore.

La sfida

Il tuo compito è invertire questo processo. Dovresti scrivere un programma che, data una stringa che rappresenta un intervallo, restituisce il numero usato per produrre quell'intervallo.

specificazioni

  • I numeri sono indicati senza alcun separatore.
  • Si può presumere che la stringa formi un intervallo valido.
  • È possibile utilizzare l'indicizzazione basata su 0 o 1 per l'intervallo.
  • Si può presumere che un output corretto non supererà mai 32.767 (quindi un input valido non avrà mai una lunghezza superiore a 152.725).
  • Si può presumere che un output corretto sarà sempre positivo (quindi non è necessario gestire 0 o negativo).

Si tratta di , quindi vince la risposta competitiva più breve (misurata in byte).

Casi test

0-indicizzati:

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

1-indicizzati:

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

Ci sono intervalli discendenti? Deve funzionare per numeri negativi?
Daniel,

@Daniel No. Ho dimenticato di menzionarlo; aggiunto.
Esolanging Fruit,

4
I nostri programmi devono davvero gestire la stringa vuota? Penso che sarebbe ragionevole permetterci di ignorarlo. Alcune risposte non beneficiano affatto di questa regola.
Mr. Xcoder,

L'output può essere una rappresentazione in stringa del numero, ovvero preso come sottostringa dalla stringa originale?
user2390246

@ user2390246 Sì, va bene.
Esolanging Fruit,

Risposte:


11

Prolog (SWI) , 91 80 byte

0-indicizzati.

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

Newline aggiunti per la leggibilità.

Provalo online!


11

Buccia , 5 byte

LCmLN

Provalo online!

Solo lettere!

Accetta l'input come stringa, il risultato è 1 indicizzato.

Spiegazione

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-indicizzati.

āηJsk>

Provalo online! o come una suite di test

Spiegazione

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

Sto facendo qualcosa di sbagliato? Questo sembra restituire 0indipendentemente dall'input: tio.run/##MzBNTDJM/f8/3efcdi/PbLv//5UMjYxNTM3MLSwNDZQA
Shaggy

@Shaggy: devi farlo in questo o in questo dato che le virgolette singole contano come parte dell'input.
Emigna,

Ah, quindi gli input di stringa in 05AB1E devono essere citati tre volte?
Shaggy,

@Shaggy: se si desidera la stringa vuota o le nuove righe nell'input sì. Altrimenti non è necessario citarlo affatto.
Emigna,

[NÝJQ#]Nè stata una mia idea, ma è meglio perché funziona "".
Magic Octopus Urn,

7

Java 8, 66 59 byte

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

0-indicizzato

-7 byte grazie a @ PunPun1000 .

Ho la sensazione che questo possa essere abbreviato controllando la lunghezza dell'input in qualche modo, poiché possiamo supporre che l'input sia sempre valido. Lo sto ancora capendo.Incapace di capirlo, e probabilmente costerà troppi byte in Java per essere comunque utile (lo stesso vale per la restituzione di una sottostringa della fine di un input con 1 indice).

Spiegazione:

Provalo qui.

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,

Probabilmente c'è qualche scorciatoia assurda come contare il numero di quelli o usare il logaritmo della lunghezza per ottenere la lunghezza della sottostringa necessaria ... Mi sembra di avere solo cattive idee per questo.
JollyJoker,

6

Brachylog , 9 7 byte

⟦kṫᵐc,Ẹ

Provalo online!

0-indicizzati.

Spiegazione

Qui passiamo l'input attraverso la variabile Output e accediamo al risultato attraverso la variabile 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

Iniziare a familiarizzare con i metodi di funzione in Japt.

0-indicizzati. Può accettare input come una stringa, un numero intero o un array contenente 0 o 1 elementi.

_o ´U}a

Provalo


Spiegazione

Immissione implicita della stringa U.

_     }a

Ottieni il primo numero intero >=0che restituisce true quando viene passato attraverso una funzione che ...

o

Genera un array di numeri interi da 01 a meno dell'intero corrente ...

¬

Unisce a una stringa ...

¥U

Controlla la stringa per l'uguaglianza con U.

Output implicito dell'intero risultante.


Alternativa, 8 byte

ÊÇo ¬ÃbU

Provalo


4

Carbone , 13 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

          λ     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

Funzione che inverte gli intervalli in base zero.

Grazie a Laikoni per aver salvato 3 byte!

Provalo online.


1
37 byte con una lista di comprensione: f s=[n|n<-[0..],(show=<<[0..n])>s]!!0.
Laikoni,

1
E solo per citare esso, è possibile salvare un byte utilizzando la seconda guardia modello: |m<-n+1=s!m.
Laikoni,

4

Retina , 30 byte

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

Aggiunge ricorsivamente un punto e virgola dopo ogni numero, quindi conta il numero di punti e virgola

Provalo online!


2

JavaScript (ES6), 32 31 byte

Salvato 1 byte grazie a Challenger5

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

Casi test


1
Ancora una volta, puoi confrontare le stringhe lessicograficamente?
Esolanging Fruit,

Stavo per suggerire il curry ma sembra che non sia più un consenso :(
Shaggy

1
@Shaggy Umm, in realtà è ...
Erik the Outgolfer,

1
@EriktheOutgolfer Il curry standard va bene, ma Shaggy si riferiva a questa forma speciale di curry che richiede chiamate come f(payload_param)()o anche f(payload_param)(some_constant). (Per inciso, non sono sicuro che funzionerebbe in questo caso particolare perché ho bisogno di entrambi re ndi essere inizializzato.)
Arnauld

2

Mathematica, 46 byte

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

1-indicizzato

ingresso

[ "12345678910"]


2

Rubino , 51 50 46 byte

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

(Questo è il mio primo programma Ruby in assoluto, quindi deve essere facile giocarlo ulteriormente)

-4 byte grazie a @Nnnes


1
Non è necessario l'ultimo set di parentesi: .index(gets)=> .index gets. Puoi usare 4e4invece di 8**5, anche se questo lo farà funzionare ancora più lentamente. In genere è OK, e spesso salva alcuni byte, per utilizzare lambda anonime per le risposte di Ruby: provalo online! (Ho modificato il limite su 100 in modo che non
scada

2

Python 2 , 43 byte

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

Provalo online!


Python 2 , 43 byte

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

Provalo online!


Python , 46 byte

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

Provalo online!

Una strategia diversa. Prende un numero di caratteri dalla fine pari alla lunghezza della corsa più grande di 0's in s.


Python , 46 byte

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

Provalo online!

Versione ricorsiva di quanto sopra.


La tua "strategia diversa" (molto intelligente, tra l'altro) funziona per intervalli basati su 0 come richiesto nella dichiarazione della sfida? Dovresti cambiare il bit interiore in ... i*'0'in s[1:] for ...o qualcosa del genere?
Luca Citi,

@LucaCiti Funziona con gamme basate su 1 e la sfida ci consente di scegliere.
xnor

Certo, hai ragione. Ho solo guardato la descrizione iniziale e ho perso la parte in cui consente intervalli basati su 1.
Luca Citi,

2

R , 47 byte

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

Provalo online!

1-indicizzato


3
Usa "if"invece diifelse
Giuseppe

Buon punto! Ma OP ha ora rimosso il requisito di gestire il caso 0, quindi posso liberarmi completamente di quel bit ...
user2390246

1
Puoi prendere l'input come numero, poiché ncharfunziona come puoi aspettarti dai numeri. Tuttavia, è necessario gestire la stampa dell'output, poiché non funzionerebbe come programma completo.
JAD,

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

2

APL (Dyalog) , 17 11 byte

-6 byte grazie a ngn .

{,\⍕¨⍳≢⍵}⍳⊂

Provalo online!

⍳⊂ trova ɩ ndex dell'intero argomento in

{... } il risultato di questa funzione anonima:

 lunghezza dell'argomento

ɩ ntegers fino a quel

⍕¨ formato (stringify) ciascuno

,\ concatenazione cumulativa di quelli


Oh, ho dimenticato di poter andare fuori di testa, bel lavoro.
Zacharý,

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

@ngn Silly me. Ovviamente!
Adám,

2

Perl 5 , 19 byte

18 byte codice + 1 per -p.

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

Utilizza l'indicizzazione basata su 1. -7 byte grazie a @ nwellnhof 's molto meglio approccio!

Provalo online!

Spiegazione

$\è una variabile speciale che viene printeditata automaticamente dopo ogni istruzione, quindi usando quello per memorizzare il nostro numero non abbiamo bisogno di aggiornare $_(che viene automaticamente stampato come parte della funzionalità del -pflag) per contenere l'output desiderato. Quindi, mentre l'ingresso inizia con $\, rimuoverlo e redoil programma, che di nuovo aumenta $\e lo sostituisce. Quando non trova più il numero all'inizio della stringa, abbiamo finito! Infine, diminuisci in $\modo da avere l'ultimo numero nell'intervallo.


Che dire di $i++while s/$i\B//(18 + 1 byte)?
nwellnhof,

@nwellnhof È molto meglio! Penso di aver iniziato un percorso più complesso mentre ho fatto la risposta indicizzata 0 prima di tutto ... Grazie!
Dom Hastings,



1

CJam , 13 byte

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

Così tante virgole ...

Provalo online!

Spiegazione

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...*}

Provalo

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

Provalo

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

Provalo

Allargato:

{  # 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...*produce una sequenza infinita di valori '', 0, 1, 2, 3...

[\~] '',0...* produce una sequenza infinita di tutti i possibili input

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

Nota che questo codice non si fermerà mai se gli dai un input non valido.


1

Pyth , 11 10 byte

1-indicizzati.

fqQ|jkSTk0

Provalo qui

Se è possibile ignorare la stringa vuota, è possibile accorciarla a 6 byte :

fqQjkS

-1 byte grazie a @Mnemonic


?QfqQjkUT)1posso farlo anche in 11, ma ho la sensazione che un certo riordino possa golfare un byte. Qualche idea?
Dave,

Puoi salvare un byte usando jkinvece di s`m.

1

CJam, 14 12 11 byte

q,_){,s,}%#

Provalo 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}

Stesso algoritmo di questa risposta Java , tranne per il fatto che (ab) utilizza alcune delle specialità sintattiche di Dyvil.

Spiegazione:

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

  • 4Byte salvati utilizzando un'espressione di accesso parentesi anziché una variabile per l'accumulatore

Bel linguaggio !!
Robert Fraser,

0

MATL , 14 byte

`@q:VXzGX=~}@q

1-indicizzati.

Provalo online!

Spiegazione

`       % 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
Aspetta, il carbone ha battuto MATL?
Neil,

0

C # , 72 byte


Dati

  • Input String i La matrice int da decifrare
  • Output Int32 Il numero utilizzato per creare l'array

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

Leggibile non golfato

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

Codice completo

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

Uscite

  • v1.0 - 72 bytes- Soluzione iniziale.

Gli appunti

  • Nessuna

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

0

SOGL V0.12 , 11 10 9 byte

1-indicizzati.

I∫HΔ∑=?f←

Provalo qui!

Spiegazione:

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

..o 7 byte senza il caso vuoto

∫Δ∑=?F←

Provalo qui!


0

Aceto , 27 25 byte

1 indice basato.

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

Abbiamo read l'ingresso e Memorize esso (e direttamente LOAD nuovamente), allora neghiamo esso ( !, portando ad un valore truthy solo per una stringa vuota). Se questo valore è true ( `), passiamo alla fine ( ;), dove pstampiamo lo zero implicito.

Altrimenti, incrementiamo il valore dello stack corrente (inizialmente uno zero), lo dupliciamo e mettiamo una copia nello stack a destra, spostandoci anche lì ( Id]). Costruiamo quindi un intervallo decrescente ( z), uniamo lo stack come stringa ( ¥) e spostiamo nuovamente il valore (e noi) sullo stack originale ( [). NoiL il valore che abbiamo memorizzato in precedenza (l'input) e confrontarlo con questa stringa. Se uguale, saltiamo di nuovo alla fine, dove stampiamo l'attuale valore "contatore" (=`; ).

Altrimenti, viene attraversato un sacco di spazio vuoto fino a quando la curva di Hilbert non raggiunge il valore <che pone Inuovamente l'IP , incrementando il contatore e testando di nuovo.



Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.