Оцените число

Oct 03 2020

вступление

Учитывая целое число \$< 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 репутации сверх награды Згарба, если он удовлетворяет критериям, изложенным здесь в разделе « Дополнительные усилия» .

Ответы

9 DominicvanEssen Oct 03 2020 at 18:24

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.
7 Lynn Oct 05 2020 at 20:17

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.

7 DominicvanEssen Oct 05 2020 at 15:47

Шелуха , 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
6 JonathanAllan Oct 04 2020 at 04:51

Желе , 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
6 Jonah Oct 06 2020 at 04:31

J , 40 39 байт

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

Попробуйте онлайн!

5 HyperNeutrino Oct 03 2020 at 14:39

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

5 Arnauld Oct 03 2020 at 16:08

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)

Попробуйте онлайн!

5 GalenIvanov Oct 03 2020 at 19:18

K (oK) , 50 46 40 байт

-4 байта благодаря ovs

-6 байт благодаря coltim

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

Попробуйте онлайн!

4 corvus_192 Oct 04 2020 at 06:27

Ржавчина, 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].

4 ovs Oct 04 2020 at 13:54

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.

3 Neil Oct 03 2020 at 18:31

Уголь , 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, что означает, что они фактически округляются в меньшую сторону, а не в большую.)

3 KjetilS. Oct 04 2020 at 03:41

Perl 5 , 77 байт

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

Попробуйте онлайн!

3 corvus_192 Oct 04 2020 at 04:21

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
}
2 KevinCruijssen Oct 05 2020 at 14:51

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 байт: попробуйте онлайн .

1 GalenIvanov Oct 06 2020 at 19:56

Фактор , 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 ;

Попробуйте онлайн!

1 AZTECCO Oct 07 2020 at 01:09

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