Evaluar un número
Intro
Dado un número entero \$< 100,\$ extienda / acorte la representación en inglés del número para tener tantos caracteres como su valor.
Salvadera
Reglas
Toma el número \$n\$y consígalo en palabras de este diccionario. Puede utilizar este diccionario de la forma que prefiera. (una lista, lectura del enlace, línea de comando arg, STDIN, variable, etc.)
Aquí está el archivo como una matriz JSON. (Cortesía de Lyxal)
Luego, haz lo siguiente con la cadena:
- Si la longitud de la cadena es menor que el número, repita algunos de sus caracteres en su lugar hasta que la longitud coincida con el número.
- El primer y el último carácter no deben repetirse, y el número de repeticiones de los demás caracteres debe diferir como máximo en uno (para que puedas repetir algunos de ellos 5 veces y otros 6 veces, por ejemplo; no importa cuáles exactamente).
- Si la longitud de la cadena es mayor que el número, elimine cualquiera de sus caracteres excepto el primero y el último para que la longitud coincida con el número. 1 y 0 son excepciones, ya que son demasiado pequeños.
- Debe mantenerse el orden de las letras de la cadena.
- Ejemplo:
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
Revisión paso a paso
Tomando 11 como ejemplo,
(formateado como word → length)
eleven → 6
^
elleven → 7
^
elleeven → 8
^
elleevven → 9
^
elleevveen → 10
^
ellleevveen → 11 (end)
Ejemplos
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
Criterios ganadores
Esto es código de golf . Gana el código más corto en cada idioma.
¡La recompensa de LoTM reclamada por Dominic Van Essen!
La primera respuesta de Husk a esta pregunta obtendrá una recompensa de +50 por mi parte además de la recompensa de Zgarb, si cumple los criterios establecidos aquí en la parte de Esfuerzos adicionales .
Respuestas
R , (110105 96) 96 95 bytes
Ojalá responda la pregunta correcta ahora ...
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='')
¡Pruébelo en línea!
Doh! ¡Lee la pregunta, estúpido!
Ok, los primeros (varios) intentos no respondieron la pregunta correcta, porque no leí el desafío correctamente y no noté que el primer + último carácter no debería repetirse. Sin embargo, casualmente, ¡la reescritura casi completa salió con la misma cantidad de bytes!
¿Cómo? Código sin golf:
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.
Haskell , 59 bytes
d!n|h:t<-d!!n=take n$h:[t!!div(i*length t-i)(n-1)|i<-[1..]]
¡Pruébelo en línea!
Uso: ["zero","one",...]!n.
Por ejemplo, para la entrada 11, generará un 'e'seguido de "leven"indexado en: $$ \ left \ lfloor \ frac {4} {10} \ right \ rfloor, \ left \ lfloor \ frac {8} {10} \ right \ rfloor , \ dots, \ left \ lfloor \ frac {40} {10} \ right \ rfloor $$ que es "lleevvveen". (De manera intuitiva, la fórmula extiende los índices [0..4] de "leven"a [0..10].)
take n$se usa para admitir el caso 0 (de lo contrario, la salida es "z"), pero también nos permite escribir en [1..]lugar de [1..n-1], por lo que el costo neto es de solo 4 bytes en lugar de 7.
Cáscara , 28 27 25 22 21 bytes
Editar: -2 bytes gracias a Zgarb, -3 bytes más gracias a Jo King, y luego -1 byte más gracias de nuevo a Zgarb (esos últimos 4 bytes tardaron un tiempo en trabajar y comprender; he agregado una explicación pero no es fácil para los novatos de Husk como yo ...)
SṀ!(O↑¹:1S:ȯ*¹…2←L)!→
¡Pruébelo en línea!
Mi primera respuesta de Husk , inspirada en el 'idioma del mes'.
Puerto del enfoque en mi R respuesta .
Estoy bastante feliz de descubrir cómo escribir un programa que funcione (¡hurra!), Por lo que es casi seguro que no sea tan golfista como podría ser ...
¿Cómo? (comentado después de los campos de golf de Zgarb & Jo King: ahora es bastante complicado ...):
En primer lugar, colocaremos todos los argumentos implícitos (como superíndices ⁰y ²):
SṀ!(O↑²:1S:ȯ*²…2←L)!→²⁰
Ahora el código comentado:
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
Gelatina , 20 bytes
ị©L⁸,_2œs/Ẉ⁸>Ø.¤j®x"
Un enlace diádico que acepta el número de la izquierda y la lista de nombres de números a la derecha (en orden de índice Jelly), lo que produce una lista de caracteres.
¡Pruébelo en línea! O ver los 100 .
¿Cómo?
ị©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
J , 40 39 bytes
[{.[(]#~1:0 _1}2+/@}.($[:}:@}.@=#\))>@{
¡Pruébelo en línea!
Python 3 , 98 bytes
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]
¡Pruébelo en línea!
-8 bytes gracias a ovs
-2 bytes gracias a pxeger
(-9 bytes entre los dos porque uno de los bytes guardados se superpone entre las dos optimizaciones)
-9 bytes más gracias a ovs
JavaScript (ES6), 78 73 bytes
Espera (n)(dictionary). Devuelve una cadena vacía para cero.
n=>d=>(s=d[n--],g=k=>k<n?s[~k?k/~-n*(s.length-2)+1|0||2:0]+g(k+1):'')(-1)
¡Pruébelo en línea!
K (OK) , 50 46 40 bytes
-4 bytes gracias a ovs
-6 bytes gracias a coltim
{x#,/(1,(+/'(-2+#y@x;0N)#2_x#1),1)#'y@x}
¡Pruébelo en línea!
Óxido, 203 bytes
|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)}
Pruébelo en línea
Un cierre de tipo fn(usize,&mut [Vec<char>]). El resultado está escrito en formato a[i].
APL (Dyalog Unicode) , 39 37 36 bytes
-2 bytes gracias a Razetime !
-1 byte gracias a Jo King !
Asume ⎕IO←0.
⊃∘⌷{⍵↑⍺/⍨1,⍨1,(⍵-2)(⌊÷+|⍨>∘⍳⊢)≢2↓⍺}⊣
¡Pruébelo en línea!
Explicación
Esta función toma el diccionario como argumento derecho y el entero como argumento izquierdo.
⊃∘⌷es una función que obtiene la palabra del índice izquierdo en el diccionario derecho.
⊣es la función de identidad de la izquierda.
A { ... }continuación, se llama a la función interna con la palabra como argumento izquierdo ⍺y el entero como argumento derecho ⍵.
≢2↓⍺es la longitud de la palabra sin los dos primeros caracteres ( a).
⍵-2es solo la entrada entera menos 2( b).
Con estos dos argumentos ⌊÷+|⍨>∘⍳⊢se llama a la función :
⍳⊢crea un vector índice 0 1 ... a-1.
|⍨calcula b mod a.
>compara esto con el vector de índice, que da como resultado un vector booleano con b mod a 1'sy a - b mod a 0'.
⌊÷es el piso de b÷a.
+agrega esto al vector booleano.
1,antepone a 1, 1,⍨añade a 1.
⍺/vselecciona tantos elementos de la palabra x, como se indica en v. Ejemplo: 1 3 2 2 2 1/'eleven'≡'ellleevveen'. Esto se conmuta ( ⍨) aquí para evitar los corchetes.
⍵↑luego toma el número requerido de caracteres. Esto es necesario para 0y 1.
Carbón , 29 bytes
NθF⊕θSηFθ§η∧ι⊖÷×⊕⁻ιθ⁻²Lη∨⁻²θ¹
¡Pruébelo en línea! El enlace corresponde a la versión detallada del código. Toma la entrada como el número y luego el diccionario. Eliminar los F⊕θSηresultados en un programa que cambia el tamaño de la segunda línea a la longitud dada en la primera línea. De manera molesta, 2fue el número más difícil de procesar, ya que tanto el primer carácter como el último son casos extremos. Explicación:
Nθ
Entrada n.
F⊕θSη
Leer en el diccionario hasta incluir la entrada para n.
Fθ
Recorra los npersonajes. ( ⭆θtambién funciona)
§η
Muestra el carácter de la palabra del diccionario dada por el índice calculado.
∧ι
Para el primer carácter de la salida, el índice calculado es siempre 0.
⊖÷×⊕⁻ιθ⁻²Lη∨⁻²θ¹
De lo contrario, escale la distancia hasta el final de la cadena de 0..n-2a 0..l-2(donde les la longitud de la palabra del diccionario), redondeando hacia arriba. Tenga en cuenta que esto da como resultado 0/0para n=2, por lo que el denominador se coacciona 1en este caso. Ejemplo para 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
Por lo tanto, los índices de salida dan como 0, 1, 1, 2, 3resultado fiive. (De hecho, los cálculos se realizan utilizando índices negativos, por lo que los índices reales son 0, -3, -3, -2, -1, lo que significa que en realidad se redondean hacia abajo, en lugar de hacia arriba).
Perl 5 , 77 bytes
sub{@w=@{$d[$n=pop]};$h=$n<4?2:(@w-2)/($n-2);join'',@w[map.99+$h*$_,0..$n-1]}
¡Pruébelo en línea!
Scala, 93 bytes
i=>a=>{val f+:m:+l=a(i);(f+:Seq.fill(i)(m.indices).flatten.take(i-2).sorted.map(m):+l)take i}
¡Pruébelo en línea!
Define una función de tipo Int=>Seq[Seq[Char]]=>Seq[Char].
Explicación:
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
}
05AB1E , 20 bytes
è⍍₂и¾šηε{®ª}0šδè¹ù
Toma la lista de palabras como una segunda entrada adicional.
Salidas como una lista de caracteres.
Pruébelo en línea o verifique todo \$[0,99]\$casos de prueba .
Explicación:
è # 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)
Si se permite generar un resultado infinito diferido, ₂иpodría ser Þen su lugar para -1 byte: pruébelo en línea .
Factor , 201 bytes
: 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 ;
¡Pruébelo en línea!
Japonés , 25 bytes
gV
_uUÊ-2 Ä}hV[0UÊÉ] Í®gU
Intentalo
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