শর্টল্লেক্সে সেই সংখ্যাটি কী?


15

বেশিরভাগ কম্পিউটারগুলি বাইনারিতে পূর্ণসংখ্যা সঞ্চয় করে তবে দশমিক হিসাবে সেগুলি আউটপুট দেয়। যাইহোক, দশমিকটি কেবল একটির উপস্থাপনা, এটি কেবলমাত্র এটি সুবিধাজনক হিসাবে খুঁজে পাই।

এই চ্যালেঞ্জটি হ'ল সংক্ষিপ্ত দশকে একটি পূর্ণসংখ্যার মান আউটপুট করতে কিছু কোড লিখতে হয় ।

ওটা কী?
http://en.wikipedia.org/wiki/Shortlex_order

শর্টল্লেক্স মানটির প্রাথমিক সিগনিফায়ার হিসাবে অঙ্কের ক্রমের দৈর্ঘ্য নেয়। শূন্যটি উপস্থাপন করে খালি স্ট্রিং থেকে শুরু করে ক্রমটি হ'ল ...

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

(এক্সেল কলামগুলি ভাবুন, তবে কেবল দশমিক সংখ্যা ব্যবহার করুন using)

একটি প্রোগ্রাম বা ফাংশন লিখুন যা কোনও পূর্ণসংখ্যাকে গ্রহণ করে এবং উপরে বর্ণিত হিসাবে সেই পূর্ণসংখ্যার সংক্ষিপ্ত-দশমিক প্রতিনিধির সাথে সম্পর্কিত একটি স্ট্রিং প্রদান করে।

পরীক্ষার মান:

0 → "" (খালি স্ট্রিং)
1 → "0"
10 → "9"
11 → "00"
42 → "31"
100 → "89"
800 → "689"
1060 → "949"
10270 → "9159"
100501 → "89390"


2
19, 20, 21, 22দশমিক মানচিত্রে ক্রমটি সংক্ষিপ্তপুস্তকে নোট করা গুরুত্বপূর্ণ 08, 09, 10, 11। সে কারণেই আমি বিভ্রান্ত হয়েছি 100 -> 89!
শান ল্যাথাম


6
মনে রাখবেন যে আপনি যে কোনও সংখ্যার "সংক্ষিপ্ত দশমিক" বলছেন তা হ'ল এটির দ্বিখণ্ডিত বেস-দশ সংখ্যার সাথে {0,1,2,3,4,5,6,7,8,9 symb চিহ্নগুলির পরিবর্তে স্বাভাবিক অঙ্কগুলি {1,2,3,4,5,6,7,8,9, এ}} যেমন 2014 চলিত bijective বেস-দশ স্বরলিপি 1A14, এবং shortlex দশমিক এটা 0903. হয়
মাঝামাঝি

উত্তর:


34

জাভাস্ক্রিপ্ট (ES6) 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...

তবে নেতৃস্থানীয় 0 টি পরিচালনা করা কঠিন, সুতরাং আমার কাছে একটি স্ট্যান্ডার্ড ট্রিক রয়েছে, প্রথম সংখ্যা যুক্ত করুন এবং মডুলো (যা আউটপুটতে প্রথম সংখ্যাটি কাটবেন) যুক্ত করুন। তারপরে -1-> +9, -11 -> +89, -111 -> +889 এবং আরও অনেক কিছু।
শেষ পদক্ষেপ: প্রথম সংখ্যাটি কী তা আমি মাথা ঘামাই না, সুতরাং আইএনপুট নম্বরটি 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?
Claudiu

এটি ক্লাউডিউ এটি (n+'').replace(...), সংখ্যার পরিবর্তে স্ট্রিংয়ের কাজগুলি প্রতিস্থাপন করুন।
edc65

@ এডসি 65: উফ হ্যাঁ এখনই এটি ধরা পড়েছে, আমার প্রথম বন্ধনীর সাথে মেলে না। দাইয়াম এটি বেশ উজ্জ্বল
ক্লোডিউ

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 বিটের ভাষা।

কিভাবে এটা কাজ করে

মার্বেলাস হ'ল একটি 2 ডি ভাষা যা 8 টি বিট মার্বেল দ্বারা প্রকাশিত মানের যা প্রতিটি টিকের উপর একটি কক্ষের নিচে পড়ে যদি না কোনও ডিভাইস তাদের নিচে পড়তে বাধা দেয়। এই মার্বেলাস প্রোগ্রামটি 3 টি বোর্ড নিয়ে গঠিত; আসুন শুরু করা যাক সবচেয়ে সহজ:

:O
}0
+Z
+C
{0

:Oবোর্ডের নাম (সুনির্দিষ্টভাবে বলতে গেলে, হ'ল নামটি এবং: ব্যাখ্যা করা হয়েছে যে এই লাইনটি একটি নাম bo বোর্ডগুলি একটি নাম দেওয়ার মাধ্যমে, অন্য বোর্ডগুলি তাদের }0কাছে কল করতে পারে একটি ইনপুট ডিভাইস, এটি কোনও হিসাবে দেখা যায় এই ফাংশনটির যুক্তি the ফাংশনটি ডেকে এলে এই ঘরটি একটি ইনপুট মার্বেল (মান) দ্বারা প্রতিস্থাপিত হবে +Z35 এটির পাশ দিয়ে যে কোনও মার্বেলে 35 টি যুক্ত হয় এবং এটি পড়তে দেয় +Csame একই কাজ করে তবে কেবল 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 হয় mod

// একটি ডিফলেক্টর ডিভাইস, যা কোনও মার্বেলকে নীচে নামার পরিবর্তে বাম দিকে ঠেলে দেয়।

এগুলি একসাথে রাখলে এটি পাওয়া যায়: মার্বেলটি যদি }19 হয় তবে &0সিঙ্ক্রোনাইজারগুলি পূর্ণ হয়ে যায়। এর ফলে 0 মান {0আউটপুট এবং F7(অথবা -9) {1আউটপুট মধ্যে পড়তে পারে। যদি }19 না হয় তবে এটি +1 {0দিয়ে পূর্ণ হবে }1এবং {0এতে 1 টি থাকবে There একটি {>ডিভাইসও রয়েছে, এটি একটি বিশেষ আউটপুট যা বোর্ডের পাশে একটি মার্বেলের নীচে স্থির করে out এটি }19 এর সমান হলে এটি পূর্ণ হবে ।

@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 টিরও বেশি বড় মার্বেল পড়ে অন্য কোনও মার্বেল ডানদিকে ঠেলে দেয়। (যেহেতু মার্বেলাস ভেরিয়েবলগুলি স্বাক্ষরযুক্ত নয়, ঠিক ঠিক 0 টি ডানদিকে ঠেলে দেবে)। এই শূন্য মানের মার্বেলটি তখন @6ডিভাইসে আঘাত করবে । এটি একটি পোর্টাল এবং মার্বেলটিকে অন্য কোনও সম্পর্কিত পোর্টালে স্থান করে দেয়, ঠিক এক্ষেত্রে উপরে। 0 টি মার্বেল &0সিঙ্ক্রোনাইজারে পৌঁছাবে এবং অন্য কোথাও কিছু জিনিস ট্রিগার করবে ।

যদি মার্বেল 0 না হয় তবে এটি নীচে পড়ে যায় এবং \\হিট দ্বারা ডানদিকে প্রতিবিম্বিত --হয় যা একে একে হ্রাস করে এবং তারপরে পড়ে যায় /\, একটি ক্লোনার। এই ডিভাইসটি একটি মার্বেল নেয় এবং এর একটি অনুলিপি ডানদিকে এবং একটি বামে আউটপুট দেয়। বাম দিকটিকে অন্যের দিকে নিয়ে যাওয়া হবে @0যেখানে মার্বেলটি আবার একই ক্রমের মধ্য দিয়ে যাবে। বামটিকে অন্য কোথাও নিয়ে যাওয়া হবে। এটি আমাদের একটি লুপ দেয়, যা প্রতি লুপে একবার কমান্ড লাইন ইনপুট হ্রাস করে এবং প্রতিটি লুপটিতে 0 পৌঁছানোর আগে পর্যন্ত কিছু আচরণকে ট্রিগার করে then এটি তারপরে অন্য কিছু আচরণকে ট্রিগার করে।

চলুন এক নজরে দেখে নেওয়া যাক @4প্রতিটি লুপের মধ্যে মার্বেলটি pushedুকিয়ে দিয়ে কী ঘটে ।

@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(এক বেশি) যে untill আছে যথেষ্ট ইনপুট মার্বেল STO ফাংশন শুরু অপেক্ষা ফাংশন। এর যেখানে যে @4মাধ্যমে একে লুপ সেখানে পড়ে পোর্টাল। একজন আসে decremented কমান্ড লাইন ইনপুটের কপি করুন। এটি বামতম :Iবোর্ডটিকে ট্রিগার করবে । 256 (বা -1) মানগুলির সাথে আরম্ভ করুন এবং কমান্ড লাইন ইনপুট যাই হোক না কেন -1 ছিল। বাম মার্বেলটি বোর্ডের }0ডিভাইসে :Iএবং ডানদিকে একটিতে লাগানো হবে }1। আপনি যদি এই বোর্ডটি কী করেছিল তা স্মরণ করে রাখেন, এর ফলাফল কী হয়েছে তা আপনি বলতে সক্ষম হবেন। এটি বাম আউটপুটে ডান ইনপুটটির বর্ধিত সংস্করণ আউটপুট করবে (এবং এটি একটি 9 কে 0 তে পরিণত করবে, 10 নয়) এবং ডানদিকে 1 বা -9 আউটপুট দেবে।

বর্ধিত মানটি একটি পোর্টাল দ্বারা ডান ইনপুট ঘরে ডানদিকে ফিরিয়ে নেওয়া হবে এবং ডান দিকের মান একটি সিঙ্ক্রোনাইজারে পড়ে। যদি কোনও সিঙ্ক্রোনাইজার ইতিমধ্যে একটি মার্বেল ধরে থাকে তবে দুটি মার্বেল সংঘর্ষিত হবে। কোলাইডিং মার্বেলগুলি মডিউল 256 একসাথে যুক্ত হয় So সুতরাং সিঙ্ক্রয়েজারগুলিতে মানগুলি অনুসরণ করবে: এগুলি খালি শুরু হয়, তারপরে 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 এবং তারপরে পরিণত হবে 1 আবার (যেহেতু 247 মডিউল 256 যোগ করে)।

আপনি এও মনে করতে পারেন যে কোনও মার্বেল ডানদিকে আউটপুট পায় যখন ইনপুট মানটি 0 এ ফিরে আসে তাই :Iবোর্ডগুলি একে অপরের পাশে থাকায়, thsi বোর্ডটিকে একবার ডানদিকে ট্রিগার করবে। এটি তিনটি সিঙ্ক্রোনাইজারকে ভ্যালু দিয়ে পূরণ করবে যেগুলি কমান্ড লাইন ইনপুটটির সংক্ষিপ্ত প্রতিনিধিত্ব হওয়া উচিত তার চেয়ে একের চেয়ে বেশি এবং এই সংখ্যাটি 0 এ নেমে যায়।

আপনি এটিও মনে রাখতে পারেন যে :Oফাংশনটি একটি মানকে অঙ্কের ascii মানতে রূপান্তর করে যা মান -1 উপস্থাপন করে। OOএরপরে এই কক্ষগুলির আউটপুট বোর্ডের বাইরে চলে যাবে, যা তাদের সংশ্লিষ্ট এসকি চরগুলি STDOUT এ মুদ্রণ করে।

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

সুতরাং যখন কমান্ড লাইন ইনপুট মার্বেল 0 পৌঁছে এবং যে &0সিঙ্ক্রোনাইজার পূরণ করে ? ভাল, কয়েকটি 0 মান মার্বেল পড়ে এবং বোর্ডের নীচে সংক্ষিপ্ত সংখ্যার অঙ্ক (+ 1) ধরে রাখা তিনটি সিঙ্ক্রোনাইজারকে ট্রিগার করে। &3প্রথম সূত্রপাত পরার, যেহেতু এটি সবচেয়ে গুরুত্বপূর্ণ অঙ্ক থাকে, তারপর আসে &2দ্বারা অনুসরণ &1। এই মার্বেলটি পরে @5অবশেষে !!ঘরে আঘাত করার আগে অন্যান্য ডিভাইসে টেলিপোর্ট হয়ে যায় যা বোর্ডটি বন্ধ করে দেয়।


4
প্রায় দেখে মনে হচ্ছে এটি পার্ল
কোডও

12

সিজেম, 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, আপনি নিয়মিত অঙ্ক উপস্থাপনা পেতে চাই।

Golfing জন্য, আমি ব্যবহার ~-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 বাইট এবং আমি কেবল এটি অন্তর্ভুক্ত করছি, কারণ আমি তাকে এটি দিয়ে মারছি না। ;)


অবশ্যই। আমার ধারণা আমি আমার দীর্ঘ পাইথন কোডটি দিয়ে আপনাকে আর ধরব না। ;)
ফালকো

@ অপ্টিমাইজার আমি নিশ্চিত যে কেউ যদি কোনও গল্ফিং ভাষায় এই পদ্ধতির ব্যবহার করেন তবে তারা ২০ বছরের নিচে নামবেন ((এটি বলা হচ্ছে, আমি রুবিতে এই পদ্ধতির সাথে মোটামুটি ৪৪ পৌঁছাতে পারছি না ... বর্তমানে ৪৫-এ)
মার্টিন বাড়ি হইতে বাহিরে

2
@ অপ্টিমাইজার আমি এর সাথে একমত নই প্রারম্ভিকদের জন্য, জে এবং এপিএল গল্ফিং ভাষা নয় এবং প্রায়শই গল্ফস্ক্রিপ্ট এবং সিজেম হিসাবে জিতেছে। তবে তদ্ব্যতীত, গল্ফিং সবুজ চেকমার্ক সম্পর্কে নয় তবে "আপনার লিগে" সাবমিশনকে মারধর সম্পর্কে। যদি আমি এমন একটি রুবি জমা লিখি যা এই 4 টি ভাষা বাদে সমস্তকেই পরাজিত করে তবে আমি সে সম্পর্কে বেশ খুশি হতে পারি এবং আরও ভার্ভোজ ভাষায় গল্ফ উপভোগ করার জন্য আমার সেগুলি নিষিদ্ধ করার দরকার নেই। প্রকৃতপক্ষে, এডিসির মতো একটি "সাধারণ" ভাষায় একটি চতুর গল্ফ গল্ফিং ভাষায় একটি নিষ্পাপ (তবে সংক্ষিপ্ত) প্রয়োগের চেয়ে অনেক বেশি উপার্জন পাওয়ার সম্ভাবনা বেশি।
মার্টিন ইন্ডার

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>}%_&=

এটি অনলাইনে চেষ্টা করুন। কমপক্ষে ও (এন) সময় এবং মেমরির প্রয়োজন হয়, সুতরাং 100501 অফলাইন দোভাষীকে ছেড়ে যান ...

কিভাবে এটা কাজ করে

এই পদ্ধতির পিছনে মূল ধারণাটি হ'ল তাদের প্রাকৃতিক ক্রমে কমপক্ষে এন শর্টলেক্স দশমিকগুলি গণনা করা এবং Nth ব্যতীত সমস্তগুলি বাতিল করা। খুব দক্ষ না, তবে সংক্ষিপ্ত।

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, খ, ... এফ, 0 এ, 00,01, ..., 99,9 বি, ..., এফএফ, 0 আ, ..., 000 , ...)
  • grep কেবল অঙ্ক দেওয়ার জন্য সমস্ত লাইন ফিল্টার করে (0,1, ..., 8,9,00, ..., 99,000 ....)
  • sed নবম লাইন বাদে সমস্ত মুছে ফেলে
  • STDERR একটি থ্রোওয়ে ফাইল '-' তে পুনঃনির্দেশিত করা হয়েছে যাতে 0 টি পাস করার পরে আমরা খালি স্ট্রিংটি পাই ( sed1 থেকে শুরু হওয়া লাইন সংখ্যা গণনা করা হয়, সুতরাং 0 টি পাস হলে ত্রুটি)
  • যেহেতু আমরা সংখ্যার সাথে ফিল্টারিং করছি grep, আমাদের ইনপুট নম্বরটির সাথে seq/ তার dcচেয়ে বেশি বেস 11 পূর্ণসংখ্যা তৈরি করতে হবে । N এর অঙ্কগুলি পুনরাবৃত্তি করা যথেষ্টের চেয়ে বেশি।

নোট করুন যে একবার সংক্ষিপ্ত সংখ্যাটি মুদ্রিত হওয়ার পরে, seqপর্যন্ত সংখ্যা তৈরি করা অব্যাহত রয়েছে $1$1, যা বিশেষত বৃহত্তর ইনপুট সংখ্যার জন্য ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে বেড়ে যায় - O (n।), আমি মনে করি। 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]

আমি sequ৪ টি অক্ষরে পুরো ক্রমটির জন্য একটি জেনারেটর সংজ্ঞায়িত করি। দুর্ভাগ্যক্রমে, জেনারেটরের নবম এলিমেন্টটি পাওয়ার জন্য আমাকে কিছু সংকোচনের মধ্য দিয়ে যেতে হয়েছিল ... কেবল যদি আমি তা করতে পারি S=lambda n:G()[n]


2

পাইথ , 12

@ Edc65 এর উত্তরের আর একটি বন্দর, কে পরিষ্কার বিজয়ী (আইএমও):

t`+hQv*l`Q\8

পরীক্ষামূলক প্যাকেজ (@ ডিজিটাল ট্রাউয়ামাকে ধন্যবাদ):

$ 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)

@ এডসি 65 এর আশ্চর্যজনক জাভাস্ক্রিপ্ট (ES6) এর উত্তরটির পোর্ট , যেহেতু আমি সন্দেহ করি এটি জাভাতে পাটিগণিত উপায়ে ছোট করা যায়।

এখানে চেষ্টা করুন।


1

হাস্কেল , 57 বাইট

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

এটি অনলাইন চেষ্টা করুন!

উত্তরের জন্য এতে সংক্ষিপ্ত সংখ্যার তালিকা এবং সূচিগুলির একটি অসীম তালিকা তৈরি করে। g nপূর্ববর্তী প্রজন্মের প্রতিটি সংখ্যার সামনে পরের অঙ্কটি প্রিন্ট করে সংখ্যার নবম "প্রজন্ম" তৈরি করে।



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 এ রূপান্তর করার সমতুল্য)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.