Ukur angka
Intro
Diberikan bilangan bulat \$< 100,\$ memperpanjang / mempersingkat representasi bahasa Inggris dari nomor tersebut untuk memiliki karakter sebanyak nilainya.
Bak pasir
Aturan
Ambil nomornya \$n\$, dan dapatkan dengan kata-kata dari kamus ini. Anda dapat menggunakan kamus ini dengan cara apa pun yang Anda inginkan. (daftar, baca dari tautan, baris perintah arg, STDIN, variabel, dll.)
Berikut file tersebut sebagai JSON Array. (Atas kebaikan Lyxal)
Kemudian, lakukan hal berikut dengan string:
- Jika panjang string lebih rendah dari angkanya, ulangi beberapa karakternya di tempat sampai panjangnya cocok dengan angkanya.
- Karakter pertama dan terakhir tidak boleh diulang, dan jumlah pengulangan karakter lain harus berbeda paling banyak satu (sehingga Anda dapat mengulang beberapa dari mereka 5 kali dan yang lain 6 kali, misalnya; tidak masalah yang mana persis).
- Jika panjang string lebih besar dari angkanya, hapus salah satu karakternya kecuali yang pertama dan terakhir agar panjangnya cocok dengan angkanya. 1 dan 0 adalah pengecualian, karena terlalu kecil.
- Urutan huruf dalam string harus dijaga.
- Contoh:
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
Jalankan langkah demi langkah
Mengambil 11 sebagai contoh,
(diformat sebagai word → length)
eleven → 6
^
elleven → 7
^
elleeven → 8
^
elleevven → 9
^
elleevveen → 10
^
ellleevveen → 11 (end)
Contoh
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
Kriteria Kemenangan
Ini adalah kode-golf . Kode terpendek di setiap bahasa menang.
Bounty LoTM Diklaim oleh Dominic Van Essen!
Jawaban Husk pertama untuk pertanyaan ini akan mendapatkan +50 rep bounty dari saya di atas bounty Zgarb, jika memenuhi kriteria yang ditetapkan di sini di bagian Upaya Tambahan .
Jawaban
R , (110105 96) 96 95 byte
Semoga menjawab pertanyaan yang benar sekarang ...
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='')
Cobalah secara online!
Doh! Baca pertanyaannya, bodoh!
Oke, percobaan pertama (beberapa) tidak menjawab pertanyaan yang benar, karena saya tidak membaca tantangan dengan benar dan tidak memperhatikan bahwa karakter pertama + terakhir tidak boleh diulang. Namun, secara kebetulan, penulisan ulang yang hampir selesai keluar pada jumlah byte yang sama!
Bagaimana? Kode tidak terputus:
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 byte
d!n|h:t<-d!!n=take n$h:[t!!div(i*length t-i)(n-1)|i<-[1..]]
Cobalah secara online!
Penggunaan: ["zero","one",...]!n.
Misalnya, untuk masukan 11, akan keluar keluaran yang 'e'diikuti dengan "leven"diindeks di: $$ \ left \ lfloor \ frac {4} {10} \ right \ rfloor, \ left \ lfloor \ frac {8} {10} \ right \ rfloor , \ dots, \ left \ lfloor \ frac {40} {10} \ right \ rfloor $$ yang mana "lleevvveen". (Secara intuitif, rumus meregangkan indeks [0..4] "leven"menjadi [0..10].)
take n$digunakan untuk mendukung kasus 0 (jika tidak, outputnya adalah "z"), tetapi juga memungkinkan kita menulis [1..]alih-alih [1..n-1], jadi biaya bersih hanya 4 byte daripada 7.
Husk , 28 27 25 22 21 byte
Sunting: -2 byte berkat Zgarb, -3 byte lebih banyak berkat Jo King, dan kemudian -1 byte lagi terima kasih lagi kepada Zgarb (4 byte terakhir membutuhkan beberapa saat untuk diselesaikan dan dipahami; Saya telah menambahkan penjelasan tetapi tidak mudah bagi pemula Husk seperti saya ...)
SṀ!(O↑¹:1S:ȯ*¹…2←L)!→
Cobalah secara online!
Jawaban Husk pertama saya , terinspirasi oleh 'bahasa bulan ini'.
Pelabuhan pendekatan dalam jawaban R saya .
Saya cukup senang hanya untuk mengetahui cara menulis program kerja (hore!), Jadi hampir pasti tidak se-golf mungkin ...
Bagaimana? (berkomentar setelah permainan golf Zgarb & Jo King: sekarang cukup rumit ...):
Pertama-tama, kita akan memasukkan semua argumen implisit (sebagai superskrip ⁰dan ²):
SṀ!(O↑²:1S:ȯ*²…2←L)!→²⁰
Sekarang kode yang dikomentari:
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
Jelly , 20 byte
ị©L⁸,_2œs/Ẉ⁸>Ø.¤j®x"
Tautan diadik menerima nomor di sebelah kiri dan daftar nama-nomor di sebelah kanan (dalam urutan indeks Jeli), yang menghasilkan daftar karakter.
Cobalah secara online! Atau lihat semua 100 .
Bagaimana?
ị©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 byte
[{.[(]#~1:0 _1}2+/@}.($[:}:@}.@=#\))>@{
Cobalah secara online!
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]
Cobalah secara online!
-8 byte berkat ovs
-2 byte berkat pxeger
(-9 byte di antara keduanya karena salah satu byte yang disimpan tumpang tindih di antara dua pengoptimalan)
-9 byte lagi berkat ovs
JavaScript (ES6), 78 73 byte
Berharap (n)(dictionary). Mengembalikan string kosong untuk nol.
n=>d=>(s=d[n--],g=k=>k<n?s[~k?k/~-n*(s.length-2)+1|0||2:0]+g(k+1):'')(-1)
Cobalah secara online!
K (oK) , 50 46 40 byte
-4 byte berkat ovs
-6 byte berkat coltim
{x#,/(1,(+/'(-2+#y@x;0N)#2_x#1),1)#'y@x}
Cobalah secara online!
Rust, 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)}
Cobalah secara online
Jenis penutupan fn(usize,&mut [Vec<char>]). Hasilnya ditulis dalam a[i].
APL (Dyalog Unicode) , 39 37 36 byte
-2 byte berkat Razetime !
-1 byte berkat Jo King !
Asumsikan ⎕IO←0.
⊃∘⌷{⍵↑⍺/⍨1,⍨1,(⍵-2)(⌊÷+|⍨>∘⍳⊢)≢2↓⍺}⊣
Cobalah secara online!
Penjelasan
Fungsi ini mengambil kamus sebagai argumen kanan dan bilangan bulat sebagai argumen kiri.
⊃∘⌷adalah fungsi yang menempatkan kata di indeks kiri di kamus kanan.
⊣adalah fungsi identitas kiri.
Fungsi bagian dalam { ... }kemudian dipanggil dengan kata sebagai argumen kiri ⍺dan integer sebagai argumen kanan ⍵.
≢2↓⍺adalah panjang kata tanpa dua karakter pertama ( a).
⍵-2hanyalah masukan integer minus 2( b).
Dengan dua argumen ini fungsinya ⌊÷+|⍨>∘⍳⊢disebut:
⍳⊢membuat vektor indeks 0 1 ... a-1.
|⍨menghitung b mod a.
>membandingkan ini dengan vektor indeks, yang menghasilkan vektor boolean dengan b mod a 1's dan a - b mod a 0'.
⌊÷adalah lantai b÷a.
+menambahkan ini ke vektor boolean.
1,menambahkan a 1, 1,⍨menambahkan a 1.
⍺/vmemilih sebanyak mungkin item dari kata x, seperti yang ditunjukkan pada v. Contoh: 1 3 2 2 2 1/'eleven'≡'ellleevveen'. Ini diperingan ( ⍨) di sini untuk menghindari tanda kurung.
⍵↑lalu ambil jumlah karakter yang diperlukan. Ini diperlukan untuk 0dan 1.
Arang , 29 byte
NθF⊕θSηFθ§η∧ι⊖÷×⊕⁻ιθ⁻²Lη∨⁻²θ¹
Cobalah secara online! Tautan adalah untuk verbose versi kode. Mengambil masukan sebagai nomor dan kemudian kamus. Menghapus F⊕θSηhasil dalam program yang mengubah ukuran baris kedua dengan panjang yang diberikan pada baris pertama. Yang menjengkelkan, 2adalah angka yang paling sulit untuk diproses, karena karakter pertama dan terakhir adalah kasus tepi. Penjelasan:
Nθ
Masukan n.
F⊕θSη
Baca di kamus sampai dan termasuk entri untuk n.
Fθ
Ulangi nkarakter. ( ⭆θjuga bekerja.)
§η
Keluarkan karakter dari kata kamus yang diberikan oleh indeks yang dihitung.
∧ι
Untuk karakter pertama dari keluaran, indeks yang dihitung selalu 0.
⊖÷×⊕⁻ιθ⁻²Lη∨⁻²θ¹
Jika tidak, skala jarak ke akhir string dari 0..n-2ke 0..l-2(di mana lpanjang kata kamus), dibulatkan. Perhatikan bahwa ini menghasilkan 0/0untuk n=2, jadi penyebut dipaksa menjadi 1dalam kasus ini. Contoh untuk 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
Oleh karena itu indeks output 0, 1, 1, 2, 3yang dihasilkan di fiive. (Sebenarnya kalkulasi dilakukan dengan menggunakan indeks negatif, jadi indeks sebenarnya adalah 0, -3, -3, -2, -1, yang berarti sebenarnya dibulatkan ke bawah, bukan ke atas.)
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]}
Cobalah secara online!
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}
Cobalah secara online!
Mendefinisikan fungsi tipe Int=>Seq[Seq[Char]]=>Seq[Char].
Penjelasan:
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 byte
è⍍₂и¾šηε{®ª}0šδè¹ù
Mengambil daftar kata sebagai masukan kedua tambahan.
Keluaran sebagai daftar karakter.
Cobalah secara online atau verifikasi semua \$[0,99]\$kasus uji .
Penjelasan:
è # 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)
Jika mengeluarkan hasil lazy infinite diperbolehkan, maka ₂иbisa jadi Þ-1 byte: coba online .
Faktorkan , 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 ;
Cobalah secara online!
Japt , 25 byte
gV
_uUÊ-2 Ä}hV[0UÊÉ] Í®gU
Cobalah
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