Lily pad saltando


24

In questa sfida, devi simulare una rana che salta avanti e indietro sui gigli. Lo stagno è infinitamente grande, ha una linea di un numero infinito di ninfee e la rana può saltare attraverso tutti i ninfee che gli piacciono.

A questa rana piace saltare avanti e indietro: dopo aver saltato in avanti, salta sempre indietro e viceversa.

Viene passato un elenco di numeri interi, che rappresenta i suoi salti. Devi produrre il risultato dei suoi salti.

Ad esempio, supponiamo che tu sia passato [2,3,6,8,2]:

La nostra rana inizia saltando in avanti di 2 gigli:

_2

Quindi 3 giglio indietro:

3__2

Quindi 6 ninfee in avanti:

3__2__6

8 indietro:

8_3__2__6

Quindi, infine, 2 gigli in avanti (nota come il 2 sovrascrive il 3):

8_2__2__6

Per essere più espliciti: il tuo input è un array di numeri S, devi emetterlo S[K]nella posizione S[K] - S[K-1] + S[K-2] - S[K-3]....

  • Se si devono stampare più numeri in una determinata posizione, stampare solo quello con l'indice più alto.
  • Devi usarlo _se una posizione particolare è vuota
  • Se un numero ha più cifre, non occupa più posizioni. (In altre parole, una posizione può essere composta da più caratteri)
  • Puoi presumere che la tua lista non sia vuota e che tutti i numeri interi siano maggiori di 0.

Casi test:

5                   ____5
2,2                 2_2
4,3,2,1             3124
5,3,2,1             _3125
2,3,6,8,2           8_2__2__6
10,3,12,4,1,12,16   ___12__3__10____41__1216
100,4,7,2,2         _______________________________________________________________________________________________4___1002_2

Questo è un , quindi rispondi con il minor numero di caratteri possibile!


13
Mi chiedo chi abbia guardato Numberphile?
Okx,

3
Quindi ci sarà una sfida per ogni video di Numberphile allora ...
Fatalizza il


5
@Fatalize Non vedo nulla di male in questo.
orlp,

1
Anche correlati ;-)
Arnauld

Risposte:


9

MATL , 35 34 byte

Grazie a @Emigna per aver salvato 1 byte!

32Oittn:oEq*Yst1hX<-Q(Vh' 0'95ZtXz

Provalo online! Oppure verifica tutti i casi di test .

Come funziona

Golf il tuo codice, non le tue spiegazioni!

Quanto segue utilizza l'input [2,3,6,8,2]come esempio. Per vedere risultati intermedi nel codice effettivo, potresti voler inserire un %(simbolo di commento) per fermare il programma in quel punto e vedere il contenuto dello stack. Ad esempio, questo mostra l'istruzione stack after Ys(somma cumulativa).

32       % Push 32 (ASCII for space)
O        % Push 0
i        % Input array
         % STACK: 32, 0, [2,3,6,8,2]
t        % Duplicate
         % STACK: 32, 0, [2,3,6,8,2], [2,3,6,8,2]
tn:      % Push [1 2 ... n] where n is length of input array
         % STACK: 32, 0, [2,3,6,8,2], [2,3,6,8,2], [1,2,3,4,5]
o        % Modulo 2
         % STACK: 32, 0, [2,3,6,8,2], [2,3,6,8,2], [1,0,1,0,1]
Eq       % Multiply by 2, subtract 1
         % STACK: 32, 0, [2,3,6,8,2], [2,3,6,8,2], [1,-1,1,-1,1]
*        % Multiply elementwise
         % STACK: 32, 0, [2,3,6,8,2], [2,-3,6,-8,2]
Ys       % Cumulative sum
         % STACK: 32, 0, [2,3,6,8,2], [2,-1,5,-3,1]
         % The top-most array is the positions where the entries of the second-top
         % array will be written. But postions cannot be less than 1; if that's
         % the case we need to correct so that the minimum is 1. If this happens,
         % it means that the frog has gone further left than where he started
t        % Duplicate
1hX<     % Append 1 and compute minimum. So if the original minimum is less than 1
         % this gives that minimum, and if it is more than 1 it gives 1
         % STACK: 32, 0, [2,3,6,8,2], [2,-1,5,-3,1], -3
-        % Subtract
         % STACK: 32, 0, [2,3,6,8,2], [5 2 8 0 2]
Q        % Add 1
         % STACK: 32, 0, [2,3,6,8,2], [6 3 9 1 3]
(        % Assign values (top array) to specified positions (second-top) into array
         % which contains a single 0 (third-top). Newer values overwrite earlier
         % values at the same position
         % STACK: 32, [8 0 2 0 0 2 0 0 6]
V        % Convert to string. This produces spaces between the numbers
         % STACK: 32, '8 0 2 0 0 2 0 0 6'
h        % Concatenate with initial 32 (space). This converts to char
         % STACK: ' 8 0 2 0 0 2 0 0 6'
         % Thanks to this initial space, all zeros that need to be replaced by '_'
         % are preceded by spaces. (In this example that initial space would not
         % be needed, but in other cases it will.) Other zeros, which are part of
         % a number like '10', must not be replaced
' 0'     % Push this string: source for string replacement
         % STACK: ' 8 0 2 0 0 2 0 0 6', ' 0 '
95       % Push 95 (ASCII for '_'): target for string replacement
         % STACK: ' 8 0 2 0 0 2 0 0 6', ' 0 ', 95
Zt       % String replacement
         % STACK: ' 8_2__2__6'
Xz       % Remove spaces. Implicit display
         % STACK: '8_2__2__6'

Penso che potresti salvare due byte sostituendo '0'invece di ' 0 ', perché Xzrimuove gli spazi dopo
B. Mehta

1
@ B.Mehta Grazie. Inizialmente l'ho fatto, ma sfortunatamente non funziona, perché anche '0'in in '10'viene sostituito. Ecco perché aggiungo 32anche un'iniziale
Luis Mendo il

Ah certo, il mio errore
B. Mehta,

@ B.Mehta No, non è stato affatto chiaro dalla mia spiegazione. Chiarirò più tardi
Luis Mendo il

1
L'array mod 2 è invertito nella spiegazione. E inoltre, non ' 0'funzionerebbe altrettanto bene?
Emigna,

4

PHP, 100 101 99 104 byte

for($p=-1;$d=$argv[++$k];+$i<$p?:$i=$p,$x>$p?:$x=$p)$r[$p+=$k&1?$d:-$d]=$d;for(;$i<=$x;)echo$r[$i++]?:_;

accetta input dagli argomenti della riga di comando; corri con -nr.

abbattersi

for($p=-1;          // init position
    $d=$argv[++$k]; // loop $d through command line arguments
    +$i<$p?:$i=$p,          // 3. $i=minimum index
    $x>$p?:$x=$p            // 4. $x=maximum index
)
    $r[
        $p+=$k&1?$d:-$d     // 1. jump: up for odd indexes, down else
    ]=$d;                   // 2. set result at that position to $d
for(;$i<=$x;)           // loop $i to $x inclusive
    echo$r[$i++]?:_;        // print result at that index, underscore if empty

In che modo gestisce l'input di esempio 2,3,6,8,2, in cui i 8salti "all'indietro" oltre "l'inizio" dei pad di giglio?
AdmBorkBork,

@AdmBorkBork PHP supporta indici di array negativi.
Tito

Ah, non lo sapevo. Grazie!
AdmBorkBork,

4

JavaScript (ES6), 99 107 byte

Modifica: poiché l'OP ha chiarito che l'unico limite dovrebbe essere la memoria disponibile, questo è stato aggiornato per allocare esattamente lo spazio richiesto invece di fare affidamento su un intervallo massimo hardcoded.

f=(a,x='',p=M=0)=>a.map(n=>x[(p-=(i=-i)*n)<m?m=p:p>M?M=p:p]=n,i=m=1)&&x?x.join``:f(a,Array(M-m).fill`_`,-m)

Come funziona

Questa funzione funziona in due passaggi:

  • Durante il primo passaggio:

    • Il "puntatore rana" p è inizializzato su 0.
    • Il x variabile è impostata su una stringa vuota, in modo che tutti i tentativi di modifica vengano semplicemente ignorati.
    • Calcoliamo me Mche sono rispettivamente i valori minimo e massimo raggiunti dap .
    • Alla fine di questo passaggio: facciamo una chiamata ricorsiva a f().
  • Durante il secondo passaggio:

    • pè inizializzato su -m.
    • xè impostato su una matrice di dimensioni M-m, piena di _caratteri.
    • Inseriamo i numeri nelle posizioni corrette in x.
    • Alla fine di questo passaggio: restituiamo una versione unita di x, che è il risultato finale.

Casi test


Ciò fallisce nei casi in cui la rana salta sotto l'indice -998 o sopra 1002. Esempio: [1100]risulta il numero stampato in posizione 1002anziché in posizione 1100.
nderscore,

1
@nderscore Questo è stato risolto, al costo di 8 byte.
Arnauld,

eccezionale! bel metodo anche :)
nderscore

4

R , 100 97 96 byte

function(x){p=cumsum(x*c(1,-1))[seq(x^0)]
p=p+max(1-p,0)
v=rep('_',max(p));v[p]=x
cat(v,sep='')}

Provalo online!

La linea 1 trova tutte le posizioni in cui saltare. Innanzitutto, tutti i salti xvengono moltiplicati per 1 o −1 e quindi trasformati in posizioni finali usando la somma cumulativa. Il vettore c(-1,1)viene riciclato se necessario, tuttavia, quando xè di lunghezza 1, xviene invece riciclato. Pertanto solo seq(x^0)(equivalente aseq_along(x) vengono considerate ) somme. (Viene generato un avviso quando la lunghezza di xnon è un multiplo di 2 ma non influisce sul risultato)

La linea 2 aumenta le posizioni di salto in modo che tutti siano almeno 1.

Le righe 3 e 4 creano l'output e lo stampano.

−1 byte da Giuseppe


trucco pulito con seq(x^0)!
Giuseppe

-p+1può essere 1-pper un byte in meno.
Giuseppe

@Giuseppe Ah, sicuramente grazie!
Robert Hacken,

3

Javascript (ES6), 109 byte

f=x=>x.map((y,i)=>o[j=(j-=i%2?y:-y)<0?o.unshift(...Array(-j))&0:j]=y,o=[],j=-1)&&[...o].map(y=>y||'_').join``
<!-- snippet demo: -->
<input list=l oninput=console.log(f(this.value.split(/,/)))>
<datalist id=l><option value=5><option value="4,3,2,1"><option value="5,3,2,1"><option value="2,3,6,8,2"><option value="10,3,12,4,1,12,16"><option value="100,4,7,2,2"></datalist>

ha commentato:

f=x=>x.map((y,i)=>o[j=(j-=i%2?y:-y)<0?o.unshift(...Array(-j))&0:j]=y,o=[],j=-1)&&[...o].map(y=>y||'_').join``
                /* initialize output array [] and index j at -1: */  o=[],j=-1
     x.map((y,i)=> /* iterate over all items in input x (y=item, i=index) */  )
                      (j-=i%2?y:-y) /* update j +/-y based on if index i is odd */
                                   <0? /* if resulting j index is less than zero */
                                      o.unshift(...Array(-j)) /* prepend -j extra slots to the output array */
                                                             &0 /* and give result 0 */
                                                               :j /* else give result j */
                    j= /* assign result to j */
                  o[ /* assign y to output array at index j */   ]=y
   /* short-circuit && then spread output array to fill any missing entries */ &&[...o]
                                                      /* fill falsey slots with '_' */ .map(y=>y||'_')
                                                                         /* join with empty spaces */ .join``

3

Perl 6 , 68 67 byte

{(my @a)[[[\+] |(1,-1)xx*Z*$_].&{$_ X-min 1,|$_}]=$_;[~] @a X//"_"}

Provalo online!

Come funziona

Innanzitutto determina le posizioni di salto cumulative:

[[\+] |(1,-1)xx*Z*$_]
                  $_  # Input array.          e.g.  2, 3, 6, 8, 2
      |(1,-1)xx*      # Infinite sequence:          1,-1, 1,-1, 1...
                Z*    # Zip-multiplied.       e.g.  2,-3, 6,-8, 2
 [\+]                 # Cumulative addition.  e.g.  2,-1, 5,-3,-1

Quindi li trasforma in indici di array basati su 0 sottraendo il numero minimo (ma al massimo 1) da tutti i numeri:

.&{$_ X-min 1,|$_}    #                       e.g.  5, 2, 8, 0, 2

Quindi crea un array con i numeri di input assegnati a quegli indici:

(my @a)[   ]=$_;      #                       e.g.  8, Nil, 2, Nil, Nil, 2 Nil, Nil, 6

Infine concatena l'array in una stringa, con il trattino basso al posto di elementi indefiniti:

[~] @a X//"_"         #                       e.g.  8_2__2__6

3

Gelatina ,  28  24 byte

-2 (e consentendone un altro -2) grazie a FrownyFrog (utilizzare rapidamente la funzionalità [post-challenge] dell'applicazione prefisso Ƥ) ,

ṚƤḅ-µCṀ»0+µṬ€×"³Ṛo/o”_;⁷

Provalo online! Programma completo, per una suite di test che utilizza la stessa funzionalità, fare clic qui .

Come?

ṚƤḅ-µCṀ»0+µṬ€×"³Ṛo/o”_;⁷ - Main link: list a       e.g. [ 5, 3, 2, 1]
 Ƥ                       - prefix application of:
Ṛ                        -  reverse                e.g. [[5],[3,5],[2,3,5],[1,2,3,5]]
   -                     - literal minus one
  ḅ                      - from base (vectorises)  e.g. [ 5, 2, 4, 3]=
    µ                    - start a new monadic chain - call that list c
                         - [code to shift so minimum is 1 or current minimum]
     C                   - complement (vectorises) e.g. [-4,-1,-3,-2]
      Ṁ                  - maximum                 e.g.     -1
       »0                - maximum of that & zero  e.g.      0
         +               - add to c (vectorises)   e.g. [ 5, 2, 4, 3]
          µ              - start a new monadic chain - call that list d
           Ṭ€            - untruth €ach            e.g. [[0,0,0,0,1],[0,1],[0,0,0,1],[0,0,1]]
               ³         - the program input (a)
             ×"          - zip with multiplication e.g. [[0,0,0,0,5],[0,3],[0,0,0,2],[0,0,1]]
                Ṛ        - reverse                      [[0,0,1],[0,0,0,2],[0,3],[0,0,0,0,5]]
                 o/      - reduce with or          e.g. [0,3,1,2,5]
                    ”_   - '_'
                   o     - or (replace 0 with '_') e.g. ['_',3,1,2,5]
                      ;⁷ - concatenate a newline   e.g. ['_',3,1,2,5, '\n']
                         - implicit print

Gli appunti:

La concatenazione finale di una nuova riga, ;⁷è per i casi in cui non _appare nell'output, nel qual caso la stampa implicita mostrerebbe una rappresentazione dell'elenco, ad esempio [3, 1, 2, 4], piuttosto che qualcosa di simile all'esempio _3125. Per nessun fine riga uno potrebbe sostituire ;⁷con ;““per aggiungere una lista di liste di caratteri, [[''],['']](no chiudere necessaria in quanto è l'ultimo carattere di un programma).

La funzione non verità, Ṭ, fornisce un elenco con 1s agli indici nel suo input, per un singolo numero naturale, n che è n-1 0 s seguito da un che 1consente di posizionare i numeri di input alla loro corretta distanza da sinistra mediante la moltiplicazione . L'inversione, è richiesta per sovrascrivere successivamente le visite delle rane anziché quelle precedenti quando o/viene eseguita la riduzione con o ,.


1,-ṁ×µ+\UƤ_@/€?
FrownyFrog

Ƥnon era una caratteristica nel momento in cui è stato scritto, ma sì, funzionerà. Meglio UƤḅ€-(dal momento che la conversione dalla base -1 è come moltiplicare per ...,1,-1,1,-1,1,-1,1e quindi sommare).
Jonathan Allan,

... o anche UƤḅ-dai vettori :) (sono andato anche con il contrario, dato che non abbiamo bisogno della complessità dell'upend U) ,
Jonathan Allan

1

APL (Dyalog Unicode) , 45 30 byte SBCS

{∊⍕¨⍵@i⍴∘'_'⌈/1+i←(⊢-1⌊⌊/)-\⍵}

Provalo online!

-\⍵scansiona l'argomento alternando -e+

(⊢ - 1 ⌊ ⌊/)da that ( ) sottrai 1 o il minimo ( ⌊/), qualunque sia il più piccolo ( )

i← assegnato a i

⌈/ 1+ incrementare e prendere il massimo

⍴∘'_' produrre così tanti trattini bassi

⍵@imetti i numeri dall'argomento ( ) nelle posizionii

∊⍕¨ formattare ciascuno e appiattire


0

Rubino , 85 byte

->a{i=1;j=c=0;a.map{|x|[c-=x*i=-i,x]}.to_h.sort.map{|x,y|[?_*[x+~j,0*j=x].max,y]}*''}

Provalo online!

Registra le posizioni dopo ogni salto, converte l'array risultante in hash per rimuovere i duplicati (preservando l'ultimo valore in ciascuna posizione duplicata), quindi incolla i valori con la quantità richiesta di caratteri di sottolineatura.


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.