Shortlex'teki sayı nedir?


15

Çoğu bilgisayar tamsayıları ikili olarak saklar, ancak ondalık olarak verir. Ancak, ondalık yalnızca bir gösterimdir, biz sadece uygun buluyoruz.

Bu zorluk, shortlex ondalık olarak bir tam sayı değeri çıktısı almak için bazı kodlar yazmaktır .

Bu da ne?
http://en.wikipedia.org/wiki/Shortlex_order

Shortlex, basamak dizisinin uzunluğunu, değerin birincil göstericisi olarak alır. Sıfırı temsil eden boş bir dizeden başlayarak sıra ...

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

(Excel sütunlarını düşünün, ancak yalnızca ondalık basamakları kullanın.)

Bir tamsayıyı kabul eden ve yukarıda açıklandığı gibi bu tamsayının kısa-ondalık gösterimine karşılık gelen bir dize döndüren bir program veya işlev yazın.

Test değerleri:

0 → "" (Boş dize)
1 → "0"
10 → "9"
11 → "00"
42 → "31"
100 → "89"
800 → "689"
1060 → "949"
10270 → "9159"
100501 → "89390"


2
19, 20, 21, 22Ondalık dizideki dizinin 08, 09, 10, 11shortlex ile eşleştiğine dikkat etmek önemli olabilir . Bu yüzden onu karıştırdım 100 -> 89!
Sean Latham


6
Bir sayının "kısa devre ondalık" adını verdiğiniz şeyin aynı zamanda bijektif taban-on rakamı olduğuna ve {0,1,2,3,4,5,6,7,8,9} sembollerinin yerine olağan basamaklar {1,2,3,4,5,6,7,8,9, A}. Örneğin, normal bijektif baz-on gösteriminde 2014 1A14 ve kısa ondalık ondalık değerde 0903'tür.
res

Yanıtlar:


34

JavaScript (ES6) 42 74

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

FireFox konsolunda test

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

Çıktı

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

Bunu nasıl düşündüm?

Sabit sayıda basamak verildiğinde, çıkış sekansı basitçe artar, bu nedenle giriş ve çıkış arasında sabit bir delta vardır. Bir göz atın:

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

Ama önde gelen 0'ları yönetmek zor, bu yüzden standart bir hile var, bir ilk basamak ve modulo (yani, çıkıştaki ilk rakamı kesmek) ekleyin. Sonra -1-> +9, -11 -> +89, -111 -> +889 vb.
Son adım: İlk basamağın ne olduğu umurumda değil, bu yüzden iinput numarasının 111'den fazla mı yoksa 111'den fazla mı olduğunu kontrol etmeye gerek yok ... (dürüstçe bunu deneme yanılma yoluyla buldum)

Ölçek

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
Bunun neden işe yaradığı hakkında hiçbir fikrim yok.
Martin Ender

Neden n-~(n+'')sadece yerine yapıyorsun n-~n?
Claudiu

@Claudiu (n+'').replace(...), yerine sayıları değil, dizeleri çalışır.
edc65

@ edc65: Hata evet, şimdi yakaladı, parantezlerimi uyuşturamadı. Dayum bu oldukça parlak
Claudiu

3
@Dennis onu taşımaktan çekinmeyin. Zaten
kazandınız

13

Marbelous 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

Marbelous 8 bitlik bir dil olduğundan yalnızca 256'nın altındaki değerler için çalışır.

Nasıl çalışır

Marbelous, bazı cihazlar düşmelerini engellemedikçe, her kene üzerinde bir hücre aşağı düşen 8 bit mermerler ile temsil edilen değerlere sahip bir 2D dildir. Bu Marbelous programı 3 kuruldan oluşur; en kolay olanla başlayalım:

:O
}0
+Z
+C
{0

:Okartın adıdır (tam olarak belirtmek gerekirse, O addır ve: bu satırın bir ad olduğunu yorumlamaktadır. Panolara bir ad vererek, diğer kartlar üzerlerinde çağırabilen }0bir giriş cihazıdır, bu bir İşlevin çağrıldığı +Zherhangi bir mermere 35 ekler ve düşmesine izin verir. +CAynı şeyi yapar, ancak yalnızca 12 ekler {0bir çıkış hücresidir. , bir mermer bu hücreye ulaştığında, işlev çıkıp bu çıkış cihazındaki değeri döndürür.

Yani hep birlikte, bu tahta bir değer alır ve daha sonra buna 47 ekler. Bizim için bu, herhangi bir tek basamaklı sayıyı -1 basamağının ascii koduna dönüştürdüğü anlamına gelir (bu elbette 10 için de işe yarayacaktır).

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

Bu tahta biraz daha karmaşık görünüyor. :IKartın adı olarak tanımlayabilmeniz ve bazı giriş ve çıkış aygıtlarını tespit edebilmeniz gerekir . İki farklı giriş cihazımız olduğunu fark edeceksiniz }0ve }1. Bu, bu fonksiyonun 2 giriş aldığı anlamına gelir. Ayrıca }1cihazın iki örneği olduğunu fark edeceksiniz . İşlevi çağırdıktan sonra, bu hücrelerin her ikisi de aynı değeri içerecektir. }0Girdi aygıtı doğrudan üzerinde olan \/bu çöp tenekesi olarak hareket eder ve hemen düşen bir mermer kaldırır cihaz.

}1Girdi cihazları tarafından tahtaya konan mermerler birine ne olduğuna bir göz atalım :

}1
=9 &1
&0
{>

İlk kene düşecek ve =9cihaza çarpacak . Bu, mermerin değerini 9 ile karşılaştırır ve deyim =9değerlendirilirse mermerin düşmesine izin verir . Mermer değilse sağa itilir. &0ve &1senkronizörlerdir. Diğer tüm &nsenkronizatörler de dolana kadar üzerlerine düşen mermerlere tutunurlar . Tahmin edebileceğiniz gibi, bu durum şartlı olarak tahtanın başka bir bölümünde farklı davranışları tetikleyecektir.

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

Size bunun ++bir artım aracı olduğunu söylersem, farklı senkronizörlerin ne ile dolduğunu söyleyebilmelisiniz. Solda + 1 &1giriş değeri }1, &0yanında 0 bulunur ( 00onaltılık olarak temsil edilen bir dil değişmezidir). İkinci &11 değerini içerir ve hemen &0bir ile doldurulur F7Marbelous, ekleme modülo 256 olduğu bir değerden 9 çıkarır ki,.

// herhangi bir mermeri düşmesine izin vermek yerine sola iten bir deflektör cihazıdır.

Bunları bir araya getirmek size bunu verir: eğer mermer }19 ise, &0senkronizatörler doldurulur. Bu, 0 değerinin{0 çıktıya ve F7(veya -9) çıktıya{1 . }19 değilse , + 1 {0ile doldurulacak ve }11 {0içerecektir. Bir {>cihaz da var, bu, altındaki bir tahtanın yanında bir mermer çıkaran özel bir çıktıdır. Bu, }19'a eşitse doldurulur .

@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

Tamam, şimdi büyük olan için. Dosyanın ana kartı olduğundan bu kartın açık bir adı yoktur. Örtük adı Mb. Bazı hücreleri tanıyabilmelisiniz. Bir giriş cihazı, bazı dil değişmezleri ( 00ve FF) var. Bazı senkronizörler ve bir saptırıcı var. bu parça parça geçelim.

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

Böylece giriş değeri (bu ana kart olduğu için komut satırı girişi) ikinci hücrede, bulunduğu yerden başlar }0. Düşecek ve >0başka bir karşılaştırma cihazı olan cihaza ulaşacaktır . 0'dan büyük herhangi bir mermer düşer, diğer tüm mermer sağa doğru itilir. (Marbelous değişkenleri imzasız olduğundan, sadece tam olarak 0 sağa doğru itilir). Bu sıfır değerli mermer daha sonra @6cihaza çarpar. Bu bir portaldır ve mermeri, bu durumda hemen üstündeki başka bir ilgili portala taşır. 0 mermer daha sonra &0senkronizöre ulaşacak ve başka yerlerde bazı şeyleri tetikleyecektir.

Mermer 0 değilse, düşer, birer birer azalan ve daha sonra bir klonlayıcıya düşen \\isabetlerle sağa saptırılır . Bu cihaz bir mermer alır ve bir kopyasını sağa ve bir kopyasını sola verir. Soldaki mermer yukarı aynı sıradan geçecek şekilde yukarı doğru alınacaktır . Sol taraf başka bir yere götürülecek. Bu, bize döngü başına komut satırı girdisini bir kez azaltan ve her döngüde 0'a ulaşana kadar bazı davranışları tetikleyen bir döngü verir. Daha sonra başka bir davranışı tetikler.--/\@0

Hadi içine itilen mermer ile neler olduğuna bir bakalım @4Her bir döngüye .

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

Burada ( FF) hemen portallara ayrılacak 3 dil değişmezi vardır . Bu portallar onları üç IIcihaza götürecek .II:Idosyada daha sonra tanımladığımız tahtaya atıfta bulunur . Yana :I2 ayrı giriş aygıtlarını vardır, başka gemide 's gösterimi genişliğinde 2 hücreleri olmalıdır. İçinde 6 hücre bulunduğundan II, bu fonksiyonun tahtada 3 örneğine sahip olduğumuzu söyleyebiliriz.

FF(Veya 256 veya -1, olur ise) mermerler giriş hücrelerinde oturup :Ie kadar orada yeterli girdi mermer sto fonksiyonunu başlatmak bekleyen fonksiyonu (bir daha olduğunu) gösterir. @4Portal burada devreye girer. Azalan komut satırı girişinin bir kopyası her döngüde oraya düşer. Bu, en soldaki :Ikartı tetikleyecektir . Başlangıçta 256 (veya -1) değerleri ve komut satırı girdisi -1 ise. Sol mermer içine konacak }0cihazlarının :Ikurulu ve içine doğru biri }1. Bu panonun ne yaptığını hatırlarsanız, bunun ne sonucunu olduğunu anlayabilirsiniz. Sol çıkışta sağ girişin artırılmış bir sürümünü çıkarır (ve 9'u 10 değil 0'a çevirir) ve sağda 1 veya -9'u çıkarır.

Artan değer, bir portal tarafından sağ giriş hücresine geri alınır ve sağdaki değer bir senkronizöre düşer. Bir eşleyici zaten bir mermeri tutuyorsa, iki mermer çarpışacaktır. Çarpışan mermerler modulo 256'ya eklenir. Böylece senkronizatörlerdeki değerler aşağıdakileri yapar: Boşuna başlarlar, sonra 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ve sonra 1 tekrar (247 modulo 256 eklendiğinden).

Ayrıca, giriş değeri 0'a döndüğünde bir mermerin sağa çıktığını da hatırlayabilirsiniz. :ILevhalar hemen yan yana olduğundan , bu levhayı bir kez sağa doğru tetikleyecektir. Bu, üç eşitleyiciyi, komut satırı girdisinin bir kısmi temsili olması gerektiğinden bir yüksek olan değerlerle dolduracaktır.

Ayrıca :Oişlevin bir değeri -1 değerini temsil eden basamağın ascii değerine dönüştürdüğünü de hatırlayabilirsiniz . Bu OOhücrelerin çıktıları daha sonra tahtadan düşer ve karşılık gelen ascii karakterlerini STDOUT'a yazdırır.

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

Peki komut satırı girişi mermeri 0'a ulaştığında ve &0senkronizatörleri doldurduğunda ne olur ? birkaç değer mermeri düşer ve kısa devre numarasının rakamlarını (+ 1) kartın altında tutan üç senkronizörü tetikler. &3en önemli basamağını içerdiğinden, ilk olarak tetiklenen alır, daha sonra geliyor &2izledi &1. Bu mermer daha sonra tahtaya son veren hücreye @5çarpmadan önce diğer cihaza ışınlanır !!.


4
Neredeyse bu geçerli Perl kodu olabilir gibi görünüyor
Kapı tokmağı

12

CJam, 14 11 bayt

l40f-Ab)s1>

Çevrimiçi deneyin.

Nasıl çalışır

Bu yaklaşım büyük ölçüde edc65'in cevabına dayanmaktadır ( açık izniyle ):

" 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>

Örnek çalışma

$ 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
Bu müstehcen
Claudiu

3
Daha da kısaltmanın bir yolunu bulmak için +1
edc65

6

Python 2 (38) (43)

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

Karakter ikamesi yok, sadece aritmetik.

Ungolfed:

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

Özyinelemenin işe yaraması için iyi bir nedenim yok, sadece bu kalıbı değerler listesine sığdırıyorum. Eğer her n-1birinin , düzenli rakam temsilini alırsınız.

Golf için, parenlerden tasarruf veya daha yüksek bir öncelikle ~-nhesaplamak n-1için kullanıyorum . Bu sadece boş dizeyi ne zaman ve başka bir dizgeyi üretmektir . Bu amaç için herhangi bir dize olabilir./10%10n*'_'n=0'_'


4

Yakut, 70 68 66 64 57 bayt

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

Like olarak adlandırılacak bir işlevi tanımlar f[42]. İşte algoritmanın kabaca dağılımı:

  • Tedavi etmek 0Ayrı .
  • Bir sonraki 10 güç artık sayıya sığmayacak şekilde 10'luk güçleri çıkarın.
  • Sayıyı, solda sıfır bulunan bir dizeye dönüştürün.

Bir biçim dizesi kullanma fikri için krediler Falko!


Alternatif olarak, edc65'in yaklaşımını kullanarak:

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

Bu 45 bayt ve sadece dahil ediyorum, çünkü onu onunla dövmüyorum. ;)


Elbette. Sanırım uzun Python kodumla seni yakalamayacağım zaten. ;)
Falko

Birisi golf dillerden birinde bu yaklaşımı kullanılırsa eminim @Optimizer onlar (Varlık oldukça anda 45 yaşında ... Bu yaklaşım ile Ruby 44 ulaşamaz dedi) 20'nin altında olacaktı
Martin Ender

2
@Optimizer Buna katılmıyorum. Yeni başlayanlar için, J ve APL golf dilleri değildir ve GolfScript ve CJam kadar sık ​​kazanırlar. Dahası, golf oynamak yeşil onay işaretiyle değil, "liginizdeki" gönderimleri yenmekle ilgili. Bu 4 dil dışında hepsini yenen bir Ruby yazısı yazarsam, bu konuda oldukça mutlu olabilirim ve daha ayrıntılı dillerde golf oynamaktan yasaklanmaları gerekmez. Aslında, edc'ler gibi "normal" bir dilde zeki bir golfün, bir golf dilinde naif (ancak daha kısa) bir uygulamadan çok daha fazla oy alma olasılığı daha yüksektir.
Martin Ender

3

Haskell, 67 bayt

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

bu çözüm temel olarak, kısa devre notasyonunda verilen sayıda 1 ekler.

kullanımı:

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

3

CJam, 16 bayt

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

Çevrimiçi deneyin. En az O (n) zaman ve bellek gerektirir, bu yüzden çevrimdışı tercümana 100501 bırakın ...

Nasıl çalışır

Bu yaklaşımın arkasındaki temel fikir, en az N kısa devre ondalık sayılarını doğal düzeninde hesaplamak ve N. Çok verimli değil ama kısa.

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.                                       ";

Örnek çalışma

$ 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

Bash + coreutils, 27 bayt

Port @ edc65 akıllı bir cevap ile, Dennis'in iyileştirmeler @ :

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

Çıktı:

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

Önceki cevap:

Bash + coreutils, 71 54 bayt

İşte bunu yapmanın biraz farklı bir yolu:

jot -w%x $1$1|tr 0-9a a0-9|grep -P ^\\d+$|sed $1!d 2>-
  • jot onaltılık tam sayıları artıran çıktılar
  • tr bunu (0,1, ..., 8,9, b, ... f, 0a, 00,01, ..., 99,9b, ..., ff, 0aa, ..., 000 biçimine dönüştürür , ...)
  • grep vermek için rakam içeren tüm satırları filtreler (0,1, ..., 8,9,00, ..., 99,000 ....)
  • sed n'inci satır dışındaki tüm öğeleri siler
  • STDERR, '-' boş bir dosyaya yönlendirilir, böylece 0 iletildiğinde boş dizeyi alırız ( sed1'den başlayan satır numaralarını sayar, 0 geçtiğinde hatalar sayılır)
  • Sayıları ile filtrelediğimiz grepiçin , giriş numarasıyla seq/ dcgiriş sayısından daha fazla temel 11 tamsayı üretmemiz gerekir . N hanelerinin tekrarlanması yeterli değildir.

Kısa sayfa numarası yazdırıldıktan seqsonra $1$1, özellikle daha büyük giriş numaraları için yavaşlayan sayılar üretmeye devam ettiğine dikkat edin - O (n²), bence. seqBaskıdan hemen sonra 7 bayt maliyetle çıkmayı hızlandırabiliriz :

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

Soruda hız gereksinimi yok, bu yüzden ana cevabım için daha kısa versiyonla gidiyorum.


@ Optimize edici hayır: deneyin s='jot -w%x $1$1|tr 0-9a a0-9|grep -P ^\\d+$|sed $1!d 2>-'; echo ${#s}. Ben "\\" bir karakter olarak davranır dize uzunluğu ölçmek için python kullanıyor olabilirsiniz.
Dijital Travma

2
Cevabım şimdi değişti, ancak ilk revizyonda akıllıca bir şey yaparsam, tamamen tesadüfen oldu. Bu edc65'in cevabının doğrudan poruydu; 8'ler hepsi onun ... - Yardımcı değişken $agereksiz görünüyor; cut -b2-<<<$[$1-~${1//?/8}]iyi çalışmalı.
Dennis

1
@Dennis Doğru görüyorum. Önerin için teşekkürler!
Dijital Travma

2

Python 2-84, 70 66

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

Alternatif yaklaşım (aynı uzunlukta):

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

Bir biçim dizesi kullanmak akıllıca! Umarım bunu da kullanırsam sakıncası olmaz. :)
Martin Ender

2

Python 3, 107 karakter

Bu kazanmayı bitirmedi ama akıllı olduğunu düşündüm:

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]

Tüm dizi için 64 karakterde bir jeneratör tanımlarım. Ne yazık ki, jeneratörün nci elementini elde etmek için bazı eğrilerden geçmeliyim ... eğer yapabilseydim S=lambda n:G()[n].


2

Pyth , 12

@ Edc65'in cevabının başka bir limanı, açık kazanan (IMO) kim:

t`+hQv*l`Q\8

Test paketi (@DigitalTrauama sayesinde):

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

Açıklama:

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

CJam ve Pyth; savaş devam ediyor. : P
Dennis

Pyth'e bu meydan okuma için bir şans vermeye çalıştım, ancak bir Listeyi tamsayı haline getirmenin bir yolunu bulamadım (örneğin, [8, 8, 9] -> 889). Bunu nasıl yaptın?
Dennis

@Dennis Listeden int'e ulaşmak için, temelde dizeden geçmeniz gerekir. jklistenizi bir dizeye ve vbunu bir int'e dönüştürür. Bu yüzden vjk[8 8 9]889 sayısını verecektir.
isaacg

Tamam teşekkürler. Ne yazık ki, dize dönüştürme bazı hileleri imkansız hale getirir. CJam / GolfScript temel dönüştürme ile [2 -1] -> 19ve [1 11] -> 21.
Dennis

1
@Dennis Evet, aslında Pyth'e temel dönüşüm eklediğimde, bu işe yarayacak. Ama henüz yapmadım.
isaacg


1

Haskell , 57 bayt

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

Çevrimiçi deneyin!

Cevabın içine sonsuz bir kısa sayı ve indeks listesi oluşturur. g nönceki nesil sayıların her birinin önüne bir sonraki basamağı ekleyerek sayıların n. "kuşağı" nı oluşturur.



0

Excel, 37 bayt

@ Edc65 yaklaşımını kullanarak:

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

0

Jöle , 5 bayt

ḃ⁵ịØD

Çevrimiçi deneyin!

Jelly için çok yeniyim, eğer bunu geliştirebilirsen lütfen yorum yap!

Açıklama:

ḃ⁵ịØ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)

(Res'in yukarıdaki açıklamasına göre, sorun sayıyı iki yönlü tabana dönüştürmekle eşdeğerdir 10)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.