Dimensiona un numero

Oct 03 2020

Intro

Dato un numero intero \$< 100,\$ estendere / accorciare la rappresentazione inglese del numero per avere tanti caratteri quanti sono il suo valore.

Sandbox

Regole

Prendi il numero \$n\$e leggilo a parole da questo dizionario. Puoi prendere questo dizionario nel modo che preferisci. (un elenco, letto dal collegamento, argomento della riga di comando, STDIN, variabile e così via.)

Ecco il file come array JSON. (Cortesia di Lyxal)

Quindi, fai quanto segue con la stringa:

  • Se la lunghezza della stringa è inferiore al numero, ripeti alcuni dei suoi caratteri finché la lunghezza non corrisponde al numero.
  • Il primo e l'ultimo carattere non devono essere ripetuti e il numero di ripetizioni degli altri caratteri dovrebbe differire al massimo di uno (quindi puoi ripetere alcuni di essi 5 volte e altri 6 volte, ad esempio; non importa quali Esattamente).
  • Se la lunghezza della stringa è maggiore del numero, rimuovi tutti i suoi caratteri tranne il primo e l'ultimo per fare in modo che la lunghezza corrisponda al numero. 1 e 0 sono eccezioni, poiché sono troppo piccoli.
  • L'ordine delle lettere nella stringa deve essere mantenuto.
  • Esempio:
50 → f[ift]y → 3 letters must be duplicated 16 times
61 → s[ixtyon]e → 5 letters must be duplicated 10 times, 1 character must be duplicated 9 times

Esecuzione passo dopo passo

Prendendo 11 come esempio,

(formattato come word → length)

eleven → 6
 ^
elleven → 7
   ^
elleeven → 8
     ^
elleevven → 9
       ^
elleevveen → 10
  ^
ellleevveen → 11 (end)

Esempi

2 → to
3 → the or tre or tee
4 → four
5 → fiive or fivve
7 → seevven or sevveen or seeveen 
10 → teeeeeeeen

Special cases:
0 → (Any null value/no output)
1 → o

Criteri vincenti

Questo è il golf in codice . Il codice più breve in ogni lingua vince.

La taglia LoTM rivendicata da Dominic Van Essen!

La prima risposta di Husk a questa domanda riceverà da me una taglia di +50 ripetizioni in aggiunta alla taglia di Zgarb, se soddisfa i criteri indicati qui nella parte Ulteriori sforzi .

Risposte

9 DominicvanEssen Oct 03 2020 at 18:24

R , (110105 96) 96 95 byte

Si spera di rispondere alla domanda corretta ora ...

function(n,a)cat(substring(b<-a[n+1],r<-sort(c(1,l<-nchar(b),rep(3:l-1,n))[1:n]*!!n),r),sep='')

Provalo online!

Doh! Leggi la domanda, stupido!

Ok, i primi (diversi) tentativi non hanno risposto alla domanda corretta, perché non ho letto correttamente la sfida e non ho notato che i primi + ultimi caratteri non dovevano essere ripetuti. Casualmente, però, la riscrittura quasi completa è uscita con lo stesso numero di byte!

Come? Codice ungolfed:

size_up=
function(n,a){              # n is number, a is array of text strings
  b=a[n+1]                  # get the text string for this number
  l=nchar(b)                # get the number of characters
  r=sort(                   # r = sort the indices of characters to output:
      c(1,l,                # we need index 1 and the last index (l)...
        rep(2:(l-1),n))     # then plenty of repeats of 2..(l-1) ...
      [1:n])                # and, from this, we'll use the first n.
  if(n)                     # only output anything if n>0 ...
    cat(substring(b,r,r),sep='')
                            # ...in which case concatenate the indexed
}                           # characters of the text string b.
7 Lynn Oct 05 2020 at 20:17

Haskell , 59 byte

d!n|h:t<-d!!n=take n$h:[t!!div(i*length t-i)(n-1)|i<-[1..]]

Provalo online!

Uso: ["zero","one",...]!n.

Ad esempio, per l'input 11, verrà emesso un 'e'seguito da "leven"indicizzato in: $$ \ left \ lfloor \ frac {4} {10} \ right \ rfloor, \ left \ lfloor \ frac {8} {10} \ right \ rfloor , \ dots, \ left \ lfloor \ frac {40} {10} \ right \ rfloor $$ che è "lleevvveen". (Intuitivamente, la formula estende gli indici da [0..4] "leven"a [0..10].)

take n$viene utilizzato per supportare il caso 0 (altrimenti l'output è "z"), ma ci consente anche di scrivere al [1..]posto di [1..n-1], quindi il costo netto è di soli 4 byte anziché 7.

7 DominicvanEssen Oct 05 2020 at 15:47

Husk , 28 27 25 22 21 byte

Modifica: -2 byte grazie a Zgarb, -3 byte in più grazie a Jo King, e poi -1 byte in più grazie ancora a Zgarb (quegli ultimi 4 byte hanno impiegato un po 'per elaborare e capire; ho aggiunto una spiegazione ma non è facile per i neofiti di Husk come me ...)

SṀ!(O↑¹:1S:ȯ*¹…2←L)!→

Provalo online!

La mia prima risposta di Husk , ispirata alla "lingua del mese".
Porto di approccio nella mia risposta R .
Sono abbastanza felice solo di capire come scrivere un programma funzionante (evviva!), Quindi quasi certamente non è così golfistico come potrebbe essere ...

Come? (commentato dopo i golf di Zgarb e Jo King: è abbastanza complicato ora ...):

Prima di tutto, inseriremo tutti gli argomenti impliciti (come apici ⁰e ²):

SṀ!(O↑²:1S:ȯ*²…2←L)!→²⁰

Ora il codice commentato:

S                               # S is a 'hook' combinator to recycle argument x: Sfgx == fx(gx)
 Ṁ!                             # f is M! = map the list-index function across a list of indexes, with the list to index given by argument x
   (O↑²:1S:ȯ*²…2←L)             # g is (O↑²:1S:ȯ*²…2←L) = function to generate the list of indexes from argument x (see below)
                   !→²⁰         # x is !→²⁰ = the text name of the number (for instance, "twenty"; see below)

                                # Explanation of g:
         S                      # S 'hook' combinator again, so Sfgy here == fy(gy)
          :                     # f is : = prefix with y
           ȯ                    # g is given by ȯ*²…2←
                                # ȯ is 3-function combinator: ȯfgh == single function fgh
                ←               #   subtract 1
              …2                #   and construct a series from 2..this value,  
            *²                  #   and repeat this series n times, with n given by argument 2 (first given program argument);
                                #   so ȯ*²…2← is the function that repeats 2..x, n times, for argument y
                 L              # y is the length of the argument x
                                # So: up to here, we have :Lx *²…2←Lx
       :1                       # Now prefix with 1...
     ↑²                         # then select the first n elements, with n given by argument 2 (first given program argument)...
    O                           # and sort the result.  This is the list of indexes from x.
    
                                # Explanation of x:
                   !  ⁰         # element of argument 1 (second given), indexed by...
                    →²          # argument 2 (first given) +1
6 JonathanAllan Oct 04 2020 at 04:51

Gelatina , 20 byte

ị©L⁸,_2œs/Ẉ⁸>Ø.¤j®x"

Un collegamento diadico che accetta il numero a sinistra e l'elenco dei nomi dei numeri a destra (in ordine di indice Jelly), che fornisce un elenco di caratteri.

Provalo online! Oppure vedi tutti e 100 .

Come?

ị©L⁸,_2œs/Ẉ⁸>Ø.¤j®x" - Link: N, Words
ị                    - (N) index into (Words) -> the word
 ©                   - copy for later
  L                  - length
   ⁸                 - chain's left argument -> N
    ,                - pair -> [N, length(Word)]
     _2              - subtract two -> [N-2, length(Word)-2]
         /           - reduce using:
       œs            -   split (implicit range [1..N-2]) into (length(Word)-2)
                         approximately equal parts
          Ẉ          - length of each -> sizes (call this [s1, s2, ...])
               ¤     - nilad followed by link(s) as a nilad:
           ⁸         -   chain's left argument -> N
             Ø.      -   bits -> [0,1]
            >        -   greater than? -> [N>0, N>1]
                j    - join -> [N>0, s1, s2, ..., N>1]
                 ®   - recall from earlier -> the word
                   " - zip with:
                  x  -   repeat
6 Jonah Oct 06 2020 at 04:31

J , 40 39 byte

[{.[(]#~1:0 _1}2+/@}.($[:}:@}.@=#\))>@{

Provalo online!

5 HyperNeutrino Oct 03 2020 at 14:39

Python 3 , 98 byte

def f(n,a):x,*s,y=a[n];l=len(s);d=n-2;a[0]=(x+"".join(s[i]*(d//l+(i<d%l))for i in range(l))+y)[:n]

Provalo online!

-8 byte grazie a ovs
-2 byte grazie a pxeger

(-9 byte tra i due perché uno dei byte salvati si sovrappone tra le due ottimizzazioni)

-9 byte in più grazie a ovs

5 Arnauld Oct 03 2020 at 16:08

JavaScript (ES6),  78  73 byte

Aspetta (n)(dictionary). Restituisce una stringa vuota per zero.

n=>d=>(s=d[n--],g=k=>k<n?s[~k?k/~-n*(s.length-2)+1|0||2:0]+g(k+1):'')(-1)

Provalo online!

5 GalenIvanov Oct 03 2020 at 19:18

K (oK) , 50 46 40 byte

-4 byte grazie a ovs

-6 byte grazie a coltim

{x#,/(1,(+/'(-2+#y@x;0N)#2_x#1),1)#'y@x}

Provalo online!

4 corvus_192 Oct 04 2020 at 06:27

Ruggine, 203 byte

|i,a|if i<2{a[i].truncate(i)}else
if let[f,m@..,l]=&*a[i].clone(){let mut v:Vec<_>=(0..m.len()).cycle().take(i-2).collect();v.sort();a[i]=v.iter().map(|&j|m[j]).collect();a[i].insert(0,*f);a[i].push(*l)}

Provalo online

Una chiusura di tipo fn(usize,&mut [Vec<char>]). Il risultato è scritto in formato a[i].

4 ovs Oct 04 2020 at 13:54

APL (Dyalog Unicode) , 39 37 36 byte

-2 byte grazie a Razetime !
-1 byte grazie a Jo King !

Presume ⎕IO←0.

⊃∘⌷{⍵↑⍺/⍨1,⍨1,(⍵-2)(⌊÷+|⍨>∘⍳⊢)≢2↓⍺}⊣

Provalo online!

Spiegazione

Questa funzione accetta il dizionario come argomento di destra e l'intero come argomento di sinistra.

⊃∘⌷è una funzione che ottiene la parola all'indice sinistro del dizionario destro.
⊣è la funzione di identità sinistra.
La funzione interna { ... }viene quindi chiamata con la parola come argomento a sinistra ⍺e il numero intero come argomento a destra ⍵.

≢2↓⍺è la lunghezza della parola senza i primi due caratteri ( a).
⍵-2è solo l'input intero meno 2( b).

Con questi due argomenti ⌊÷+|⍨>∘⍳⊢viene chiamata la funzione :
⍳⊢crea un vettore indice 0 1 ... a-1.
|⍨calcola b mod a.
>confronta questo con il vettore indice, che risulta in un vettore booleano con b mod a 1'se a - b mod a 0' s.
⌊÷è il pavimento di b÷a.
+aggiunge questo al vettore booleano.

1,antepone a 1, 1,⍨aggiunge a 1.
⍺/vseleziona tanti elementi dalla parola x, come indicato in v. Esempio: 1 3 2 2 2 1/'eleven'≡'ellleevveen'. Questo è commuted ( ⍨) qui per evitare le parentesi.
⍵↑quindi prende il numero di caratteri richiesto. Questo è necessario per 0e 1.

3 Neil Oct 03 2020 at 18:31

Carboncino , 29 byte

NθF⊕θSηFθ§η∧ι⊖÷×⊕⁻ιθ⁻²Lη∨⁻²θ¹

Provalo online! Il collegamento è alla versione dettagliata del codice. Prende l'input come numero e poi il dizionario. Rimuovere i F⊕θSηrisultati in un programma che ridimensiona la seconda riga alla lunghezza indicata sulla prima riga. Fastidiosamente, 2era il numero più difficile da elaborare, poiché sia ​​il primo che l'ultimo carattere sono casi limite. Spiegazione:

Nθ

Input n.

F⊕θSη

Leggi nel dizionario fino a includere la voce per n.

Fθ

Ripeti i ncaratteri. ( ⭆θfunziona anche.)

§η

Emette il carattere della parola del dizionario data dall'indice calcolato.

∧ι

Per il primo carattere dell'output l'indice calcolato è sempre 0.

⊖÷×⊕⁻ιθ⁻²Lη∨⁻²θ¹

Altrimenti scala la distanza dalla fine della stringa da 0..n-2a 0..l-2(dove lè la lunghezza della parola del dizionario), arrotondata per eccesso. Nota che questo si traduce in 0/0per n=2, quindi 1in questo caso il denominatore è forzato . Esempio per n=5, five:

i=0 o=0
i=1 o=3-ceil((4-1)*(4-2)/(5-2))=3-ceil(3*2/3)=3-2=1
i=2 o=3-ceil((4-2)*(4-2)/(5-2))=3-ceil(2*2/3)=3-2=1
i=3 o=3-ceil((4-3)*(4-2)/(5-2))=3-ceil(1*2/3)=3-1=2
i=4 o=3-ceil((4-4)*(4-2)/(5-2))=3-ceil(0*2/3)=3-0=3

Pertanto gli indici di output 0, 1, 1, 2, 3risultano fiive. (In realtà i calcoli vengono eseguiti utilizzando indici negativi, quindi gli indici effettivi lo sono 0, -3, -3, -2, -1, il che significa che sono effettivamente arrotondati per difetto, anziché per eccesso).

3 KjetilS. Oct 04 2020 at 03:41

Perl 5 , 77 byte

sub{@w=@{$d[$n=pop]};$h=$n<4?2:(@w-2)/($n-2);join'',@w[map.99+$h*$_,0..$n-1]}

Provalo online!

3 corvus_192 Oct 04 2020 at 04:21

Scala, 93 byte

i=>a=>{val f+:m:+l=a(i);(f+:Seq.fill(i)(m.indices).flatten.take(i-2).sorted.map(m):+l)take i}

Provalo online!

Definisce una funzione di tipo Int=>Seq[Seq[Char]]=>Seq[Char].

Spiegazione:

i => a => {                  // define a curried lambda function with two arguments
  val f+:m:+l = a(i)         // destructure the string to extract the first and last letter
  (                          // return...
    f +:                     // the first letter prepended to
      Seq.fill(i)(m.indices) // the numbers from 0 to i-2, all repeated i times
                             // for "seven", this is 7 instances of [0,1,2]
      .flatten               // flatten this list
      .take(i-2)             // take the first i-2  numbers from the list
      .sorted                // sort them
      .map(m)                // and use them as indices for the middle part of the string
    :+l                      // append l
  )
  take i                     // to handle 0 and 1, take i letters from the result
}
2 KevinCruijssen Oct 05 2020 at 14:51

05AB1E , 20 byte

è⍍₂и¾šηε{®ª}0šδè¹ù

Accetta l'elenco di parole come secondo input aggiuntivo.
Emette un elenco di caratteri.

Provalo online o verifica tutto \$[0,99]\$casi di test .

Spiegazione:

è                  # Index the (implicit) input-integer into the (implicit) string-list
 ā                 # Push a list in the range [1,string-length] (without popping)
  ¨¨               # Remove the last two values to make the range [1,length-2]
    ₂и             # Repeat this list 26 times: [1,2,3] → [1,2,3,1,2,3,1,2,3,...]
      ¾š           # Prepend a 0 to this list
        η          # Take all prefixes
         ε         # Map each prefix-list to:
          {        #  Sort the list
           ®ª      #  And append a -1
         }0š       # After the map: prepend a 0 to the list of lists
             δ     # Map over each list:
              è    #  Index it in the string that's still on the stack
                   #  (modulair 0-based, so the -1 indexes into the last character)
               ¹ù  # Keep the list of characters of a length equal to the first input
                   # (after which the result is output implicitly as result)

Se è consentito l'output di un risultato infinito pigro, ₂иpotrebbe essere Þinvece per -1 byte: provalo online .

1 GalenIvanov Oct 06 2020 at 19:56

Fattore , 201 byte

: s ( n d -- s ) dupd 2dup nth length 2 - pick 1 - 1 max dup [ / ] dip swap
<repetition> dup first [ + ] accumulate [ 1 + >integer ] map nip [ nth ] dip
dupd swap nths [ 1 head ] dip append swap head ;

Provalo online!

1 AZTECCO Oct 07 2020 at 01:09

Japt , 25 byte

gV
_uUÊ-2 Ä}hV[0UÊÉ] Í®gU

Provalo

Input :
 U = dictionary
 V = number

gV          - get element from dictionary

hV[0UÊÉ]    - build a list of V indexes,
              starting with [0 , last idx] 
              and calling the following function on last element to generate next items.
_uUÊ-2 Ä}   - returns number modulo( literal length -2) + 1

Example : 11 - eleven
[0,5] -> 5%4+1
[0,5,2] -> 2%4+1
[0,5,2,3]
[0,5,2,3,4,1,..]
     
ͮgU         - sort and maps to literal

-P flag to join result