Оцените число
вступление
Учитывая целое число \$< 100,\$ расширить / сократить английское представление числа, чтобы оно содержало столько же символов, сколько и его значение.
Песочница
Правила
Возьмите число \$n\$, и найдите это словами из этого словаря. Вы можете использовать этот словарь как угодно. (список, чтение по ссылке, аргумент командной строки, STDIN, переменная и т. д.)
Вот файл в виде массива JSON. (Любезно предоставлено Lyxal)
Затем проделайте со строкой следующее:
- Если длина строки меньше числа, повторите некоторые из ее символов на месте, пока длина не совпадет с числом.
- Первый и последний символы не должны повторяться, а количество повторений других символов должно отличаться не более чем на единицу (таким образом, вы можете повторять одни из них 5 раз, а другие 6 раз, например, неважно, какие точно).
- Если длина строки больше числа, удалите любой из ее символов, кроме первого и последнего, чтобы длина соответствовала числу. 1 и 0 - исключения, так как они слишком малы.
- Порядок букв в строке должен быть сохранен.
- Пример:
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
Пошаговый прогон
Взяв 11 в качестве примера,
(в формате word → length)
eleven → 6
^
elleven → 7
^
elleeven → 8
^
elleevven → 9
^
elleevveen → 10
^
ellleevveen → 11 (end)
Примеры
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
Критерии победы
Это код-гольф . Самый короткий код на каждом языке побеждает.
Доминик Ван Эссен объявил награду LoTM !
За первый ответ Хаск на этот вопрос я получу награду в размере 50 репутации сверх награды Згарба, если он удовлетворяет критериям, изложенным здесь в разделе « Дополнительные усилия» .
Ответы
R , (110 105 96) 96 95 байт
Надеюсь, теперь отвечу на правильный вопрос ...
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='')
Попробуйте онлайн!
Дох! Прочтите вопрос, тупица!
Хорошо, первые (несколько) попыток не дали ответа на правильный вопрос, потому что я неправильно прочитал задание и не заметил, что первые + последние символы не должны повторяться. Однако по совпадению почти полная перезапись вышла с тем же количеством байтов!
Как? Код без присмотра:
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 байт
d!n|h:t<-d!!n=take n$h:[t!!div(i*length t-i)(n-1)|i<-[1..]]
Попробуйте онлайн!
Использование: ["zero","one",...]!n.
Например, для ввода 11он будет выводить, за 'e'которым следует "leven"индекс: $$ \ left \ lfloor \ frac {4} {10} \ right \ rfloor, \ left \ lfloor \ frac {8} {10} \ right \ rfloor , \ dots, \ left \ lfloor \ frac {40} {10} \ right \ rfloor $$, который есть "lleevvveen". (Интуитивно формула растягивает индексы с [0..4] "leven"до [0..10].)
take n$используется для поддержки случая 0 (в противном случае - вывод "z"), но он также позволяет нам писать [1..]вместо [1..n-1], поэтому чистая стоимость составляет всего 4 байта, а не 7.
Шелуха , 28 27 25 22 21 байт
Изменить: -2 байта благодаря Zgarb, -3 больше байта благодаря Jo King, а затем еще -1 байт, снова благодаря Zgarb (эти последние 4 байта потребовали времени, чтобы проработать и понять; я добавил объяснение, но для новичков Husk вроде меня это непросто ...)
SṀ!(O↑¹:1S:ȯ*¹…2←L)!→
Попробуйте онлайн!
Мой первый ответ Husk , вдохновленный «языком месяца».
Порт подхода в моем R ответа .
Я очень счастлив просто придумать, как написать рабочую программу (ура!), Так что это почти наверняка не так круто, как могло бы быть ...
Как? (прокомментировал после игры в гольф Згарба и Джо Кинга: теперь это довольно сложно ...):
Прежде всего, мы введем все неявные аргументы (в виде надстрочных индексов ⁰и ²):
SṀ!(O↑²:1S:ȯ*²…2←L)!→²⁰
Теперь закомментированный код:
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
Желе , 20 байт
ị©L⁸,_2œs/Ẉ⁸>Ø.¤j®x"
Двоичная ссылка, принимающая номер слева и список имен номеров справа (в порядке индекса Jelly), что дает список символов.
Попробуйте онлайн! Или посмотреть все 100 .
Как?
ị©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 байт
[{.[(]#~1:0 _1}2+/@}.($[:}:@}.@=#\))>@{
Попробуйте онлайн!
Python 3 , 98 байт
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]
Попробуйте онлайн!
-8 байт благодаря ovs
-2 байта благодаря pxeger
(-9 байтов между ними, потому что один из сохраненных байтов перекрывается между двумя оптимизациями)
-9 байт больше благодаря ovs
JavaScript (ES6), 78 73 байта
Ожидает (n)(dictionary). Возвращает пустую строку для нуля.
n=>d=>(s=d[n--],g=k=>k<n?s[~k?k/~-n*(s.length-2)+1|0||2:0]+g(k+1):'')(-1)
Попробуйте онлайн!
K (oK) , 50 46 40 байт
-4 байта благодаря ovs
-6 байт благодаря coltim
{x#,/(1,(+/'(-2+#y@x;0N)#2_x#1),1)#'y@x}
Попробуйте онлайн!
Ржавчина, 203 байта
|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)}
Попробуйте онлайн
Замыкание типа fn(usize,&mut [Vec<char>]). Результат записывается в формате a[i].
APL (Dyalog Unicode) , 39 37 36 байт
-2 байта благодаря Razetime !
-1 байт спасибо Джо Кинг !
Предполагает ⎕IO←0.
⊃∘⌷{⍵↑⍺/⍨1,⍨1,(⍵-2)(⌊÷+|⍨>∘⍳⊢)≢2↓⍺}⊣
Попробуйте онлайн!
Объяснение
Эта функция принимает словарь в качестве правого аргумента и целое число в качестве левого аргумента.
⊃∘⌷- это функция, которая получает слово по левому индексу в правом словаре.
⊣- левая тождественная функция.
Затем { ... }вызывается внутренняя функция со словом в качестве левого аргумента ⍺и целым числом в качестве правого аргумента ⍵.
≢2↓⍺- длина слова без первых двух символов ( a).
⍵-2- это просто целочисленный ввод минус 2( b).
С этими двумя аргументами ⌊÷+|⍨>∘⍳⊢вызывается функция :
⍳⊢создает индексный вектор 0 1 ... a-1.
|⍨вычисляет b mod a.
>сравнивает его с индексным вектором, в результате получается логический вектор с b mod a 1's и a - b mod a 0' s.
⌊÷этаж b÷a.
+добавляет это к логическому вектору.
1,добавляет в начало 1, 1,⍨добавляет 1.
⍺/vвыбирает столько элементов из слова x, сколько указано в v. Пример: 1 3 2 2 2 1/'eleven'≡'ellleevveen'. Здесь это commuted ( ⍨), чтобы избежать скобок.
⍵↑затем принимает необходимое количество символов. Это необходимо для 0и 1.
Уголь , 29 байт
NθF⊕θSηFθ§η∧ι⊖÷×⊕⁻ιθ⁻²Lη∨⁻²θ¹
Попробуйте онлайн! Ссылка на подробную версию кода. Принимает ввод как число, а затем словарь. Удаление F⊕θSηрезультатов в программе, которая изменяет размер второй строки до длины, указанной в первой строке. К сожалению, 2это число было самым сложным для обработки, поскольку и первый, и последний символы являются крайними. Пояснение:
Nθ
Вход n.
F⊕θSη
Прочтите в словаре до слова для n.
Fθ
Перебирайте nперсонажей. ( ⭆θтоже работает.)
§η
Выведите символ словарного слова, заданный вычисленным индексом.
∧ι
Для первого символа вывода всегда вычисляется индекс 0.
⊖÷×⊕⁻ιθ⁻²Lη∨⁻²θ¹
В противном случае масштабируйте расстояние до конца строки от 0..n-2до 0..l-2(где lдлина словарного слова) с округлением в большую сторону. Обратите внимание, что это приводит 0/0к n=2, поэтому знаменатель 1в этом случае приводится к значению . Пример для 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
Таким образом, выходные индексы имеют 0, 1, 1, 2, 3результатом fiive. (На самом деле расчеты выполняются с использованием отрицательных индексов, поэтому фактические индексы таковы 0, -3, -3, -2, -1, что означает, что они фактически округляются в меньшую сторону, а не в большую.)
Perl 5 , 77 байт
sub{@w=@{$d[$n=pop]};$h=$n<4?2:(@w-2)/($n-2);join'',@w[map.99+$h*$_,0..$n-1]}
Попробуйте онлайн!
Scala, 93 байта
i=>a=>{val f+:m:+l=a(i);(f+:Seq.fill(i)(m.indices).flatten.take(i-2).sorted.map(m):+l)take i}
Попробуйте онлайн!
Определяет функцию типа Int=>Seq[Seq[Char]]=>Seq[Char].
Пояснение:
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 байт
è⍍₂и¾šηε{®ª}0šδè¹ù
Принимает список слов как дополнительный второй ввод.
Выводится в виде списка символов.
Попробуйте онлайн или проверьте все \$[0,99]\$тестовые случаи .
Пояснение:
è # 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)
Если разрешен вывод ленивого бесконечного результата, вместо этого ₂иможно использовать Þ-1 байт: попробуйте онлайн .
Фактор , 201 байт
: 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 ;
Попробуйте онлайн!
Japt , 25 байт
gV
_uUÊ-2 Ä}hV[0UÊÉ] Í®gU
Попытайся
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