Größe einer Zahl
Intro
Bei einer ganzen Zahl \$< 100,\$ Erweitern / verkürzen Sie die englische Darstellung der Zahl, um so viele Zeichen wie möglich zu haben.
Sandkasten
Regeln
Nimm die Nummer \$n\$und erhalten Sie es in Worten aus diesem Wörterbuch. Sie können dieses Wörterbuch nach Belieben verwenden. (Eine Liste, gelesen von Link, Befehlszeilenargument, STDIN, Variable usw.)
Hier ist die Datei als JSON-Array. (Mit freundlicher Genehmigung von Lyxal)
Führen Sie dann mit der Zeichenfolge Folgendes aus:
- Wenn die Länge der Zeichenfolge geringer als die Zahl ist, wiederholen Sie einige ihrer Zeichen, bis die Länge mit der Zahl übereinstimmt.
- Das erste und das letzte Zeichen sollten nicht wiederholt werden, und die Anzahl der Wiederholungen der anderen Zeichen sollte sich um höchstens eins unterscheiden (so können Sie einige davon beispielsweise fünfmal und andere sechsmal wiederholen; es spielt keine Rolle, welche genau).
- Wenn die Länge der Zeichenfolge größer als die Zahl ist, entfernen Sie alle Zeichen außer dem ersten und dem letzten, damit die Länge mit der Zahl übereinstimmt. 1 und 0 sind Ausnahmen, da sie zu klein sind.
- Die Reihenfolge der Buchstaben in der Zeichenfolge muss beibehalten werden.
- Beispiel:
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
Schritt für Schritt durchlaufen
Am Beispiel 11,
(formatiert als word → length)
eleven → 6
^
elleven → 7
^
elleeven → 8
^
elleevven → 9
^
elleevveen → 10
^
ellleevveen → 11 (end)
Beispiele
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
Gewinnkriterien
Das ist Code-Golf . Der kürzeste Code in jeder Sprache gewinnt.
LoTM Bounty von Dominic Van Essen beansprucht!
Die erste Husk-Antwort auf diese Frage erhält von mir zusätzlich zu Zgarbs Kopfgeld ein Kopfgeld von +50 Wiederholungen, wenn es die hier im Teil " Zusätzliche Anstrengungen" aufgeführten Kriterien erfüllt .
Antworten
R , (110 105 96) 96 95 Bytes
Hoffentlich beantworte ich jetzt die richtige Frage ...
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='')
Probieren Sie es online aus!
Doh! Lies die Frage, dumm!
Ok, die ersten (mehreren) Versuche beantworteten nicht die richtige Frage, da ich die Herausforderung nicht richtig gelesen habe und nicht bemerkt habe, dass die ersten und letzten Zeichen nicht wiederholt werden sollten. Zufälligerweise kam das fast vollständige Umschreiben mit der gleichen Anzahl von Bytes heraus!
Wie? Ungolfed Code:
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..]]
Probieren Sie es online aus!
Verwendung : ["zero","one",...]!n.
Für die Eingabe 11wird beispielsweise ein Index ausgegeben, 'e'gefolgt von "leven": $$ \ left \ lfloor \ frac {4} {10} \ right \ rfloor, \ left \ lfloor \ frac {8} {10} \ right \ rfloor , \ dots, \ left \ lfloor \ frac {40} {10} \ right \ rfloor $$ das ist "lleevvveen". (Intuitiv streckt die Formel die Indizes [0..4] von "leven"bis [0..10].)
take n$wird verwendet, um den Fall 0 zu unterstützen (andernfalls ist die Ausgabe "z"), aber es ermöglicht uns auch, [1..]stattdessen zu schreiben [1..n-1], sodass die Nettokosten nur 4 Bytes anstatt 7 betragen.
Schale , 28 27 25 22 21 Bytes
Bearbeiten: -2 Bytes dank Zgarb, -3 weitere Bytes dank Jo King und dann -1 weitere Bytes dank Zgarb (diese letzten 4 Bytes haben eine Weile gedauert, um sie durchzuarbeiten und zu verstehen; ich habe aber eine Erklärung hinzugefügt es ist nicht einfach für Husk- Neulinge wie mich ...)
SṀ!(O↑¹:1S:ȯ*¹…2←L)!→
Probieren Sie es online aus!
Meine erste Husk- Antwort, inspiriert von der "Sprache des Monats".
Port des Ansatzes in meiner R-Antwort .
Ich bin ziemlich glücklich, nur herauszufinden, wie man ein Arbeitsprogramm schreibt (Hurra!), Also ist es mit ziemlicher Sicherheit nicht so golfig wie es sein könnte ...
Wie? (Kommentar nach Zgarb & Jo Kings Golf: Es ist jetzt ziemlich kompliziert ...):
Zunächst geben wir alle impliziten Argumente ein (als hochgestellte Zeichen ⁰und ²):
SṀ!(O↑²:1S:ȯ*²…2←L)!→²⁰
Nun der kommentierte Code:
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
Gelee , 20 Bytes
ị©L⁸,_2œs/Ẉ⁸>Ø.¤j®x"
Ein dyadischer Link, der die Nummer links und die Liste der Nummernnamen rechts (in der Reihenfolge des Jelly-Index) akzeptiert und eine Liste der Zeichen ergibt.
Probieren Sie es online aus! Oder sehen Sie alle 100 .
Wie?
ị©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+/@}.($[:}:@}.@=#\))>@{
Probieren Sie es online aus!
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]
Probieren Sie es online aus!
-8 Bytes dank ovs
-2 Bytes dank pxeger
(-9 Bytes zwischen den beiden, da sich eines der gespeicherten Bytes zwischen den beiden Optimierungen überschneidet)
-9 weitere Bytes dank Ovs
JavaScript (ES6), 78 73 Byte
Erwartet (n)(dictionary). Gibt eine leere Zeichenfolge für Null zurück.
n=>d=>(s=d[n--],g=k=>k<n?s[~k?k/~-n*(s.length-2)+1|0||2:0]+g(k+1):'')(-1)
Probieren Sie es online aus!
K (oK) , 50 46 40 Bytes
-4 Bytes dank Ovs
-6 Bytes dank Coltim
{x#,/(1,(+/'(-2+#y@x;0N)#2_x#1),1)#'y@x}
Probieren Sie es online aus!
Rost, 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)}
Probieren Sie es online aus
Ein Verschluss vom Typ fn(usize,&mut [Vec<char>]). Das Ergebnis wird in geschrieben a[i].
APL (Dyalog Unicode) , 39 37 36 Byte
-2 Bytes dank Razetime !
-1 Byte danke an Jo King !
Nimmt an ⎕IO←0.
⊃∘⌷{⍵↑⍺/⍨1,⍨1,(⍵-2)(⌊÷+|⍨>∘⍳⊢)≢2↓⍺}⊣
Probieren Sie es online aus!
Erläuterung
Diese Funktion verwendet das Wörterbuch als rechtes Argument und die Ganzzahl als linkes Argument.
⊃∘⌷ist eine Funktion, die das Wort am linken Index im rechten Wörterbuch abruft.
⊣ist die linke Identitätsfunktion.
Die innere Funktion { ... }wird dann mit dem Wort als linkes Argument ⍺und der Ganzzahl als rechtem Argument aufgerufen ⍵.
≢2↓⍺ist die Länge des Wortes ohne die ersten beiden Zeichen ( a).
⍵-2ist nur die ganzzahlige Eingabe minus 2( b).
Mit diesen beiden Argumenten wird die Funktion ⌊÷+|⍨>∘⍳⊢aufgerufen:
⍳⊢Erstellt einen Indexvektor 0 1 ... a-1.
|⍨berechnet b mod a.
>vergleicht dies mit dem Indexvektor, der einen booleschen Vektor mit b mod a 1's und a - b mod a 0' s ergibt .
⌊÷ist der Boden von b÷a.
+fügt dies dem booleschen Vektor hinzu.
1,stellt a voran 1, 1,⍨fügt a hinzu 1.
⍺/vwählt so viele Elemente aus dem Wort x aus, wie in angegeben v. Beispiel : 1 3 2 2 2 1/'eleven'≡'ellleevveen'. Dies wird hier umgerechnet ( ⍨), um Klammern zu vermeiden.
⍵↑nimmt dann die erforderliche Anzahl von Zeichen. Dies ist erforderlich für 0und 1.
Holzkohle , 29 Bytes
NθF⊕θSηFθ§η∧ι⊖÷×⊕⁻ιθ⁻²Lη∨⁻²θ¹
Probieren Sie es online aus! Der Link führt zur ausführlichen Version des Codes. Nimmt die Eingabe als Nummer und dann als Wörterbuch. Entfernen der F⊕θSηErgebnisse in einem Programm, das die Größe der zweiten Zeile auf die in der ersten Zeile angegebene Länge ändert. Ärgerlicherweise 2war die Zahl am schwierigsten zu verarbeiten, da sowohl das erste als auch das letzte Zeichen Randfälle sind. Erläuterung:
Nθ
Eingabe n.
F⊕θSη
Lesen Sie das Wörterbuch bis einschließlich des Eintrags für ein n.
Fθ
nZeichen durchlaufen . ( ⭆θfunktioniert auch.)
§η
Geben Sie das Zeichen des Wörterbuchworts aus, das vom berechneten Index angegeben wird.
∧ι
Für das erste Zeichen der Ausgabe ist immer der berechnete Index 0.
⊖÷×⊕⁻ιθ⁻²Lη∨⁻²θ¹
Andernfalls skalieren Sie den Abstand bis zum Ende der Zeichenfolge von 0..n-2bis 0..l-2(wobei ldie Länge des Wörterbuchworts ist), aufgerundet. Beachten Sie, dass dies zu 0/0for führt n=2, sodass 1in diesem Fall der Nenner erzwungen wird. Beispiel für 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
Daher werden die Ausgangsindizes 0, 1, 1, 2, 3führt fiive. (Tatsächlich werden die Berechnungen mit negativen Indizes durchgeführt, also mit den tatsächlichen Indizes 0, -3, -3, -2, -1, was bedeutet, dass sie tatsächlich abgerundet und nicht aufgerundet werden.)
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]}
Probieren Sie es online aus!
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}
Probieren Sie es online aus!
Definiert eine Funktion vom Typ Int=>Seq[Seq[Char]]=>Seq[Char].
Erläuterung:
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šδè¹ù
Nimmt die Liste der Wörter als zusätzliche zweite Eingabe.
Gibt als Liste von Zeichen aus.
Probieren Sie es online aus oder überprüfen Sie alle \$[0,99]\$Testfälle .
Erläuterung:
è # 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)
Wenn die Ausgabe eines faulen unendlichen Ergebnisses zulässig ist, ₂иkönnte dies Þstattdessen für -1 Byte sein: Versuchen Sie es online .
Faktor 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 ;
Probieren Sie es online aus!
Japt , 25 Bytes
gV
_uUÊ-2 Ä}hV[0UÊÉ] Í®gU
Versuch es
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