Shortlex में वह संख्या क्या है?


15

अधिकांश कंप्यूटर बाइनरी में पूर्णांक संग्रहीत करते हैं, लेकिन उन्हें दशमलव में आउटपुट करते हैं। हालाँकि, दशमलव सिर्फ एक प्रतिनिधित्व है, हम बस इसे सुविधाजनक खोजने के लिए करते हैं।

यह चुनौती शॉर्टलेक्स दशमलव में पूर्णांक मान को आउटपुट करने के लिए कुछ कोड लिखने के लिए है ।

वह क्या है?
http://en.wikipedia.org/wiki/Shortlex_order

शॉर्टलेक्स मूल्य के प्राथमिक हस्ताक्षरकर्ता के रूप में अंकों के अनुक्रम की लंबाई लेता है। अनुक्रम, शून्य का प्रतिनिधित्व करने वाले एक खाली स्ट्रिंग से शुरू होता है ...

ε,0,1,...,8,9,00,01,...98,99,000,001,...,998,999,0000,...

(एक्सेल कॉलम के बारे में सोचें, लेकिन केवल दशमलव अंकों का उपयोग करें।)

एक प्रोग्राम या फ़ंक्शन लिखें जो एक पूर्णांक को स्वीकार करता है और ऊपर वर्णित के रूप में उस पूर्णांक के शॉर्टलेक्स-दशमलव प्रतिनिधित्व के अनुरूप एक स्ट्रिंग देता है।

परीक्षण मान:

0 → "" (खाली स्ट्रिंग)
1 → "0"
10 → "9"
11 → "00"
42 → "31"
100 → "89"
800 → "689"
1060 → "949"
10270 → "9159"
100901 → "89,390"


2
यह ध्यान रखना महत्वपूर्ण है कि शॉर्टलेक्स 19, 20, 21, 22में दशमलव के नक्शे 08, 09, 10, 11में अनुक्रम। इसलिए मैंने उस उलझन को इस्तेमाल किया100 -> 89 !
सीन लाथम


6
ध्यान दें कि जिसे आप एक नंबर का "शॉर्टलिक दशमलव" कह रहे हैं, वह भी इसका विशेषण आधार-दस अंक है, जिसके प्रतीक {0,1,2,3,4,5,6,7,8,9} के लिए प्रतिस्थापित हैं सामान्य अंक {1,2,3,4,5,6,7,8,9, A}। उदाहरण के लिए, २०१४ सामान्य रूप से आधारभूत-दस संकेतन में १ ए १४ है, और शॉर्टल दशमलव में यह ०
रेस

जवाबों:


34

जावास्क्रिप्ट (ईएस 6) 42 74

n=>(n-~(n+'').replace(/./g,8)+'').slice(1)

फ़ायर्फ़ॉक्स कंसोल में परीक्षण करें

;[0,1,10,11,42,100,800,1060,10270,100501]
.forEach(x => console.log(x +" -> '" + S(x) + "'"))

उत्पादन

0 -> ''
1 -> '0'
10 -> '9'
11 -> '00'
42 -> '31'
100 -> '89'
800 -> '689'
1060 -> '949'
10270 -> '9159'
100501 -> '89390'

मैंने यह कैसे सोचा?

अंकों की निश्चित संख्या को देखते हुए, आउटपुट अनुक्रम बस चढ़ रहा है, इसलिए इनपुट और आउटपुट के बीच एक निश्चित डेल्टा है। एक नज़र देख लो:

  1..10 -> 0..9 (delta -1)
 11..110 -> 00..99 (delta -11)
111..1110 -> 000..999 (delta -111) mmm there's a pattern here...

लेकिन अग्रणी 0s को प्रबंधित करना मुश्किल है, इसलिए मेरे पास एक मानक चाल है, एक पहला अंक जोड़ें और काम मोडुलो (अर्थात, आउटपुट में पहला अंक काटें)। फिर -1-> +9, -11 -> +89, -111 -> +889 और इसी तरह।
अंतिम चरण: मुझे परवाह नहीं है कि पहला अंक क्या है, इसलिए यह जांचने की कोई आवश्यकता नहीं है कि iinput संख्या <या> 111 से अधिक है ... (ईमानदारी से मुझे यह परीक्षण और त्रुटि से मिला)

परीक्षा

var F=
n=>(n-~(n+'').replace(/./g,8)+'').slice(1)

function update()
{
  var i=+I.value
  O.textContent = F(i)
}


update()
<input id=I value=99 type=number oninput='update()'><pre id=O></pre>


8
मुझे नहीं पता कि यह क्यों काम करता है।
मार्टिन एंडर

तुम n-~(n+'')सिर्फ करने के बजाय क्यों करते हो n-~n?
क्लाउडीयू

@ कलौइडु इट (n+'').replace(...), स्ट्रिंग्स पर कामों को प्रतिस्थापित करें, संख्याओं को नहीं।
edc65

@ edc65: उफ़ हाँ अभी-अभी पकड़ा, मेरे कोष्ठक को बेमेल कर दिया। Dayum यह काफी शानदार है
Claudiu

3
@ डेनिस इसे पोर्ट करने के लिए स्वतंत्र महसूस करता है। आप पहले से ही जीत रहे हैं
edc65

13

मारबेलस 177 173 170

@0@6000000@5
}0&0&0&0&0
>0@6&3
\\--\/&2
@0/\@4\/&1!!
@4@1..@2@5@3
IIIIIIIIIIII
FF&1FF&2FF&3
@1OO@2OO@3OO
:I
}1..}10001F7
=9&1++..&1&0
&0}0&1&0{1{1
{>\/{0//
:O
}0
+Z
+C
{0

यह केवल 256 से कम मूल्यों के लिए काम करता है क्योंकि मारबेलस एक 8 बिट भाषा है।

यह काम किस प्रकार करता है

Marbelous एक 2 डी भाषा है जिसमें 8 बिट मार्बल्स द्वारा दर्शाए गए मान हैं जो प्रत्येक टिक पर एक सेल नीचे गिरते हैं जब तक कि कोई डिवाइस उन्हें गिरने से रोकता नहीं है। इस मारबेलस कार्यक्रम में 3 बोर्ड होते हैं; चलो सबसे आसान के साथ शुरू करते हैं:

:O
}0
+Z
+C
{0

:Oबोर्ड का नाम है (सटीक होने के लिए, ओ नाम है और: व्याख्या की गई है कि यह रेखा एक नाम है। बोर्डों को एक नाम देकर, अन्य बोर्ड उन पर कॉल कर सकते हैं }0एक इनपुट डिवाइस है, इसे एक इनपुट के रूप में देखा जा सकता है। इस फ़ंक्शन का तर्क। इस सेल को इनपुट मार्बल (मान) द्वारा प्रतिस्थापित किया जाएगा जब फ़ंक्शन को कॉल किया जाता है। +Zकिसी भी संगमरमर से 35 जोड़ता है जो उस पर से गुजरता है और इसे गिरने देता है। +Cवही करता है लेकिन केवल 12 जोड़ता है।{0 एक आउटपुट सेल है। , जब एक संगमरमर इस सेल तक पहुंचता है, तो फ़ंक्शन इस आउटपुट डिवाइस में मूल्य से बाहर निकल जाएगा और वापस आ जाएगा।

इसलिए सभी एक साथ, यह बोर्ड एक मूल्य लेता है और फिर इसमें 47 जोड़ देता है। हमारे लिए इसका अर्थ यह है कि यह किसी भी एक अंक की संख्या को अंक -1 के आस्की कोड में बदल देता है (यह निश्चित रूप से 10 के लिए भी काम करेगा)।

:I
}1 .. }1 00 01 F7
=9 &1 ++ .. &1 &0
&0 }0 &1 &0 {1 {1
{> \/ {0 //

यह बोर्ड कुछ अधिक जटिल लग रहा है। आपको :Iबोर्ड के नाम के रूप में पहचान करने में सक्षम होना चाहिए और कुछ इनपुट और आउटपुट डिवाइस को देखा जाना चाहिए । आप देखेंगे कि हमारे पास दो अलग-अलग इनपुट डिवाइस हैं, }0और }1। इसका मतलब है कि यह फ़ंक्शन 2 इनपुट लेता है। आप यह भी देखेंगे कि }1डिवाइस के दो उदाहरण हैं । फ़ंक्शन को कॉल करने पर, इन दोनों कोशिकाओं में समान मूल्य होगा। }0इनपुट डिवाइस एक सीधे ऊपर है\/ यह एक ट्रैशकैन रूप में कार्य करता है और किसी भी संगमरमर कि तुरंत इस पर गिर जाता है निकालता है, डिवाइस।

आइए एक नजर डालते हैं कि }1इनपुट डिवाइस द्वारा बोर्ड में लगाए गए मार्बल्स में से एक क्या होता है:

}1
=9 &1
&0
{>

यह पहली टिक पर नीचे गिर जाएगा और =9डिवाइस को हिट करेगा । यह संगमरमर के मान को 9 से तुलना करता है और यदि कथन =9के माध्यम से मूल्यांकन करता है तो संगमरमर को गिरने देता है । संगमरमर सही नहीं होने पर धकेल दिया जाता है। &0और &1सिंक्रनाइज़र हैं। वे तब तक मार्बल धारण करते हैं, जब तक कि अन्य सभी &nसिंक्रोनाइजरों को भर नहीं दिया जाता। जैसा कि आप उम्मीद कर सकते हैं, यह बोर्ड के कुछ अन्य भाग पर सशर्त रूप से विभिन्न व्यवहार को ट्रिगर करेगा।

}1 00 01 F7
++ .. &1 &0
&1 &0 {1 {1
{0 //

यदि मैं आपको बताता हूं कि ++एक वेतन वृद्धि है, तो आपको पहले से ही यह बताने में सक्षम होना चाहिए कि विभिन्न सिंक्रोनाइजरों से क्या भरा जाएगा। बाईं ओर &1इनपुट मान }1+ 1 होगा, इसके &0बगल में 0 होगा ( 00एक भाषा शाब्दिक है, जिसे हेक्साडेसिमल में दर्शाया गया है)। दूसरे &1में मान 1 होगा और दाएं &0से भरा हुआ है F7, जो कि मान से 9 घटाता है क्योंकि मारबेलस में जोड़ मोडुलो 256 है।

// एक डिफ्लेक्टर डिवाइस है, जो किसी भी संगमरमर को नीचे गिरने देने के बजाय बाईं ओर धकेलता है।

यह सब एक साथ रखना आपको यह देता है: यदि संगमरमर }19 में है, तो &0सिंक्रोनाइज़र भर जाते हैं। यह मान 0 को {0आउटपुट में और F7(या -9) आउटपुट में गिरने का कारण होगा {1। यदि }19 नहीं है, {0तो }1+ 1 से भरा {0जाएगा और इसमें 1 होगा। इसमें एक {>डिवाइस भी है, यह एक विशेष आउटपुट है जो एक बोर्ड के बगल में संगमरमर के नीचे आउटपुट करता है। इससे भरा जाएगा }1अगर यह 9 के बराबर है।

@0 @6 00 00 00 @5
}0 &0 &0 &0 &0
>0 @6 &3
\\ -- \/ &2
@0 /\ @4 \/ &1 !!
@4 @1 .. @2 @5 @3
II II II II II II
FF &1 FF &2 FF &3
@1 OO @2 OO @3 OO

ठीक है, अब बड़े के लिए। इस बोर्ड में एक स्पष्ट नाम नहीं है, क्योंकि यह फाइल का मुख्य बोर्ड है। इसके अंतर्निहित नाम है Mb। आपको कुछ कोशिकाओं को पहचानने में सक्षम होना चाहिए। एक इनपुट डिवाइस है, कुछ भाषा के शाब्दिक ( 00और FF)। कुछ सिंक्रोनाइज़र हैं और एक डिफ्लेक्टर है। टुकड़ा द्वारा इस टुकड़े के माध्यम से कदम देता है।

@0 @6
}0 &0
>0 @6
\\ --
@0 /\ @4

तो इनपुट वैल्यू (कमांड लाइन इनपुट चूंकि यह मुख्य बोर्ड है) शीर्ष पर दूसरी सेल से शुरू होता है जहां }0स्थित है। यह नीचे गिर जाएगा और >0डिवाइस तक पहुंच जाएगा , जो एक और तुलना उपकरण है। किसी भी संगमरमर से बड़ा 0 गिरता है, किसी भी अन्य संगमरमर को दाईं ओर धकेल दिया जाता है। (चूँकि Marbelous वैरिएबल अहस्ताक्षरित हैं, केवल 0 ठीक दाईं ओर धकेला जाएगा)। यह शून्य मान संगमरमर तब @6डिवाइस को हिट करेगा । यह एक पोर्टल है और मार्बल को किसी अन्य संबंधित पोर्टल पर भेजता है, इस मामले में यह ठीक ऊपर है। इसके बाद मार्बल &0सिंक्रोनाइजर तक पहुंच जाएगा और कुछ चीजों को कहीं और ट्रिगर कर देगा।

यदि संगमरमर 0 नहीं है, तो यह नीचे गिर जाता है, \\हिट द्वारा दाईं ओर विक्षेपित हो जाता है --जो इसे /\एक से घटाता है और फिर एक क्लोनर पर गिर जाता है । यह डिवाइस एक संगमरमर लेता है और इसकी एक प्रति दाईं ओर और एक बाईं ओर आउटपुट करता है। बायाँ ऊपर की ओर दूसरे स्थान पर ले जाया जाएगा @0जहाँ संगमरमर फिर उसी क्रम से जाएगा। लेफ्ट वाले को कहीं और ले जाया जाएगा। यह हमें एक लूप देता है, जो लूप के अनुसार एक बार कमांड लाइन इनपुट को घटाता है और प्रत्येक लूप पर कुछ व्यवहार को ट्रिगर करता है जब तक कि यह 0. तक नहीं पहुंच जाता है। तब यह कुछ अन्य व्यवहार को ट्रिगर करता है।

आइए एक नज़र डालते हैं कि @4प्रत्येक लूप पर धकेल दिए गए संगमरमर के साथ क्या होता है ।

@4 @1 .. @2 @5 @3
II II II II II II
FF &1 FF &2 FF &3
@1 OO @2 OO @3 OO

यहां 3 भाषा के शाब्दिक हैं ( FF), जो तुरंत पोर्टल्स में गिर जाएंगे। ये पोर्टल उन्हें तीन IIउपकरणों तक ले जाएगा । IIबोर्ड को संदर्भित करता है जिसे :Iहमने फ़ाइल के नीचे परिभाषित किया है। चूंकि :I2 अलग-अलग इनपुट डिवाइस हैं, इसलिए यह दूसरे बोर्ड पर प्रतिनिधित्व करता है 2 सेल वाइड होना चाहिए। चूंकि हमारे पास 6 कोशिकाएं हैं II, इसलिए हम बताते हैं कि हमारे पास बोर्ड पर इस फ़ंक्शन के 3 उदाहरण हैं।

FF(या 256 या -1 आप होगा अगर) पत्थर के इनपुट कोशिकाओं में बैठेंगे :I(एक और है कि) तक देखते हैं पर्याप्त इनपुट संगमरमर STO समारोह शुरू इंतजार कर कार्य करते हैं। यही वह जगह है जहाँ @4पोर्टल आता है। प्रत्येक लूप पर डिक्रिप्टेड कमांड लाइन इनपुट की एक कॉपी वहां से गुजरती है। यह सबसे बाएं :Iबोर्ड को ट्रिगर करेगा । मान 256 (या -1) और जो कुछ भी कमांड लाइन इनपुट -1 के साथ शुरू हुआ था। बाएं संगमरमर को बोर्ड के }0उपकरणों में :Iऔर दाईं ओर एक को रखा जाएगा }1। यदि आपको याद है कि इस बोर्ड ने क्या किया है, तो आप यह बता पाएंगे कि इसका क्या परिणाम है। यह बाएं आउटपुट पर दाएं इनपुट के एक बढ़े हुए संस्करण का उत्पादन करेगा (और यह 9 को 0 में बदल देता है, 10 का नहीं) और दाईं ओर 1 या -9 आउटपुट करता है।

बढ़े हुए मूल्य को एक पोर्टल द्वारा सही इनपुट सेल में वापस ले लिया जाएगा, और दाईं ओर का मूल्य एक सिंक्रोनाइज़र में गिर जाता है। यदि एक सिंक्रोनाइज़र पहले से ही एक संगमरमर पकड़ रहा है, तो दो पत्थर टकराएंगे। कोलाइडिंग मार्बल एक साथ मोडुलो 256 में जुड़ जाते हैं। इसलिए सिंक्रोनाइजर्स में वैल्यू फोलोइंग करेंगे: वे खाली होने लगते हैं, फिर 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 और फिर मुड़ते हैं। 1 फिर (247 के बाद से जोड़ा जाता है modulo 256)।

आप यह भी याद रख सकते हैं कि एक संगमरमर दाएं से आउटपुट प्राप्त करता है जब इनपुट मान वापस 0 पर आ जाता है। चूंकि :Iबोर्ड एक दूसरे के ठीक बगल में होते हैं, इसलिए thsi बोर्ड को एक बार दाईं ओर ट्रिगर करेगा। यह तीन सिंक्रोनाइज़र को उन मानों से भर देगा जो एक से अधिक हैं, उन्हें कमांड लाइन इनपुट का एक शार्प प्रतिनिधित्व होना चाहिए, जब तक कि यह 0 से कम हो गया हो।

आप यह भी याद रख सकते हैं कि :Oफ़ंक्शन एक मान को उस अंक के एएससीआई मान में बदल देता है जो मान -1 का प्रतिनिधित्व करता है। इन OOकोशिकाओं का उत्पादन तब बोर्ड से गिर जाएगा, जो एसटीडी के लिए अपने संबंधित एससीआई चार्ट को प्रिंट करता है।

00 00 00 @5
&0 &0 &0
&3
\/ &2
   \/ &1 !!
      @5

तो क्या होता है जब कमांड लाइन इनपुट मार्बल 0 तक पहुँच जाता है और उस &0सिंक्रोनाइज़र को भरता है ? ठीक है, कुछ 0 मूल्य के पत्थर नीचे गिरते हैं और तीन सिंक्रोनाइज़र को ट्रिगर करते हैं जो बोर्ड के निचले भाग में शोर्टेक्स संख्या के अंकों (+ 1) को पकड़ते हैं। &3पहले ट्रिगर हो जाता है, क्योंकि इसमें सबसे महत्वपूर्ण अंक होता है, उसके बाद आता &2है &1। यह मार्बल @5अंततः !!सेल से टकराने से पहले दूसरे डिवाइस को टेलीपोर्ट हो जाता है , जो बोर्ड को समाप्त कर देता है।


4
यह लगभग लगता है जैसे यह वैध पर्ल कोड भी हो सकता है
दरवाज़े

12

CJam, 14 11 बाइट्स

l40f-Ab)s1>

इसे ऑनलाइन आज़माएं।

यह काम किस प्रकार करता है

यह दृष्टिकोण edc65 के उत्तर ( उसकी स्पष्ट अनुमति के साथ ) पर आधारित है :

" Read a line L from STDIN. ";

l

" edc65's answer now forms an integer N by replacing each digit in L by an 8 and computes
  L - ~N = L + N + 1. Instead of adding L and N, we subtract 40 from each char code of L.
  Since the char code of the digit `D` is `D + 48`, this basically adds 8 to each digit.  ";

40f-

" Turn the resulting array into an integer by considering its elements a base 10 number.
  This is implemented as A ↦ A[-1] + 10 * A[-2] + 100 * A[-3] + ⋅⋅⋅, so it won't choke
  on digits greater than the base.                                                        ";

Ab

" Increment the integer on the stack to complete the calculation of L + N + 1.            ";

)

" Push the integers string representation and discard its first character.                ";

s1>

उदाहरण चलाते हैं

$ for i in 0 1 10 11 42 100 800 1060 10270 100501
> do echo $i: $(cjam <(echo 'l40f-Ab)s1>') <<< $i)
> done
0:
1: 0
10: 9
11: 00
42: 31
100: 89
800: 689
1060: 949
10270: 9159
100501: 89390

1
यह अश्लील है
क्लाउडीयू

3
+1 इसे और भी छोटा करने का तरीका खोजने के लिए
edc65

6

पायथन 2 (38) (43)

f=lambda n:n*'_'and f(~-n/10)+`~-n%10`

कोई चरित्र प्रतिस्थापन नहीं, बस अंकगणित।

Ungolfed:

def f(n):
    if n==0: return ''
    else: return f((n-1)//10) + str((n-1)%10)

मेरे पास एक अच्छा कारण नहीं है कि पुनरावृत्ति क्यों काम करती है, मैं इस पैटर्न को मूल्यों की सूची में फिट करता हूं। यदि आपने प्रत्येक n-1को बदल दिया है n, तो आपको नियमित अंक प्रतिनिधित्व मिलेगा।

गोल्फ के लिए, मैं का उपयोग ~-nगणना करने के लिए n-1की तुलना में अधिक पूर्वता के साथ /10या %10, कोष्ठक पर बचत। n*'_'बस खाली स्ट्रिंग जब उत्पादन होता है n=0और किसी भी अन्य स्ट्रिंग अन्यथा। '_'इस उद्देश्य के लिए किसी भी स्ट्रिंग हो सकता है।


4

रूबी, 70 68 66 64 57 बाइट्स

f=->n{i=-1;n-=10**i while n>=10**i+=1;i<1?'':"%0#{i}d"%n}

एक फ़ंक्शन को परिभाषित करने के लिए कहा जाता है जैसे f[42]। यहाँ एल्गोरिथ्म का मोटा टूटना है:

  • 0अलग से इलाज करें ।
  • 10 की घटाएँ शक्ति जब तक 10 की अगली शक्ति किसी भी अधिक संख्या में फिट नहीं होती है।
  • बाईं ओर शून्य के साथ संख्या को गद्देदार में बदल दें।

एक प्रारूप स्ट्रिंग का उपयोग करने के विचार के लिए क्रेडिट फाल्को पर जाएं!


वैकल्पिक रूप से, edc65 के दृष्टिकोण का उपयोग करते हुए:

f=->n{"#{n-~n.to_s.tr('^.',?8).to_i}"[1..-1]}

यह 45 बाइट्स है और मैं केवल इसे शामिल कर रहा हूं, क्योंकि मैं इसके साथ नहीं मार रहा हूं। ;)


ज़रूर। मुझे लगता है कि मैं आपको अपने लंबे अजगर कोड के साथ वैसे भी नहीं पकड़ूंगा। ;)
फाल्को

@ ओप्टिमाइज़र मुझे यकीन है कि अगर किसी ने गोल्फ की किसी एक भाषा में उस दृष्टिकोण का इस्तेमाल किया जो उन्हें 20 से नीचे मिलेगा। (यह कहा जा रहा है, मैं उस दृष्टिकोण के साथ रूबी में 44 तक नहीं पहुंच सकता ... वर्तमान में 45 पर है)
मार्टिन Ender

2
@ ओप्टिमाइज़र मैं इससे सहमत नहीं हूँ। शुरुआत के लिए, J और APL गोल्फिंग भाषाएँ नहीं हैं और गोल्फस्क्रिप्ट और CJam जितनी बार जीतते हैं। लेकिन इसके अलावा, गोल्फिंग हरे रंग के चेकमार्क के बारे में नहीं है, बल्कि "आपकी लीग में" धड़कन के बारे में है। अगर मैं एक रूबी सबमिशन लिखता हूं जो सभी को धड़कता है, लेकिन मैं उन 4 भाषाओं के बारे में काफी खुश हो सकता हूं, और मुझे उन लोगों की जरूरत नहीं है जो अधिक वर्बोज भाषाओं में गोल्फ का आनंद लेने के लिए प्रतिबंधित हैं। वास्तव में, edc जैसी "सामान्य" भाषा में एक चतुर गोल्फ एक गोल्फिंग भाषा में एक भोले (लेकिन कम) कार्यान्वयन की तुलना में बहुत अधिक उत्थान प्राप्त करने की संभावना है।
मार्टिन एंडर

3

हास्केल, 67 बाइट्स

n('9':x)='0':n x
n(c:x)=succ c:x
n""="0"
f x=reverse$iterate n""!!x

यह समाधान मूल रूप से शॉर्टलेक्स नोटेशन में 1 दी गई संख्या को जोड़ता है।

उपयोग:

>f 9
"8"
>f 100
"89"

3

सीजेएम, 16 बाइट्स

li_)9*,{`1>}%_&=

इसे ऑनलाइन आज़माएं। कम से कम O (n) समय और मेमोरी की आवश्यकता होती है, इसलिए ऑफ़लाइन इंटरप्रेटर को 100501 छोड़ें ...

यह काम किस प्रकार करता है

इस दृष्टिकोण के पीछे मूल विचार अपने प्राकृतिक क्रम में कम से कम एन शॉर्टलेक्स दशमलव की गणना करना और सभी लेकिन एनटी को छोड़ देना है। बहुत कुशल नहीं है, लेकिन छोटा है।

li                " Read an integer N from STDIN.                                   ";
  _)9*            " Push M := (N + 1) * 9.                                          ";
      ,           " Push A := [ 0 1 ... M - 1 ].                                    ";
       {   }%     " For each I ∊ A:                                                 ";
       {`1>}%     " Push its string representation and discard the first character. ";
             _&   " Remove duplicates from the resulting array.                     ";
               =  " Retrieve the Nth element.                                       ";

उदाहरण चलाते हैं

$ for i in 0 1 10 11 42 100 800 1060 10270 100501
> do echo $i: $(cjam <(echo 'li_)9*,{`1>}%_&=') <<< $i)
> done
0:
1: 0
10: 9
11: 00
42: 31
100: 89
800: 689
1060: 949
10270: 9159
100501: 89390

3

बैश + कोरुटिल्स, 27 बाइट्स

@ डेनिस के सुधार के साथ @ edc65 के चतुर उत्तर का पोर्ट :

cut -b2-<<<$[$1-~${1//?/8}]

आउटपुट:

$ for n in 0 1 10 11 42 100 110 111 800 1060 1110 1111 10270 100501; do echo "./shortlex.sh $n = \"$(./shortlex.sh $n)\""; done
./shortlex.sh 0 = ""
./shortlex.sh 1 = "0"
./shortlex.sh 10 = "9"
./shortlex.sh 11 = "00"
./shortlex.sh 42 = "31"
./shortlex.sh 100 = "89"
./shortlex.sh 110 = "99"
./shortlex.sh 111 = "000"
./shortlex.sh 800 = "689"
./shortlex.sh 1060 = "949"
./shortlex.sh 1110 = "999"
./shortlex.sh 1111 = "0000"
./shortlex.sh 10270 = "9159"
./shortlex.sh 100501 = "89390"
$ 

पिछला उत्तर:

बैश + कोरुटिल्स, 71 54 बाइट्स

यहाँ यह करने के लिए एक अलग तरीका है:

jot -w%x $1$1|tr 0-9a a0-9|grep -P ^\\d+$|sed $1!d 2>-
  • jot हेक्साडेसिमल पूर्णांकों को बढ़ाने वाले आउटपुट
  • tr इसे (0,1, ..., 8,9, b, ... f, 0a, 00,01, ..., 99,9b, ..., ff, 0aa, ..., 000) में रूपांतरित करता है , ...)
  • grep बस (0,1, ..., 8,9,00, ..., 99,000 ....) देने के लिए अंकों वाली सभी पंक्तियों को फ़िल्टर करता है।
  • sed सभी को हटा देता है, लेकिन nth लाइन
  • STDERR को एक फेंक फ़ाइल में पुनर्निर्देशित किया जाता है '-' ताकि हम बस खाली स्ट्रिंग प्राप्त करें जब 0 को पास किया जाए ( sed1 पर शुरू होने वाली रेखा संख्याएं, इसलिए 0 पास होने पर त्रुटियां)
  • क्योंकि हम संख्याओं को फ़िल्टर कर रहे हैं, इसलिए हमें इनपुट संख्या के grepसाथ seq/ dcसे अधिक आधार 11 पूर्णांक बनाने की आवश्यकता है । N के अंकों को दोहराना पर्याप्त से अधिक है।

ध्यान दें कि एक बार जब शॉर्टल नंबर छपा होता है, seqतब तक नंबर उत्पन्न करना जारी रहता है $1$1, जो विशेष रूप से बड़े इनपुट नंबरों के लिए धीमा होता है - O (n think), मुझे लगता है। हम seq7 बाइट्स की लागत पर छपाई के तुरंत बाद छोड़ कर गति बढ़ा सकते हैं :

jot -w%x $1$1|tr 0-9a a0-9|grep -P ^\\d+$|sed -n $1{p\;q} 2>-

प्रश्न में गति की आवश्यकता नहीं है, इसलिए मैं अपने मुख्य उत्तर के लिए छोटे संस्करण के साथ जा रहा हूं।


@ ओप्टिमाइज़र नोप: कोशिश करें s='jot -w%x $1$1|tr 0-9a a0-9|grep -P ^\\d+$|sed $1!d 2>-'; echo ${#s}। मुझे लगता है कि आप स्ट्रिंग लंबाई को मापने के लिए अजगर का उपयोग कर रहे होंगे, जो "\\" को एक चरित्र के रूप में मानता है।
डिजिटल ट्रॉमा

2
मेरा जवाब अब तक बदल गया है, लेकिन अगर मैंने पहले संशोधन में कुछ चतुर किया है, तो यह पूरी तरह से दुर्घटना से हुआ था। यह edc65 के उत्तर का प्रत्यक्ष छिद्र था; 8 के सभी अपने हैं ... - सहायक चर $aअनावश्यक लगता है; cut -b2-<<<$[$1-~${1//?/8}]बस ठीक काम करना चाहिए।
डेनिस

1
@ डेनिस राइट मैं देख रहा हूं। सलाह के लिये धन्यवाद!
डिजिटल ट्रॉमा

2

अजगर 2 - 84, 70 66

n=input()
i=0
while n>=10**i:n-=10**i;i+=1
print"%%0%dd"%i%n*(i>0)

वैकल्पिक दृष्टिकोण (एक ही लंबाई):

n=input()
k=len(`9*(n+1)/10`)
print"%%0%dd"%k%(n-int('1'*k))*(n>0)

एक प्रारूप स्ट्रिंग का उपयोग कर चतुर है! मुझे आशा है कि यदि आप इसका उपयोग करते हैं तो आपको कोई आपत्ति नहीं है। :)
मार्टिन एंडर

2

पायथन 3, 107 वर्ण

यह जीत का अंत नहीं था, लेकिन मुझे लगा कि यह चतुर था:

def G():yield'';yield from(r+c for r in G()for c in'0123456789')
S=lambda n:list(zip(range(n+1),G()))[n][1]

मैं 64 अक्षरों में पूरे अनुक्रम के लिए एक जनरेटर को परिभाषित करता हूं। दुर्भाग्य से, मुझे जनरेटर के एनटीएच तत्व को प्राप्त करने के लिए कुछ अंतर्विरोधों से गुजरना पड़ता है ... यदि केवल मैं ही कर सकता था S=lambda n:G()[n]


2

अजगर , १२

@ Edc65 के उत्तर का एक और पोर्ट, जो स्पष्ट विजेता (IMO) है:

t`+hQv*l`Q\8

परीक्षण पैकेज (@DigitalTrauama के लिए धन्यवाद):

$ for n in 0 1 10 11 42 100 110 111 800 1060 1110 1111 10270 100501; do echo "shortlex.pyth $n = \"$(pyth programs/shortlex.pyth <<< $n)\""; done
shortlex.pyth 0 = ""
shortlex.pyth 1 = "0"
shortlex.pyth 10 = "9"
shortlex.pyth 11 = "00"
shortlex.pyth 42 = "31"
shortlex.pyth 100 = "89"
shortlex.pyth 110 = "99"
shortlex.pyth 111 = "000"
shortlex.pyth 800 = "689"
shortlex.pyth 1060 = "949"
shortlex.pyth 1110 = "999"
shortlex.pyth 1111 = "0000"
shortlex.pyth 10270 = "9159"
shortlex.pyth 100501 = "89390"

स्पष्टीकरण:

Q = eval(input())             Implicit.
t`                            All but the first digit of
  +hQ                         Q+1 + 
   v                          eval(
    *l`Q                      len(repr(Q)) * 
     \8                       "8"

सीजेम बनाम पायथ; लड़ाई जारी है। : पी
डेनिस

मैंने इस चुनौती के लिए पायथ को एक शॉट देने की कोशिश की, लेकिन मुझे सूची को पूर्णांक में बदलने का कोई तरीका नहीं मिला (उदाहरण के लिए [8, 8, 9] -> 889)। आप उसे कैसे करते हैं?
डेनिस

@ डेनिस सूची से इंट तक पहुंचने के लिए, आपको मूल रूप से स्ट्रिंग से गुजरना होगा। jkअपनी सूची को एक स्ट्रिंग में vबदल देगा , और इसे एक इंट में बदल देगा। तो vjk[8 8 9]नंबर देगा 889.
isaacg

ठीक है धन्यवाद। अफसोस की बात है, स्ट्रिंग रूपांतरण कुछ चाल असंभव बनाता है। CJam / GolfScript बेस रूपांतरण के साथ, [2 -1] -> 19और [1 11] -> 21
डेनिस

1
@ डेनिस हाँ, एक बार मैं वास्तव में पायथ में आधार रूपांतरण जोड़ूंगा, जो काम करेगा। लेकिन मैंने अभी तक नहीं किया है।
isaacg

1

जावा 8, 60 बाइट्स

n->(n-~new Long((n+"").replaceAll(".","8"))+"").substring(1)

का बंदरगाह @ edc65 का अद्भुत जावास्क्रिप्ट (ES6) उत्तर , क्योंकि मुझे संदेह है कि इसे जावा में अंकगणितीय तरीके से छोटा किया जा सकता है।

इसे यहाँ आज़माएँ।


1

हास्केल , 57 बाइट्स

((g=<<[0..])!!)
g 0=[""]
g n=[c:s|c<-['0'..'9'],s<-g$n-1]

इसे ऑनलाइन आज़माएं!

उत्तर के लिए इसमें शोर्टेक्स संख्याओं और अनुक्रमणिकाओं की एक अनंत सूची का निर्माण करता है। g nपिछली पीढ़ी में संख्याओं में से प्रत्येक के सामने अगले अंक को प्रस्तुत करके संख्याओं की nth "पीढ़ी" का निर्माण करता है।



0

एक्सेल, 37 बाइट्स

@ Edc65 के दृष्टिकोण का उपयोग करना:

=REPLACE(REPT(8,LEN(A1))+A1+1,1,1,"")

0

जेली , 5 बाइट्स

ḃ⁵ịØD

इसे ऑनलाइन आज़माएं!

मैं जेली के लिए बहुत नया हूं, इसलिए यदि आप इसमें सुधार कर सकते हैं, तो कृपया टिप्पणी करें!

स्पष्टीकरण:

ḃ⁵ịØD   Main link.
ḃ       Convert to bijective base ...
 ⁵      10.
  ị     Each number (1 - 10) is converted to the character at its index in the string...
   ØD   “0123456789” (digits)

(उपरोक्त टिप्पणी के अनुसार, समस्या संख्या को आधारभूत संख्या 10 में बदलने के बराबर है)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.