Tutti i quadrati che corrispondono a una sequenza di caratteri jolly [chiuso]


9

Questo è stato ispirato da una parte del concorso ARML 2016 Team Problem # 6.

Ecco la sfida:

Ti viene data una "sequenza di caratteri jolly", che è una sequenza di cifre e un altro carattere. Una stringa corrisponde a questa sequenza di caratteri jolly con il seguente pseudocodice:

w = wildcard
s = string
# s matches w iff
for all 0 >= i > wildcard.length, w[i] == '?' or s[i] == w[i]

Dove '?' è un personaggio a tua scelta.

In termini di regex, immagina '?'di essere '.'.

La sfida è trovare tutti i numeri quadrati (il requisito è fino a 1 milione) le cui rappresentazioni di stringhe decimali corrispondono a questa sequenza di caratteri jolly. Il "carattere jolly" può essere qualsiasi carattere ASCII di tua scelta, purché non sia una cifra, ovviamente.

Ad esempio, 4096partite 4**6e 4*9*ma 4114non corrisponde neanche.

Ingresso

L'input verrà dato come una sequenza corrispondente alla regex [0-9?]+. Può essere una stringa, una matrice di caratteri o una matrice di byte dei caratteri in ASCII.

Produzione

L'output sarà un elenco / insieme / matrice di numeri delimitati da qualsiasi valore, che siano quadrati perfetti e corrispondano alla sequenza di caratteri jolly.

Esempi di input validi:

1234567*90
1234567?90
1234567u90
['1', '2', '3', '4', '5', '6', '7', '*', '9', '0']
[49, 50, 51, 52, 53, 54, 55, 42, 57, 48]
[1, 2, 3, 4, 5, 6, 7, '*', 9, 0]

Esempi di output validi:

[1, 4, 9]
1 4 9
1, 4, 9
1-4-9

eccetera.

specificazioni

  • Non puoi usare i builtin per trovare un elenco di quadrati in un certo intervallo
  • Si applicano scappatoie standard
  • Devi essere in grado di gestire fino a 1 000 000 (1 milione)
  • Se fornito con l'input 1******, è corretto stampare [1000000]. È anche corretto stampare[1000000, 1002001, 1004004, 1006009, 1008016, 1010025, ...]
  • Le sequenze di caratteri jolly non inizieranno mai con il carattere jolly; cioè, corrisponderanno sempre a stringhe della stessa lunghezza.

Casi test

4**6  ->  [4096, 4356]
1**1  ->  [1521, 1681]
1**  ->  [100, 121, 144, 169, 196]
9****9  ->  [908209, 915849, 927369, 935089, 946729, 954529, 966289, 974169, 986049, 994009]
9*9***  ->  [919681, 929296]
1**0*  ->  [10000, 10201, 10404, 10609, 12100, 14400, 16900, 19600]
9***4  ->  [91204, 94864, 97344]

vincente

Invio più breve (valido) (funzionante) entro il 14 febbraio, vincita alla prima presentazione vincente.


1
Penso che un buon inizio per rendere questo più chiaro sarebbe quello di specificare che ?deve essere scelto dal risponditore.
FryAmTheEggman,

2
Perché è 25una risposta valida per ***ma non per *2*?
Neil,

3
Penso che questo sarebbe più pulito se i numeri non avessero mai zero iniziali, quindi corrispondevano solo alle sequenze della loro lunghezza.
xnor

@Neil Sarebbe un problema con la mia soluzione. Prenderò il suggerimento di xnor.
HyperNeutrino,

L'input può essere una matrice di numeri interi a una cifra e il carattere speciale, come {4, "w", "w", 6}(o meglio ancora {4, w, w, 6}), piuttosto che una matrice di caratteri, come {"4", "w", "w", "6"}?
Greg Martin,

Risposte:


0

05AB1E , 22 byte

Probabilmente qui c'è molto margine di miglioramento.
Qualsiasi non cifra va bene come carattere jolly.

3°LnvyS¹)ø€Æ0QPyg¹gQ&—

Provalo online!

Spiegazione a venire dopo ulteriore golf.


Questo sembra funzionare per tutti gli input. Buon lavoro.
HyperNeutrino,

1

Mathematica, 44 byte

Print@@@IntegerDigits[Range@1*^3^2]~Cases~#&

L'input è un elenco di cifre con un _(senza virgolette) come carattere jolly. per esempio{4, _, _, 6}

Spiegazione

Range@1*^3

Genera elenco {1, 2, 3, ... , 1000}

... ^2

Square it. (elenco di tutti i quadrati da 1 a 1.000.000)

IntegerDigits[ ... ]

Dividi ogni quadrato in un elenco di cifre.

... ~Cases~#

Trova quelli che corrispondono al modello specificato dall'input.

Print@@@ ...

Stampali.


Questo sembra funzionare per tutti i casi di test. Buon lavoro.
HyperNeutrino,

1

Brachylog , 23 byte

@e:{@$|,}a#0:{c.~^#I,}f

Provalo online!

Spiegazione

@e                        Split into a list of characters
  :{@$|,}a                Replace each digit char by the corresponding digit, and each things
                            that are ot digits into variables
          #0              All elements of the resulting list must be digits
            :{       }f   Output is the result of finding all...
              c.            ...concatenations of those digits which...
               .~^#I,       ...result in a number which is the square of an integer #I

Diverso formato di input, 13 byte

A seconda di ciò che ritieni valido come input, puoi farlo:

#0:{c.~^#I,}f

Provalo online!

che è fondamentalmente la seconda parte della risposta sopra, con un elenco come input contenente cifre e variabili in cui si trovano i caratteri jolly.

Non lo considero valido perché ci sono solo 26 nomi di variabili in Brachylog (le lettere maiuscole), quindi questo non funzionerebbe se avessi più di 26 wilcard.


Questo sembra funzionare per tutti gli input. Buon lavoro. Tuttavia, considererei questo come 24 byte perché è richiesto un argomento a 1 byte. Non sono sicuro di come funzionerebbe il punteggio per questo.
HyperNeutrino,

1
@AlexL. L'argomento è lì solo per dire il nome della variabile di output (puoi usare un'altra lettera maiuscola se vuoi). Questo è simile alle risposte in Prolog / lingue con funzioni in cui il predicato / funzione è chiamato ma in realtà non si contano i byte che si usano quando lo si chiama.
Fatalizza il

Va bene. Non sono sicuro se uno dovrebbe segnarlo come 24 poiché l'argomento è necessario (altrimenti ritorna solo true.), ma non ho mai usato lingue che lo richiedono prima. Cercherò di trovare qualche riferimento per determinare come dovrei segnare questo, ma avrebbe senso segnarlo come 23, quindi lo terrò.
HyperNeutrino,

1

Perl 6 , 30 26 byte

Grazie a @ b2gills per -4 byte!

{grep /^<$_>$/,map * **2,^1e4}

{grep /^<$_>$/,(^1e4)»²}

Utilizza il punto come carattere jolly, in modo che l'input possa essere utilizzato come regex:

{                            }   # a lambda
                         ^1e4    # range from 0 to 9999
               map * **2,        # square each value
 grep /      /,                  # filter numbers that match this regex:
        <$_>                     #   lambda argument eval'ed as sub-regex
       ^    $                    #   anchor to beginning and end

Provalo online .

Una variante che accetta l'asterisco come carattere jolly (come suggerito da una precedente revisione della descrizione dell'attività) sarebbe 42 byte:

{grep /^<{.trans("*"=>".")}>$/,(^1e4)»²}

Ho riformulato le regole e puoi scegliere qualsiasi carattere jolly. Lo sto segnando come 38 byte.
HyperNeutrino,

Uhm, come lo usi? Non so niente di Perl.
HyperNeutrino,

@AlexL .: Grazie, ho aggiornato la risposta (e ho aggiunto anche una spiegazione). È una lambda; potresti chiamarlo direttamente (es. { ... }("9*9***")) o assegnarlo a una variabile / simbolo per un uso successivo. Nota che Perl 6 è una lingua separata da Perl, quindi non funzionerà con un interprete Perl.
smls

Ero solito sudo apt-get install rakudoottenere un presunto interprete Perl6 ... Quando inserivo perl6un comando nel mio terminale, inizia quello che sembra essere un interprete Perl6, ma non so come usarlo. So che è un lambda, ma non so come chiamarlo.
HyperNeutrino,

@AlexL .: Ho aggiunto un link "Provalo online" che lo mostra come uno script completo che puoi eseguire come perl6 foo.p6. Puoi anche provarlo in un shell oneliner, comeperl6 -e 'say {grep /^<$_>$/,map * **2,^1e4}( "9.9..." )'
smls

1

Rubino, 54 byte

Funzione che accetta un argomento stringa. Provalo online.

->s{(0..1e3).map{|i|"#{i**2}"[/^#{s.tr ?*,?.}$/]}-[p]}

È possibile salvare un byte utilizzando i * i anziché i ** 2
GB

Questo non sembra funzionare perché il secondo #sta facendo un commento al resto della riga.
HyperNeutrino,

@AlexL Oh, funziona tutto bene. repl.it/FJCV
Value Ink

ohhhh okay non sapevo come testare Ruby. Mie scuse. Questo sembra funzionare per tutti gli input. Buon lavoro!
HyperNeutrino,

0

Lotto, 109 byte

@for /l %%i in (0,1,999)do @set/aj=%%i*%%i&call copy nul %%j%%.%%j%%$>nul
@for %%s in (%1.%1$)do @echo %%~ns

Utilizza ?come jolly. Funziona creando 1000 file. Il nome del file è il numero quadrato e l'estensione del file è il numero quadrato con un $suffisso. Questo perché la corrispondenza del modello di Batch conta il trascinamento di ?s come facoltativo, quindi 1?corrisponderà a entrambi 1e 16; il$ costringe quindi la partita per essere esatti. Tuttavia, non vogliamo produrre l'output $, quindi produciamo solo il nome del file senza estensione.


0

JavaScript (ES6), 68 66 byte

EDIT: aggiornata la mia soluzione di seguito dopo essere stata ispirata da risposta JungHwan Min . Ora è conforme ES6.

Accetta input nel formato in '1..4'cui. trova il carattere jolly.

Invece di iterare su 1e6 e il rooting quadrato, questo scorre su 1e3 e quadrati.

p=>[...Array(1e3)].map((_,n)=>''+n*n).filter(n=>n.match(`^${p}$`))

JavaScript (ES7), 71 69 byte

p=>[...Array(1e6).keys()].filter(n=>n**.5%1?0:(''+n).match(`^${p}$`))

Crea un array di numeri da 0 a 1e6, quindi lo filtra per numeri quadrati e corrispondenti al modello.

È orrendamente lento perché scorre sempre fino a 1e6.


Non penso **che funzioni, perché mi sta dando un "SyntaxError: expected expression, got '*'".
HyperNeutrino,

@AlexL. Le regole sembrano essere cambiate. Le regole precedenti suggerivano che potevo scegliere il carattere jolly.
George Reith,

Devi solo supportare fino a 1e6...
HyperNeutrino il

Inoltre, ho cambiato le regole indietro; il problema non è con le regole, è perché l' **operatore non esiste, almeno non con il mio sistema.
HyperNeutrino

@AlexL. Ah scusa pensavo che intendessi l'input **. Sì, è ES7, aggiornerò il titolo qui è un elenco dei browser attualmente supportati developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
George Reith

0

Perl, 42 45 38 byte

EDIT: chiarimento di Alex, possiamo usare il punto come carattere jolly che rade l'operazione y //.

perl -pe 's|.*|@{[grep/^$&$/,map$_*$_,1..1e3]}|'

EDIT: soluzione che utilizza l'asterisco come carattere jolly e prevede la sequenza di caratteri jolly su STDIN

perl -pe 'y/*/./;s|.*|@{[grep/^$&$/,map$_*$_,1..1e3]}|'

Questo lascia indubbiamente molto margine di miglioramento, è piuttosto semplice. L'espressione jolly è prevista come argomento della riga di comando, con il carattere jolly punto (cos'altro?).

say"@{[grep/^$ARGV[0]$/,map$_*$_,1..1e3]}"

La domanda specifica che i caratteri jolly sono indicati come asterischi. Una precedente revisione della domanda ha permesso di scegliere il proprio carattere jolly?
smls

1
@smls: la domanda specifica ancora scegliere il proprio carattere jolly anche se non si trova nella sezione della regola: il carattere utilizzato come carattere jolly non deve necessariamente essere un asterisco, può essere qualsiasi carattere ASCII a scelta, purché non è una cifra, ovviamente.
Emigna,

Sì, mi sono confuso. Successivamente, afferma chiaramente che il carattere jolly deve essere un asterisco. Immagino che la definizione con regex sia in vantaggio. Revisionerò la mia soluzione.
Daniel

1
Hm in realtà, la frase citata da @Emigna è abbastanza chiaro che siamo in grado di scegliere il nostro carattere jolly, non è vero?
smls

Per chiarire, il carattere jolly può essere quello che vuoi. Ho sbagliato per sbaglio le regole nel riaffermare la spiegazione.
HyperNeutrino,

0

Python 3 - 98 97 byte

import re;print(re.findall(r"\b"+input()+r"\b",("\n".join([str(x*x) for x in range(1,1001)]))))

Richiede input come '4..6'.


È possibile salvare 3 byte utilizzando import ree re.findall; l'ottimizzazione con il from...import *non la ottimizza in questo caso.
HyperNeutrino,

Fornito input 1...., fornisce 1 4 9e 16 25come risposte valide, che non è corretto. Per favore, correggi il tuo programma.
HyperNeutrino,

Risolvi il caso unendoti a "\ n".
Carra,

Questo non funziona per 1....... Ritorna [], ma dovrebbe dare [1000000]. Questo può essere risolto al costo di 0 byte usando range(0, 1001)anziché range(0, 1000).
HyperNeutrino,

Bene, ho appena controllato tutti i casi di test dalla descrizione :)
Carra,

0

k - 28 caratteri

{s(&:)($:s:s*s:!1001)like x}

Utilizza ?come carattere jolly. La likefunzione utilizza ?come carattere jolly e questa funzione crea un elenco dei primi 1001 quadrati (da includere in 1M), li lancia tutti in stringhe e quindi controlla dove corrispondono al modello.

    {s(&:)($:s:s*s:!1001)like x} "1??"
100 121 144 169 196

Sto ottenendo questo errore per esso: type error {s(&:)($:s:s*s:!1001)like x} "1" at execution instance 2 of ":". Potresti fornire un link a una suite di test funzionante o vedere se c'è un problema?
HyperNeutrino,

@AlexL. Funziona per me nella modalità k di kdb +
C. Quilley,

Hmm. Proverò a provarlo con diversi interpreti.
HyperNeutrino,

0

bash + utility Unix, 33 byte

dc<<<'0[2^pv1+lax]dsax'|grep ^$1$

Questo usa '.' come carattere jolly.

Il programma dc stampa i numeri quadrati in un ciclo infinito:

0     Push 0 on the stack.

[     Start a macro (called a).

2^    Square the number at the top of the stack.

p     Print the number at the top of the stack, followed by a newline.

v     Replace the number at the top of the stack (a square number) with its square root.

1+    Increment the number at the top of the stack.

lax   Run the macro again (looping).

]     End of the macro.

dsax  Store the macro in register a and run it.

L'output in cc viene convogliato su grep, che stampa solo i quadrati che corrispondono al modello richiesto.

Funziona quando lo eseguo su un vero sistema Linux o OS X (ma non funziona su TIO, probabilmente perché il programma dc tenta di ricorrere per sempre, e sospetto che TIO esaurisca lo spazio dello stack per la ricorsione e / o abbia un problema con la pipe infinita).


Sto eseguendo questo con Linux Mint 17.3 Rosa, e non sta terminando. Penso che il problema sia con il dccomando senza fine .
HyperNeutrino,

Sospetto che in realtà sia il buffering a causare il problema. Non ho quella versione di Linux, ma potresti provare a sostituire grep con grep --line-buffered (per fare in modo che ogni riga venga stampata mentre è grepped). [Naturalmente, ciò aggiunge un numero di byte.]
Mitchell Spector,

Ho aggiunto l'argomento grep, ma non fa differenza. Ho provato a mettere il--line-buffered da entrambi i lati ^$1$, ma non funziona in entrambi i modi.
HyperNeutrino,

@ AlexL.Grazie di averci provato. Non so se la differenza sia nel kernel o nella versione bash che sto eseguendo. L'ho fatto funzionare in TIO forzando la fine dell'input di grep usando head, come segue: dc <<< '0 [2 ^ pv1 + lax] dsax' | head -1sed s/./0/g<<<$1 | grep ^ $ 1 $ Questo utilizza la lunghezza del modello per limitare i numeri da testare (modelli di 4 caratteri controllano solo fino a 9999, ecc.). Ecco un link TIO: tio.run/nexus/…
Mitchell Spector

Grazie per la correzione. Non penso che l'attuale soluzione funzionerebbe (anche se non ho molta conoscenza di bash), perché sembra che debba calcolare tutti i valori prima di inserirli grep. Tuttavia, poiché al momento non è la soluzione più breve, la terrò a 33 byte per il punteggio. Sembra funzionare per tutti gli input, quindi un buon lavoro!
HyperNeutrino,
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.