Wyjście sekwencji van der Corputa

27

Sekwencja van der Corputa jest jednym z najprostszych przykładów sekwencji o niskiej rozbieżności . Jego n-ty termin jest po prostu 0.(n written in base 10 and mirrored), więc jego pierwsze terminy to:

0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.01, 0.11, 0.21, 0.31, 0.41, 0.51, 0.61, 0.71, 0.81, 0.91, 0.02, 0.12, 0.22, 0.32, 0.42, 0.52, 0.62, 0.72, 0.82, 0.92, ...

Wyzwanie

Napisz program lub funkcję w dowolnym języku programowania, który przyjmuje jako liczbę dodatnią liczbę całkowitą nmniejszą niż 10^6i zwraca lub drukuje pierwsze nwarunki sekwencji van der Corputa. Format wyjściowy może być listą liczb zmiennoprzecinkowych, listą ciągów formularza 0.digitslub unikatowym ciągiem, w którym terminy są oddzielone przecinkami i / lub spacjami, znakami nowej linii.

Standardowe luki są zabronione. Najkrótszy kod źródłowy wygrywa.

Kok
źródło

Odpowiedzi:

16

05AB1E , 6 bajtów

Kod:

>GNÞR,

Wypróbuj online!

Wyjaśnienie:

>       # Increment, pushes input + 1
 G      # For N in range(1, input + 1):
  N     # Push N
   Þ    # Convert to double, which appends `.0` at the end of an integer
    R   # Reverse top of the stack
     ,  # Pop and print with a newline

Wykorzystuje kodowanie CP-1252.

Adnan
źródło
Masz na myśli, Windows-1252?
Ismael Miguel
@ IsmaelMiguel To samo
Adnan
Wiem, ale zwykle nie rozpoznaje nazwy CP-1252
Ismael Miguel
Czy musiałeś zmienić język na potrzeby tego wyzwania?
Andrew Savinykh
@AndrewSavinykh Nie, to jest uważane za oszustwo i nie jest dozwolone na tej stronie. Działa z wersją 7.3 , która została wydana przed opublikowaniem tego wyzwania.
Adnan
8

Oracle SQL 11.2, 64 62 58 bajtów

SELECT REVERSE(LEVEL||'.0')FROM DUAL CONNECT BY LEVEL<=:1;

Stara wersja

SELECT '0.'||REVERSE(TRIM(LEVEL))FROM DUAL CONNECT BY LEVEL<=:1;

Łączenie „” z liczbą powoduje rzut na ciąg. Jest o 2 bajty krótszy niż przy użyciu TRIM (), który jest krótszy niż TO_CHAR ().

Ponieważ łączenie łańcucha z NUMBER powoduje utworzenie łańcucha, można go używać do zarządzania „0”. część wyniku.

Jeto
źródło
7

CJam, 14 11 bajtów

Dzięki Sp3000 za oszczędność 3 bajtów.

ri{)d`W%S}/

Sprawdź to tutaj.

Wyjaśnienie

ri     e# Read input and convert to integer N.
{      e# For each i from 0 to N-1...
  )    e#   Increment.
  d    e#   Convert to double.
  `    e#   Get string representation (which ends in ".0").
  W%   e#   Reverse.
  S    e#   Push a space.
}/
Martin Ender
źródło
7

Perl 6, 24 22 20 bajtów

{"0."X~(^$_)».flip}

Dzięki Aleks-Daniel Jakimenko-A. jeszcze dwa bajty

stara wersja

{("0."~.flip for ^$_)}
# Alternate below, same byte count
{map ^$_: "0."~*.flip}

EDYCJA: Dzięki raiph za dodatkowe 2 bajty

stosowanie

> my &f = {"0."X~(^$_)».flip}
-> ;; $_? is raw { #`(Block|333498568) ... }
> f(25)
(0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 0.01 0.11 0.21 0.31 0.41 0.51 0.61 0.71 0.81 0.91 0.02 0.12 0.22 0.32 0.42)
Skróty klawiszowe
źródło
1
{("0."~.flip for ^$_)}zapisuje 2 bajty
raiph
6

Mathematica, 40 bajtów

"0."<>StringReverse@ToString@#&~Array~#&

Przypadek testowy

%[20]
(* {0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,0.01,0.11,0.21,0.31,0.41,0.51,0.61,0.71,0.81,0.91,0.02} *)
njpipeorgan
źródło
5

Pyth, 8 bajtów

m_`cd1SQ

Wypróbuj online.

To naprawdę tylko połączenie tego i tej odpowiedzi. Dlatego robię z niej wiki społeczności.

rev Pietu1998
źródło
4

Pyth, 11 bajtów

m+"0."_`dSQ

Wypróbuj tutaj!

Wyjaśnienie

m + „0.” _ `dSQ # Q = wejście

m SQ # Odwzoruj zakres (1, Q) na ...
 + # ... konkatenacja:
  „0.” _ `D #" 0. ” i element odwrócony
Denker
źródło
4

Pyth - 10 bajtów

_M+R".0"SQ

Wypróbuj online tutaj .

Maltysen
źródło
Jeden bajt mniejszy, jeśli to zrobiszVSQ...
Jakube
4

JavaScript (ES6), 58

Anonimowa funkcja zwracająca ciąg znaków z wartościami oddzielonymi przecinkami

n=>[...[...Array(n)].map(_=>n--+'.0')+''].reverse().join``

TEST

f=n=>[...[...Array(n)].map(_=>n--+'.0')+''].reverse().join``

function test() { R.textContent = f(+I.value) }

test()
N:<input id=I type=number value=20 oninput="test()"><br><pre id=R></pre>

edc65
źródło
4

MATL , 10 bajtów

:"'0.'@VPh

Wypróbuj online!

:          % implicit input. Generate vector [1,2,...,input]
"          % for each
  '0.'     %   push string '0.'
  @        %   push loop variable (that is, 1,2,3,... in each iteration)
  V        %   convert to string
  P        %   reverse
  h        %   concatenate horizontally
           % implicit end of loop
           % implicit display of all stack contents
Luis Mendo
źródło
4

Haskell, 36 , 27 bajtów

f n=reverse.show<$>[1.0..n]

Dwa bajty zapisane przez nich i dodatkowe 7 przez Lynn.

Michael Klein
źródło
f n=reverse.show<$>[1.0..n]
Lynn
3

Brachylog , 23 bajty

:0re:""rcr:"0."rcw,@Sw\

Pobiera to liczbę jako dane wejściowe i wyprowadza wynik do STDOUT, oddzielone spacjami.

Dość bezpośredni. Niestety musimy połączyć liczbę z pustym ciągiem, aby przekonwertować ten numer na ciąg ( :""rc), ponieważ nie ma jeszcze wbudowanego predykatu konwersji.

Konwersja na ciąg jest konieczna, ponieważ jeśli odwrócimy cyfry liczby, wówczas wiodące zera (np. 10Stają się 01) zostaną utracone.

Fatalizować
źródło
3

PowerShell, 52 bajty

while($a++-$args[0]){"0."+-join"$a"["$a".Length..0]}

Trochę dłużej, niż chciałbym, ale używa kilku schludnych sztuczek.

whilePętla jest oczywista, ale uwarunkowane jest trochę trudne - mamy $a(która rozpoczyna się $nullprzy pierwszym odwoływać), a następnie odjąć nasz numer wejściowy $args[0]. W PowerShell operacje matematyczne $nulltraktują to jako zero, więc 20na przykład dla danych wejściowych spowoduje to -20. Ponieważ dowolna liczba niezerowa jest $true, warunek pętli będzie $trueaż do $azrównania się z naszą liczbą wejściową (w tym momencie odejmowanie będzie równe 0lub $false). Sztuką pochodzi z post-przyrostu ++, która nie została wykonana dopiero po odejmowanie jest obliczana, więc obsługa wejście 1poprawnie wyjścia 0.1, a następnie zatrzymać pętlę na następnej iteracji.

Za każdym razem w pętli tworzymy po prostu literał łańcuchowy, który zostaje pozostawiony w potoku i odpowiednio wyprowadzany. Konstruujemy to z "0."konkatenacji z wynikiem jednoargumentowego -joinoperatora, który działał na tablicę znaków utworzoną z pobierania łańcucha "$a"do tyłu (przez indeksowanie przez zakres "$a".length..0).

Testuje się

PS C:\Tools\Scripts\golfing> .\van-der-corput-sequence.ps1 1
0.1

PS C:\Tools\Scripts\golfing> .\van-der-corput-sequence.ps1 20
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
0.01
0.11
0.21
0.31
0.41
0.51
0.61
0.71
0.81
0.91
0.02
AdmBorkBork
źródło
3

Bash, 36 bajtów

for i in `seq $1`;do rev<<<$i.0;done

Pobiera liczbę jako argument wiersza poleceń i wyświetla każdy termin w osobnej linii. Na przykład:

$ ./vdc.sh 12
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
0.01
0.11
0.21
piskliwy kostuch
źródło
2
Jeśli nie czystej Basha i tak: seq -f%g.0 $1|rev.
manatwork
@manatwork Cool. Nie wiedziałem, że mogę seqsformatować dane wyjściowe.
skrzypliwy kostrzew
3

Japt, 12 bajtów

Uò1 ®+".0" w

Przetestuj online!

Jak to działa

           // Implicit: U = input integer
Uò1 ®      // Create the inclusive range [1..U], and map each item Z to:
+".0" w    //  Z + ".0", reversed.
           // Implicit: output last expression
ETHprodukcje
źródło
3

wosk pszczeli ,57 53 bajty

Pracując nad problemem wyjścia cyfr binarnych dla kodu rozeta zauważyłem, że mogę użyć tego samego algorytmu krótkiego podziału dla sekwencji van der Corput, używając po prostu dzielenia i modulo przez 10 zamiast 2. Wyjście jest odwrócone w obu przypadkach.

Zmniejszone o 4 bajty, odzwierciedlając kod:

`.0` XfE@~@L#;
 { %X<#dP@T~P9_
   q<#   N
    >:'bg?b

Sześciokątny ładny odcisk dla łatwiejszej orientacji:

` . 0 `   X f E @ ~ @ L # ;
 {   % X < # d P @ T ~ P 9 _
    q < #       N
     > : ' b g ? b

Objaśnienie jednego cyklu w programie przy użyciu oryginalnego kodu:

;#L@~@EfX `0.`
_9P~T@Pb#>X% {
      N   #>p
      d?gd':<


                                                  lstack   gstack
                                _9P              [0,0,10]•         create bee, set top to 10
                                   ~T            [0,10,n]•         flip top and 2nd, enter n
                                     @P          [n,10,1]•         flip top and 3rd, increment top
                                       b                           redirect to upper left
                     [n,10,1]•        E          [n,10,1]•      (2)clone bee in horizontal direction
flip lstack 1st/3rd  [1,10,n]•       @ f         [n,10,1]•  [1]•   push lstack top on gstack       
flip lstack 1st/2nd  [1,n,10]•       ~   X                         clone bee in all directions
flip 1st/3rd         [10,n,1]•      @     `0.`                     print "0." to STDOUT
skip if 1st>2nd      [10,n,1]•     L      >                     (1)redirect 
if 1st<2nd, del. bee              #        X                       clone bee in all directions
(if 1st>2nd, terminate program)  ;          % {  [n,10,1]•         1st=1st%2nd, output lstack 1st to STDOUT
                                            >p                     redirect
                                             <                     redirect
                                            :    [n,10,0]•         1st=1st/2nd
                                           '                       skip next instr. if 1st=0
                                          d                        redirect to upper right, loop back to (1)
                                         g       [n,10,1]   [1]•   push gstack top on lstack 1st
                                       d?                   []•    pop gstack, redirect to upper right
                                       N                           print newline to STDOUT
                                       P         [n,10,2]          increment lstack 1st
                                       E                           looped back to (2)

Przykład:

julia> beeswax("vandercorput.bswx",0,0.0,Int(20000))
i300
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
0.01
0.11
0.21
0.31
0.41
  .
  .
  .
0.492
0.592
0.692
0.792
0.892
0.992
0.003

Program finished!
ML
źródło
2

R, 59 bajtów

example(strsplit);cat(strReverse(sprintf('%s.0',1:scan())))

wyjaśnienie

example(strsplit)tworzy funkcję strReverse(to powinno być oczywiste)

Za pomocą IRanges::reversetego można golfować do 47 bajtów

cat(IRanges::reverse(sprintf('%s.0',1:scan())))
mnel
źródło
2

Python 3, 47 bajtów

lambda n:['0.'+str(i+1)[::-1]for i in range(n)]

krótsze rozwiązanie z Python 2

lambda n:['0.'+`i+1`[::-1]for i in range(n)]

Przypadek testowy

>>> f(25)
['0.1', '0.2', '0.3', '0.4', '0.5', '0.6', '0.7', '0.8', '0.9', '0.01', '0.11', '0.21', '0.31', '0.41', '0.51', '0.61', '0.71', '0.81', '0.91', '0.02', '0.12', '0.22', '0.32', '0.42', '0.52']
Erwan
źródło
Moje rozwiązanie w Pythonie było takie samo, ale myślę, że f=nie jest wymagane, więc ma 47 bajtów.
Bob
@ Bob ok usunąłem go
Erwan
Wyprowadza to pierwsze n-1warunki.
patrz
@Sprawdź, masz rację, zmieniam rozwiązanie, nie zmienia to liczby bajtów
Erwan
lambda n:['0.'+`i+1`[::-1]for i in range(n)]jest krótszy, jeśli używasz Python 2. Ponadto nie powinieneś mówić „Python 3.5”, chyba że wymaga 3.5, czego nie robi. Ta wersja wymaga
języka
1

𝔼𝕊𝕄𝕚𝕟, 12 znaków / 15 bajtów

⩤⁽1ï⒨ß)Ė⍞.0ᴙ

Try it here (Firefox only).

W porządku.

Wyjaśnienie

⩤⁽1ï⒨tworzy zakres [1,ï]do odwzorowania, ß)konwertuje mapitem (liczba) na ciąg, Ė⍞.0konkatuje .0do końca i odwraca cały ciąg.

Mama Fun Roll
źródło
1

Python 2, 54 bajtów

def f(i):
    for i in range(1,i):print("."+str(i)[::-1])

Wyjaśnienie:

Iteruj przez zestaw [1,input)i dołącz odwrócony ido ..

Nadal być golfem więcej.

introolstring
źródło
Użyj `i`zamiast str(i). Myślę też, że musisz wydrukować wiodące zero.
mbomb007,
1

PHP, 45 41 bajtów

for(;$i++<$argv[1];)echo strrev(",$i.0");

Pobiera argument wejściowy z CLI. Uruchom tak:

php -r 'for(;$i++<$argv[1];)echo strrev(",$i.0");' 100
  • Zaoszczędzono 3 bajty, łącząc ciąg przed cofnięciem
aross
źródło
1

Siatkówka, 39 bajtów

1
1$`0. 
(1)+
$#1
+`(\d)0\.(\d*)
0.$2$1

Pobiera dane wejściowe jednoargumentowe.

Wypróbuj online tutaj.

randomra
źródło
1

Gema, 45 znaków

*=@set{i;0}@repeat{*;@incr{i}0.@reverse{$i} }

Przykładowy przebieg:

bash-4.3$ gema '*=@set{i;0}@repeat{*;@incr{i}0.@reverse{$i} }' <<< 12
0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 0.01 0.11 0.21 
człowiek w pracy
źródło
1

Julia ,50 38 33 31 bajtów

Wybrałem inny format wyjściowy, aby skrócić kod o 12 bajtów. Funkcja zwraca teraz tablicę ciągów. Skrócony o 5 kolejnych bajtów. Podziękowania dla Alexa A. za przypomnienie mi o interpolacji ciągów i korzystanie z anonimowej funkcji (pozbycie się 2 kolejnych bajtów).

n->["0."reverse("$i")for i=1:n]

lub alternatywnie

n->[reverse("$(i/1)")for i=1:n]

Test

julia> @time f(10000)
  0.002260 seconds (60.01 k allocations: 2.823 MB)
10000-element Array{ASCIIString,1}:
 "0.1"
 "0.2"
 "0.3"
 "0.4"
 "0.5"
 "0.6"
 "0.7"
 "0.8"
 "0.9"
 "0.01"
 "0.11"
 "0.21"
 "0.31"
 "0.41"
 "0.51"
 "0.61"
 "0.71"
 "0.81"
 "0.91"
 "0.02"
 "0.12"
 "0.22"
 "0.32"
 ⋮
 "0.8799"
 "0.9799"
 "0.0899"
 "0.1899"
 "0.2899"
 "0.3899"
 "0.4899"
 "0.5899"
 "0.6899"
 "0.7899"
 "0.8899"
 "0.9899"
 "0.0999"
 "0.1999"
 "0.2999"
 "0.3999"
 "0.4999"
 "0.5999"
 "0.6999"
 "0.7999"
 "0.8999"
 "0.9999"
 "0.00001"
ML
źródło
1
31 bajtów:n->["0."reverse("$i")for i=1:n]
Alex A.
1
Nawiasem mówiąc, możesz poprosić o połączenie swojego profilu ze starym tutaj .
Alex A.
Bardzo fajnie, nie wiedziałem o tym. Dzięki!
ML
@AlexA. sama anonimowa funkcja niczego nie generuje. Czy dłuższa wersja, taka jak map(n->["0."reverse("$i")for i=1:n],3)(dla n = 3), nie byłaby konieczna do uzyskania jakichkolwiek wyników? To sprawiłoby, że (przynajmniej) tak długo, jak moje rozwiązanie.
ML
1
W przypadku funkcji anonimowej wystarczy dodać zastrzeżenie, że aby ją wywołać, należy przypisać ją do zmiennej. Zapisuje dwa bajty nad nazwaną funkcją i jest zgodny z naszymi zasadami.
Alex A.
1

Python 2, 40 bajtów

lambda n:[`i+1.`[::-1]for i in range(n)]

Przykład:

>>> f=lambda n:[`i+1.`[::-1]for i in range(n)]
>>> f(30)
['0.1', '0.2', '0.3', '0.4', '0.5', '0.6', '0.7', '0.8', '0.9', '0.01', '0.11', '0.21', '0.31', '0.41', '0.51', '0.61', '0.71', '0.81', '0.91', '0.02', '0.12', '0.22', '0.32', '0.42', '0.52', '0.62', '0.72', '0.82', '0.92', '0.03']

Rozwiązywanie algebraiczne:

corput(x) = reversed(str(float(x+1)))
          = reversed(str(x+1.))
          = str(x+1.)[::-1]
          = `x+1.`[::-1]
patrz
źródło
1

jq 1,5, 40 35 znaków

(Kod 34 znaków + opcja wiersza poleceń 1 znak.)

range(.)|"\(.+1).0"/""|reverse|add

Przykładowy przebieg:

bash-4.3$ jq -r 'range(.)|"\(.+1).0"/""|reverse|add' <<< 12
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
0.01
0.11
0.21

Test on-line (Przekazanie -radresu URL nie jest obsługiwane - sprawdź sam wynik wyjściowy).

To samo z linkami do dokumentacji:

zakres ( . ) | \ ( . + 1 ) .0” / „” | rewers | Dodaj

Jako bardziej czytelną alternatywę powyższe można również zapisać w następujący sposób ( on-line ):

range(.) | . + 1 | tostring | . + ".0" | split("") | reverse | join("")
człowiek w pracy
źródło
jq jest naprawdę fajny. Czy "\(.+1).0"/""możesz wyjaśnić, jak działa?
patrz
Nie ma nic specjalnego, tylko interpolacja łańcuchów \(…) i podział / , który w przypadku łańcuchów jest podzielony.
manatwork
1

BBC BASIC, 89 88 87 bajtów

0T=1:REP.P."0."FNR(STR$T):T=T+1:U.0
1DEFFNR(S$)IFS$="":=""EL.=FNR(MI.S$,2))+LE.S$,1)

Użyto skrótów, aby maksymalnie skrócić rzeczy. Kompatybilny zarówno z Brandy Basic, jak i BASIC 2 na oryginalnej maszynie.

W przypadku nowoczesnych BBC BASIC można również pominąć numery linii, aby zaoszczędzić dwa kolejne bajty.

Darzzr
źródło
1

Dyalog APL , 12 bajtów

{'0.',⌽⍕⍵}¨⍳

Wypróbuj online!

Prosto do przodu: {ciąg funkcji '0.'przed ,odwróconą reprezentacją ciągu argumentu funkcji }dla każdej ¨liczby od 1 do n .

Adám
źródło
0

JS, 66

T=101; // set T to the number of iterations wanted
for(o=[],i=0;i<T;i++)o[i]="0."+(""+i).split("").reverse().join("") // 66b

Dane wyjściowe to tablica o nazwie „o”

Xem
źródło
0

Groovy, 36 znaków

{(1..it).collect{"$it.0".reverse()}}

Przykładowy przebieg:

groovy:000> ({(1..it).collect{"$it.0".reverse()}})(12)
===> [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.01, 0.11, 0.21]
człowiek w pracy
źródło