ลำดับ Seqindignot


27

ชื่อเรื่องถูกสร้างขึ้นจาก 'ลำดับดัชนีหลักไม่ใช่'

ท้าทาย:

ได้รับจำนวนเต็มnซึ่งคือการ>= 0ส่งออกnจำนวน 'th ของลำดับต่อไปนี้
นี่คือ 50 รายการแรกที่มีดัชนี (0 ดัชนี) อยู่ด้านบน:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
1 0 3 2 5 4 7 6 9 8 22 20 30 24 23 26 25 28 27 32 11 33 10 14 13 16 15 18 17 31 12 29 19 21 50 40 41 42 44 45 35 36 37 51 38 39 52 53 55 56 34

ลำดับนี้ทำงานอย่างไร

หมายเลขที่ดัชนีnจะต้องเป็นหมายเลขแรกตามลำดับที่ไม่มีตัวเลขใด ๆ เหมือนกันnและยังไม่เกิดขึ้นสำหรับดัชนีก่อนหน้านี้ ดังนั้นเมื่อเราดูลำดับปกติเช่นนี้จาก0-60:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60

เรากำหนดค่าn'th เช่นนี้:

  • 0: หมายเลขแรก ( 0) มีตัวเลขเดียวกันดังนั้นเราจึงค้นหาหมายเลขถัดไป ( 1) ซึ่งไม่มีตัวเลขเดียวกัน ดังนั้นเอาท์พุทn=01
  • 1: จำนวนครั้งแรก ( 0) ไม่ได้มีหลักเดียวกันดังนั้นเอาท์พุทn=10
  • 2: เราได้พบแล้ว0และ1และตัวเลขถัดไป ( 2) มีตัวเลขเดียวกันดังนั้นเราจึงค้นหาถัดไป ( 3) ซึ่งไม่มีตัวเลขเดียวกัน ดังนั้นเอาท์พุทn=23
  • ...
  • 10: เราได้พบแล้วดังนั้นในบรรทัดถัดไปคือ0-9 ประกอบด้วยหลักที่ตรงกัน, มีหลักที่ตรงกัน, มีหลักที่ตรงกันอีกครั้งเป็นที่ถูกต้องเพื่อให้เอาท์พุท1010-19120021122n=1022
  • เป็นต้น

กฏท้าทาย:

  • หากภาษาของคุณได้รับการจัดทำดัชนี 1 (หรือคุณเลือก) คุณจะได้รับอนุญาตให้เริ่มต้นลำดับที่3 2 5 4 7 ...(ข้าม1at n=0และ0at n=1)
  • 25,000ดัชนีต่ำสุดที่ใหญ่ที่สุดที่คุณควรสนับสนุนคือ หมายเหตุ: ลำดับหยุดที่ดัชนี1,023,456,788เนื่องจากดัชนีถัดไปในบรรทัดประกอบด้วยตัวเลข 10 หลักทั้งหมด
  • คุณยังได้รับอนุญาตให้ส่งออก / ส่งกลับอาร์เรย์ / รายการลำดับทั้งหมดจนถึงและรวมถึงดัชนีnถ้าคุณต้องการ

กฎทั่วไป:

  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ
    อย่าปล่อยให้ภาษาโค้ดกอล์ฟกีดกันคุณจากการโพสต์คำตอบด้วยภาษาที่ไม่ได้เข้ารหัส พยายามหาคำตอบสั้น ๆ ที่เป็นไปได้สำหรับภาษาโปรแกรม 'ใด ๆ '
  • กฎมาตรฐานจะใช้สำหรับคำตอบของคุณดังนั้นคุณจึงได้รับอนุญาตให้ใช้ STDIN / STDOUT ฟังก์ชั่น / วิธีการที่มีพารามิเตอร์ที่เหมาะสมและชนิดผลตอบแทนโปรแกรมเต็มรูปแบบ การโทรของคุณ
  • ช่องโหว่เริ่มต้นเป็นสิ่งต้องห้าม
  • หากเป็นไปได้โปรดเพิ่มลิงค์พร้อมทดสอบรหัสของคุณ
  • นอกจากนี้โปรดเพิ่มคำอธิบายหากจำเป็น

กรณีทดสอบ:

ลำดับนี้สร้างคู่ที่เกี่ยวข้องกับดัชนีและผลลัพธ์ หากดัชนีnผลoดัชนีเอาท์พุทo nดังนั้นคุณสามารถป้อนข้อมูลทั้งด้านซ้ายหรือขวาและผลลัพธ์จะเป็นด้านอื่น ๆ :

0      <->  1       (this test case is optional)
2      <->  3
10     <->  22
12     <->  30
34     <->  50
89     <->  100
111    <->  200
112    <->  300
199    <->  322
2231   <->  4456
9605   <->  11118
19235  <->  46000
23451  <->  60668
25000  <->  13674

นี่คือ pastebin ของกรณีทดสอบ 25,001 รายการแรกหากคุณต้องการลองแบบอื่น



3
เช่นเดียวกับความท้าทายที่เกี่ยวข้องscatterplot คือสนุกมาก :)
Martin Ender

@ มาร์ตินเอนเดอร์เมื่อฉันเห็นการกระจายของความท้าทายที่เกี่ยวข้องฉันคิดว่าอันนี้จะคล้ายกัน ปรากฎว่ามันค่อนข้างคล้ายกัน แต่ก็ยังแตกต่างกัน :)
Kevin Cruijssen

เหตุใดการเรียงลำดับที่สำคัญจึงไม่ได้อยู่ใน OEIS
Stewie Griffin

@StewieGriffin เป็นคำถามที่ดี ที่จริงแล้วฉันคิดว่าความท้าทายลำดับทั้งหมดของฉันไม่ได้อยู่ใน OEIS (ตอนนี้) เมื่อฉันโพสต์พวกเขา ;)
Kevin Cruijssen

คำตอบ:


3

Pyth , 18 ไบต์

u+Gf!|}TG@`H`T0hQY

ลองที่นี่! หรือตรวจสอบกรณีทดสอบเพิ่มเติม!

โปรดทราบว่าสิ่งนี้จะคืนค่าลำดับทั้งหมดจนถึงดัชนีNแต่ลิงก์จะคืนค่าตัวเลขสุดท้ายเท่านั้นโดยการเติมe(จบ) หากคุณต้องการที่จะเห็นค่าดิบกลับโดยโปรแกรมนี้เพียงแค่เอามันออกไป

มันทำงานอย่างไร

u + Gf! |} TG @ `H`T0hQY - โปรแกรมเต็มรูปแบบ

u ... hQY - ลด hQ (การเพิ่มอินพุต) จากซ้ายไปขวาด้วยการ
                       ฟังก์ชัน ... (G, H), ด้วยค่าเริ่มต้น Y (รายการว่าง)
                       G คือค่าปัจจุบันและ H คือดัชนีการวนซ้ำ
   f 0 - จำนวนเต็มแรกเริ่มต้นจาก 0 ซึ่งเป็นไปตาม:
      } TG - ปรากฏใน G ...
     | @ `H`T - หรือจุดตัด (สตริง) พร้อมดัชนีปัจจุบัน (H) คือ
                        ไม่ว่างเปล่า
    ! - ตรรกะไม่ได้ (การปฏิเสธบูลีน)
 + G - ผนวกค่าที่ได้รับด้านบนกับค่าปัจจุบัน (G)
                      นี่จะกลายเป็นค่าที่กำหนดสำหรับการวนซ้ำครั้งถัดไป
                    - พิมพ์ผลกลางทั้งหมดโดยนัยหรือเพิ่ม e เพื่อพิมพ์ 
                      สุดท้าย.

6

Python 2 , 92 91 89 88 ไบต์

a=()
i=0
exec"x=0\nwhile set(`x`)&set(`i`)or x in a:x+=1\na+=x,;i+=1;"*-~input()
print a

ลองออนไลน์!

พิมพ์รายการของn+1ตัวเลขแรก


วิธีการที่แตกต่างกันซึ่งเร็วกว่ามาก:

Python 2 , 96 ไบต์

n=input()
r=range(9*n)
i=0
exec"x=0\nwhile set(`r[x]`)&set(`i`):x+=1\nprint r.pop(x),;i+=1;"*-~n

ลองออนไลน์!



3

Haskell, 80 69 ไบต์

f n=[x|x<-[0..],all(`notElem`show n)$show x,all(/=x)$f<$>[0..n-1]]!!0

ลองออนไลน์!

nช้ามากขนาดใหญ่

f n=
    [x|x<-[0..]     ] !!0          -- pick the first of all 'x' from [0..]
                                   -- where
      all(`notElem`show n)$show x  -- no digit of 'n' appears in 'x', and
      all(/=x)                     -- 'x' is not seen before, i.e. not in the list
               f<$>[0..n-1]        -- 'f' mapped to [0..n-1]

แก้ไข: @Laikoni บันทึก 10 ไบต์ ขอบคุณ!


การคำนวณคำที่ n โดยตรงแทนการสร้างดัชนีลงในลำดับนั้นสั้นกว่า: ลองออนไลน์!
Laikoni

2

APL (Dyalog) 39 ไบต์

0∘{0=⍵:1⋄(~⍺∊0∇¨⍳⍵)∧⊃∧/≠/⍕¨⍺⍵:⍺⋄⍵∇⍨⍺+1}

⎕IO←0การใช้ประโยชน์

ลองออนไลน์!

อย่างไร?

recursion

0=⍵:1 - เดา

~⍺∊0∇¨⍳⍵ - ARG ซ้าย (ตัวสะสม) ไม่ได้อยู่ในผลลัพธ์ก่อนหน้า

∧⊃∧/≠/⍕¨⍺⍵- และการแทนสตริงของตัวสะสมและnแตกต่างกัน

:⍺ - จากนั้นส่งคืนตัวสะสม

⍵∇⍨⍺+1 - ไม่เช่นนั้นจะเพิ่มการสะสมและการชดเชย


ว้าว .. ฉันรู้ว่ากฎเริ่มต้นคือ "ได้รับจำนวนหน่วยความจำและเวลา" แต่รหัสของคุณหมดเวลาแล้วn=10ใน TIO .. : S นั่นต้องเป็นการดำเนินงานที่มีประสิทธิภาพมาก การเรียกซ้ำที่เป็นสาเหตุของปัญหานี้หรือเป็นสิ่งอื่นที่เป็นคอขวดหรือไม่
Kevin Cruijssen

2
@KevinCruijssen เงื่อนไขที่สองโดยทั่วไปใช้ฟังก์ชั่นในช่วง 0..n-1 และการพิจารณาการสมัครเดียวกันสำหรับการโทรทุกครั้งที่จะมาประมาณ O (2 ^ n) ขนาดใหญ่ แน่นอนมันจะต่ำด้วยรหัสที่เหมาะสมมากขึ้น แต่นั่นคือสิ่งที่คอขวดนั่ง
ยูเรียล


2

Java (OpenJDK 8) , 218 217 213 210 202 200 172 171 170 168 167 ไบต์

ฉันไม่อยากจะเชื่อเลยว่าฉันจะไม่กลับมาkตลอดเวลา ...

i->{int j=-1,k=0,y=1;for(String r=" ",e=r;j++<i;r+=~-k+e,y=1)for(k=0;y>0;k++)for(int f:(k+(y=0)+"").getBytes())y+=(e+j).indexOf(f)<0&!r.contains(e+k+e)?0:1;return~-k;}

ลองออนไลน์!


อืมมันเป็นวิธีการที่แตกต่างจากเดิมที่ฉันใช้เมื่อฉันสร้าง pastebin ด้วยโปรแกรม Java ของฉัน และดูเหมือนว่าคุณสามารถกอล์ฟfor(char f:(""+k).toCharArray())เพื่อfor(int f:(""+k).getBytes()), และr.substring(-~r.trim().lastIndexOf(32)); r.substring(r.lastIndexOf(32)-1)
Kevin Cruijssen

ต้องถูกตัดออกก่อนหน้าสุดท้ายดัชนีของมีที่ว่างในตอนท้าย
Roberto Graham

อาฉันทำผิดพลาดจริง ๆ .. ฉันรู้ว่า String มีทั้งพื้นที่ชั้นนำและส่วนท้าย แต่การเปลี่ยนแปลงที่แนะนำของฉันไม่ถูกต้องใช้ได้กับตัวเลข 10 หลักแรกเท่านั้น .. แย่
Kevin Cruijssen

2

ไป , 217 205 ไบต์

package g;import("fmt";"strconv";"strings");var(
d=make(map[int]int)
a=strconv.Itoa)
func G(L int){k,i:=0,0;for;i<=L;i++{s:=a(i);k=0;for d[k]>0||strings.ContainsAny(a(k),s){k++;}
d[k]=1;}
fmt.Print(a(k));}

รุ่นอื่น (โปรแกรมแทนแพ็คเกจ): ลองออนไลน์!

การปรับปรุง:

  • ลบพื้นที่ด้านนอกforโดยใช้การมอบหมายหลายรายการi,k
  • การนำเข้า"fmt";+ fmt.Printสั้นกว่าos.Stdout.WriteString(ต้องพักจากpackage mainเมื่อต้องใช้ os.Args)

ดีคำตอบของคุณคือคำตอบแรกที่ไม่หมดเวลาหลังจาก 1 นาทีเมื่อฉันลองทำ25000แบบทดสอบ :) ดังนั้นไม่เพียง แต่เป็นโซลูชั่นที่ใช้ได้ แต่มีประสิทธิภาพที่ดีเช่นกัน +1 จากฉัน! (PS: ใน TIO-link ของคุณเป็นอาร์กิวเมนต์ที่คุณใช้สามารถลบอินพุต / ไม่ได้ใช้)
Kevin Cruijssen

2

JavaScript (ES6), 103 88 81

แก้ไขปรับปรุงรวมถึงหลาย ๆความคิดที่ฉลาดโดย @Neil

n=>eval("for(r=[j=i=0];i<=n;)j=r[j]||(i+'').match(`[${j}]`)?j+1:!(r[k=j]=++i);k")

จุดเริ่ม

แนวคิดพื้นฐาน: การวนซ้ำตั้งแต่ 0 ถึง n และยังไม่ได้ใช้การตรวจสอบค่าวงภายใน

n=>{
  var r=[]
  for(i=0;i<=n;i++)
  {
    s=new Set(i+'')
    for(j=-1;s;)
    {
      if (!r[++j] && ![...j+''].some(d=>s.has(d)))
      {
        r[j]=1
        console.log(i,j)
        s=0
      }
    }
  }
  return j
}

เวอร์ชันปัจจุบันอ่านง่ายขึ้น

n=>{
  for(r = [j=i=0]; i <= n; )
    if (r[j] || (i+'').match(`[${j}]`))
      ++j
    else
      r [k=j] = ++i,
      j = 0;
  return k
}

ทดสอบ

var f=
n=>eval("for(r=[j=i=0];i<=n;)j=r[j]||(i+'').match(`[${j}]`)?j+1:!(r[k=j]=++i);k")

update=_=>{
  var i=+I.value
  if (i < 1e4 || confirm("Really?")) {
    O.textContent=i + ' -> ...'
    setTimeout(_=>O.textContent=i + ' -> ' + f(i), 100)
  }
}  

update()
<input id=I value=100 type=number max=1023456788>
<button onclick='update()'>Go</button>
(slow when input > 1000)
<pre id=O></pre>


จะแทนที่~s.search(d)ด้วยs.match(d)งานหรือไม่
Neil

ฉันคิดว่าคุณสามารถบันทึกไบต์อื่นโดยการเปลี่ยน0ไปj++เอา++จากjมันเป็นก่อนและจากนั้นเริ่มต้นjจากการแทน0 -1
Neil

ฉันคิดว่าฉันสามารถเปลี่ยนไปใช้ลูปเดี่ยวได้:n=>eval("for(r=[j=i='0'];i<=n;)r[j]|[...''+j].some(d=>i.match(d))?j++:(i=++i+'',r[k=j]=1,j=0);k")
นีล

@ ไม่มีห่วงเดียวจะยอดเยี่ยม
edc65

@Neil วงเดียวยอดเยี่ยมขอบคุณ
edc65

2

อ็อกเทฟ , 114 ไบต์

N=input("");o=[1];for i=1:N;j=0;while(any(o==j)||nnz(ismember(int2str(i),int2str(j))));j++;end;o=[o,j];end;[0:N;o]

ลองออนไลน์!

ขอบคุณKevin CruijssenและDloscสำหรับการเปรียบเทียบตัวละครกอล์ฟ

Ungolfed

N=input("");o=[1];

for i=1:N;
    j=0;
    while(any(o==j)||nnz(ismember(int2str(i),int2str(j))));
        j++;
    end;
    o=[o,j];
end;
[0:N;o]

คำอธิบายพื้นฐาน:

  • ลูปภายนอกและลูปด้านในหนึ่งรายการสำหรับดัชนีiและอีกวงหนึ่งสำหรับค่าที่จะเพิ่มj
  • สำหรับแต่ละรายการiให้เพิ่มขึ้นต่อไปjหากตรงตามข้อใดข้อหนึ่งต่อไปนี้:

    1. ใด ๆ ที่jถูกนำมาใช้ก่อน
    2. อันนี้ได้รับความสนุกสนาน ขั้นแรกให้แยกแต่ละค่าตัวเลขลงในเวกเตอร์ของตัวเลข (เช่น10กลายเป็น[1 0]) int2strโดยใช้ จากนั้นให้เปรียบเทียบตัวเลขทั้งสองที่ใช้ismember(เช่น[1 0]และ[2 1]จะกลับมา[1 0]) จากนั้นnnzเพื่อดูว่ามีคอลัมน์ใดตรงกันหรือไม่
  • หากไม่ตรงกับด้านบนคุณจะมีหมายเลขต่อไป! ผนวกกับoเมทริกซ์เอาต์พุต

  • พิมพ์ดัชนีต้นฉบับด้วยเมทริกซ์เอาต์พุต

คำตอบที่ดี +1 จากฉัน และดูเหมือนว่า @DLosc -'0'เป็นสิทธิที่จะทำงานได้โดยไม่ต้องทั้งสอง แต่ถ้ามีกรณีขอบบางอย่างที่เราทั้งคู่ไม่ได้คิด-48จะเป็นทางเลือกที่สั้นกว่า นอกจากนี้ทั้งสองสามารถsprintf('%d',...) int2str(...)
Kevin Cruijssen


1

Pip , 30 ไบต์

รหัส 29 ไบต์ +1 สำหรับการ-pตั้งค่าสถานะ

Fn,a+1{Y0WyNl|_NyMSn++ylPBy}l

ลองออนไลน์!

ส่งออกรายการทั้งหมด คำเตือน: ไม่มีประสิทธิภาพสูง 2231กรณีการป้อนข้อมูลได้รับการทำงาน 35 กว่านาทีบนแล็ปท็อปของฉันและยังไม่เสร็จสิ้น

คำอธิบาย

                               a is cmdline arg, l is [] (implicit)
Fn,a+1{                    }   For each n in range(a+1):
       Y0                       Yank 0 into y
         W                      While...
          yNl|                  y is in l, or...
              _Ny               lambda function: arg is in y
                 MSn            mapped to digits of n and result list summed
                                (i.e., any digit of n is in y):
                    ++y          Increment y
                       lPBy     Once we have a y that meets the criteria, push it to
                                the back of l
                            l  Output l (formatted with -p flag)

1

Visual Basic .NET (.NET 4.5) , 260 259 ไบต์

-1 ไบต์ต้องขอบคุณ Kevin Cruijssen

Function A(n)
Dim p=New System.Collections.Generic.List(Of Long),j="0",g=0
For i=0To n
j=0
While 1
If Not p.Contains(j)Then
g=1
For Each c In i.ToString
If j.Contains(c)Then g=0
Next
If g Then Exit While
End If
j+=1
End While
p.Add(j)
Next
A=p(n)
End Function

วนซ้ำสร้างคำก่อนหน้าในลำดับเพื่อเปรียบเทียบในภายหลัง จากนั้นวนซ้ำเป็นสตริงเพื่อค้นหาการจับคู่

ละเมิดระบบการพิมพ์ของ VB.NET ตัวอย่างเช่นjเป็นสตริง แต่เพิ่มหนึ่งแปลงเป็นจำนวนเต็มสำหรับฉัน จำนวนเต็มจะถูกแปลงเป็น Booleans ที่0เป็นและที่เหลือเป็นFalseTrue

ลองออนไลน์!


ฉันไม่เคยตั้งโปรแกรมใน Visual Basic แต่ดูเหมือนว่าคุณสามารถลบพื้นที่ได้If Not p.Contains(j)Thenเหมือนกับที่คุณทำIf j.Contains(c)Then g=0ด้านล่าง นอกจากนี้ยังIf Not p.Contains(j)Then \n g=1 \n For Each c In i.ToString \n If j.Contains(c)Then g=0 \n Next \n If g Then Exit While \n End Ifสามารถทำให้สั้นลงได้โดยการลบgและใช้งานExit Whileโดยตรงใน for-loop: If Not p.Contains(j)Then \n For Each c In i.ToString \n If j.Contains(c)Then Exit While \n Next \n End Ifซึ่งจะกลายเป็น241 ไบต์โดยรูปลักษณ์ของมัน
Kevin Cruijssen

@KevinCruijssen สามารถลบพื้นที่ออกได้แน่นอนContains(c)Thenฉันเพิ่งพลาดไป ฉันชอบสิ่งที่คุณคิด แต่ฉันใช้gเป็นแมวมองเพื่อดูว่าสตริงมีจำนวนหรือไม่ ลิงก์ของคุณให้คำตอบที่ผิด แต่ฉันจะดูว่าฉันสามารถแก้ไขตรรกะภายในบางอย่างตามสิ่งที่คุณคิด
Brian J

อ๊ะ .. มันล้มเหลวจริงๆ .. ตอนนี้มันแค่เอาท์พุทอินพุตเท่านั้น ความผิดฉันเอง. ไม่ควรแสดงความคิดเห็นเหล่านี้เมื่อถึงเวลาเย็นและฉันเหนื่อยจากการทำงาน ;)
Kevin Cruijssen

1

เยลลี่ , 20 ไบต์

Pythชนะ Jelly ไป Mr. Xcoder!

Df⁹LD¤ȯeṆ
0ç1#ɓ;
1Ç¡

โปรแกรมเต็มรูปแบบที่รับอินพุตจาก STDIN และแสดงผลในตัวเลือกรูปแบบรายการโดยใช้การแสดงรายการของ Jelly * ใช้การจัดทำดัชนีตามมาตรฐาน 0

* รายการองค์ประกอบเดียวไม่มีสิ่งรอบตัว[]ดังนั้น0เอาท์พุท1ในขณะที่1เอาท์พุท[1, 0]ฯลฯ

ลองออนไลน์!

อย่างไร?

Df⁹LD¤ȯeṆ - Link 1, can append n to current? n, number; current, list
D         - convert n to decimal list
     ¤    - nilad followed by link(s) as a nilad:
  ⁹       -   chain's right argument, current
   L      -   length
    D     -   convert to a decimal list
 f        - filter discard from left if not in right
       e  - n exists in current?
      ȯ   - left logical OR right (empty lists are falsey)
        Ṇ - logical NOT

0ç1#ɓ; - Link 2, append next number: current, List
   #   - n find (count up finding first n matches):
  1    - ...finding: 1 match
0      - ...stating at: n=0
 ç     - ...doing: the last link as a dyad (left=n, right=current)
    ɓ  - new swapped-arg-dyadic chain (left = current, right = list of the found n)
     ; - concatenate

1Ç¡ - Main link: no arguments
1   - initialise the return value to 1
  ¡ - repeat input() times:
 Ç  -   last link (2) as a monad
    - implicit print
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.