Built-in terlarang


52

Di celah standar , berikut ini dilarang :

Mengklaim bahwa jawaban Anda ditulis dalam "MyOwnLanguage", di mana perintah itu xberarti "membaca urutan angka, membaginya menjadi kelompok tiga, dan mencetak angka terakhir dari kelompok-kelompok itu di mana angka kedua kurang dari yang pertama"

Di sini, kita akan melakukan hal yang persis sama.

Tugas

Diberi urutan bilangan bulat positif, yang panjangnya dapat dibagi 3, bagi mereka menjadi tiga kelompok, dan cetak angka terakhir dari kelompok-kelompok itu di mana angka kedua kurang dari yang pertama.

Testcases

Input               Output
[]                  []
[1,2,3,4,5,6,7,8,9] []
[2,1,3,5,4,6,8,7,9] [3,6,9]
[3,1,4,1,5,9,2,6,5] [4]
[100,99,123]        [123]
[123,123,456]       []
[456,123,789]       [789]

Mencetak gol

Ini adalah . Jawaban terpendek dalam byte menang.

Celah standar berlaku, jadi ingatlah untuk tidak memiliki perintah bawaan xyang melakukan tugas ini.


31
Hmmm ... Sekarang saya benar-benar tergoda untuk membuat MyOwnLanguagedan menambahkan xperintah ...: P
DJMcMayhem

6
* ingat untuk tidak memiliki built-in *‽ Nah, jika kita sudah memilikinya, kita bisa menggunakannya, bukan?
Adám

2
@ Adám Menurut celah standar, Anda tidak dapat memiliki bahasa yang mengandung fungsi internal yang xmelakukan itu.
Leaky Nun

34
@ LeakyNun Ya Anda bisa, Anda tidak bisa membuat bahasa seperti itu karena tantangan. Jika bahasa Anda mendahului tantangan, itu dapat diterima.
Adám

9
Jika saya memanggil builtin p, dapatkah saya menggunakannya?
Mindwin

Jawaban:


14

Oktaf, 32 byte

@(L)L(x=3:3:end)(diff(L)(x-2)<0)

Cobalah online!

atau

Verifikasi kasus uji!

L3 = L(3:3:end)  %extract last elements of groups
d= diff(L)       % first difference of the list
y=d(1:3:end)     %extract first elements of each subgroup of the difference
idx = y<0        %check for negative numbers  
result = L3(idx)

13

Jelly , 9 8 byte

>Ḋm3T×3ị

Cobalah online!

Bagaimana itu bekerja

>Ḋm3T×3ị  Main link. Argument: A (array)

 Ḋ        Dequeue; yield A without its first element.
>         Compare the elements of A with the elements of the result.
  m3      Select each third element, starting with the first.
    T     Truth; get all indices of truthy elements.
     ×3   Multiply those indices by 3.
       ị  Unindex; retrieve the elements at the redulting indices.

12

Haskell, 30 29 byte

x(a:b:c:l)=[c|b<a]++x l
x d=d

Upaya pertama saya bermain golf Haskell, jadi saya mungkin melewatkan satu atau dua optimasi

-1 byte terima kasih kepada @JulianWolf


4
Jawaban bagus! Lihat codegolf.stackexchange.com/a/60884/66904 untuk tip yang relevan; khususnya, bertukar dua definisi dan menulis yang kedua (sekarang pertama) karena x d=ddapat menghemat satu byte
Julian Wolf

Pintar! Saya melihat-lihat jawaban itu sebelumnya tetapi pasti telah melewatkan bagian di mana definisi menggunakan kembali variabel

11

Mathematica, 37 byte

Dengan asumsi ini memenuhi spesifikasi, ngenisis mendapat kredit untuk pendekatan ini yang mengarah pada penghematan 1 byte!

BlockMap[If[#>#2,Print@#3]&@@#&,#,3]&

Fungsi murni. BlockMap[...,#,3]&membagi daftar input menjadi daftar panjang 3 dan kemudian beroperasi pada setiap daftar dengan fungsi If[#>#2,Print@#3]&@@#&. Hasilnya adalah bahwa setiap nomor terakhir yang memenuhi syarat dicetak. Fungsi ini juga mengembalikan nilai (yaitu daftar Nullsepertiga sepanjang daftar input), yang tampaknya merupakan perilaku yang diperbolehkan.

Mathematica, 42 38 byte

Terima kasih kepada Martin Ender karena telah menghemat 4 byte!

Cases[#~Partition~3,{a__,b_}/;a>0:>b]&

Fungsi murni. #~Partition~3lakukan apa yang kamu pikirkan. Cases[X,P:>Q]memilih semua elemen yang Xcocok dengan pola P, dan mengembalikan hasil aturan transformasi yang :>Qditerapkan untuk setiap instance. Di sini, pola yang dicocokkan adalah {a__,b_}/;a>0: b_akan cocok dengan elemen terakhir dari daftar dan a__semua elemen lainnya (dalam hal ini, dua yang pertama); hubungi mereka ydan zuntuk sekarang. Sneaky a>0kemudian diperluas ke y>z>0, yang merupakan tes yang ingin kita terapkan (valid karena spec mengatakan semuanya akan menjadi bilangan bulat positif). Dan aturan transformasi adalah :>b, yang hanya mengganti setiap pencocokan yang dipesan tiga kali lipat dengan elemen terakhir.

Pengajuan asli:

Last/@Select[#~Partition~3,#.{1,-1,0}>0&]&

Fungsi murni; cukup banyak implementasi langsung, selain #.{1,-1,0}yang menghitung perbedaan antara elemen pertama dan kedua dari masing-masing sublist 3-elemen.


3
Produk titik rapi, tetapi #>#2&@@#&lebih pendek. Namun secara keseluruhan masih lebih pendek untuk digunakan Casesdaripada Select:Cases[#~Partition~3,{a__,b_}/;a>0:>b]&
Martin Ender

a>0:>memiliki dua macam sihir di dalamnya!
Greg Martin

BlockMapmenggoda di sini.
ngenisis

BlockMap[If[#>#2,#3,Nothing]&@@#&,#,3]&berfungsi dan hanya 39 byte ... bisakah kita menyimpan beberapa byte?
Greg Martin

1
BlockMap[If[#>#2,Print@#3]&@@#&,#,3]&bisa dibilang memenuhi spesifikasi
ngenisis

8

Pyth, 10 byte

eMf>FPTcQ3

Suite uji

eMf>FPTcQ3
       cQ3    Chop the input into groups of size 3
  f           Filter on
     PT       All but the last element
   >F         Apply the greater than function
eM            Map to the last element


5

Brachylog (2), 14 byte

~c{Ṫ}ᵐ{k>₁&t}ˢ

Cobalah online!

Brachylog agak kesulitan dengan masalah semacam ini. Perhatikan bahwa program ini memiliki kompleksitas komputasi yang mengerikan, karena program ini dengan kasar memisahkan input menjadi kelompok-kelompok 3 (tidak memiliki built-in "dibagi menjadi kelompok-kelompok"); ini berjalan cepat dengan empat kelompok tetapi sangat lambat dengan lima kelompok.

Penjelasan

~c{Ṫ}ᵐ{k>₁&t}ˢ
~c              Split into groups
  { }ᵐ          such that each group
   Ṫ            has three elements
      {     }ˢ  then on each element, skipping that element on error:
       k          with the list minus its last element
        >₁        assert that it's strictly decreasing
          &       and with the original list
           t      keep only its last element

Mungkin perlu disebutkan bahwa itu l÷₃;?ḍ₍adalah alternatif yang lebih cepat.
Leaky Nun

Saya memiliki itu dalam upaya sebelumnya (menggunakan /tidak ÷; mereka setara di sini), tapi itu satu byte lebih lama jadi saya membuangnya saat golf turun.

4

J , 14 byte

_3&(>`[/\#]/\)

Ini mengevaluasi ke kata kerja monadik. Cobalah online!

Penjelasan

_3&(>`[/\#]/\)  Input is y.
_3&(    \    )  For each non-overlapping 3-element chunk of y,
    >`[/        check if first element is greater than second.
                Call the resulting array x.
_3&(        \)  For each non-overlapping 3-element chunk of y,
          ]/    take the last element.
         #      Keep those where the corresponding element of x is 1.

4

Alice , 12 11 byte

Terima kasih kepada Leo karena telah menghemat 1 byte.

I.h%I-rI~$O

Cobalah online!

Menggunakan titik kode string sebagai daftar input dan mengeluarkan karakter yang sesuai dengan keluaran yang harus disimpan.

Penjelasan

I      Read x. Pushes -1 on EOF.
.h%    Compute x%(x+1). This terminates the program due to division by zero at EOF,
       but does nothing for non-negative x.
I      Read y.
-      Compute x-y. We only want to output z is this is positive.
r      Range. Pushes 0 1 ... n for positive n, and -n ... 1 0 for negative n
       (and simply 0 for n = 0). So this results in a positive number on top
       of the stack iff x-y is positive.
I      Read z.
~      Swap it with x-y > 0.
$O     Output z iff x-y > 0.
       Then the IP wraps to the beginning of the program to process the next triplet.

Anda dapat menggunakan satu byte golf rsebagai gantinya ex. TIO
Leo

@ Leo itu brilian, terima kasih!
Martin Ender


3

dc , 30 byte

[???sAz1[[lAps.]s.<.dx]s.<.]dx

I / O: satu nomor per baris.


3

Perl 5 , 31 byte

30 byte kode + -pbendera.

s/\d+ (\d+) (\d+)/$2if$1<$&/ge

Cobalah online!

Ganti setiap kelompok dengan 3 angka ( \d+ (\d+) (\d+)) dengan yang ketiga ( $2) jika yang kedua ( $1) lebih kecil dari yang pertama ( $&), dan tidak ada yang sebaliknya.


3

CJam , 15 byte

{3/{)\:>{;}|}%}

Blok anonim yang mengharapkan argumen pada stack, dan meninggalkan hasilnya pada stack.

Cobalah online! (Menjalankan semua kasus uji)

Penjelasan

3/             e# Split the list into length-3 chunks.
  {            e# For each chunk:
   )           e#  Remove the last element.
    \:>        e#  Reduce the first 2 elements by greater than.
       {;}|    e#  If the first is not larger than the second, delete the third.
           }%  e# (end for)

3

Brain-Flak , 82 byte

{([({}[{}()]<(())>)](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}{{}((<({}<>)<>>))}{}{}}<>

Cobalah online!

# Until the stack is empty (input is guaranteed to not contain 0)
{

  # Push 1 for greater than or equal to 0
  ([({}[{}()]<(())>)](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}
  #  ^------^  This part is Top - (Second + 1)

  # If the second number was less than the first...
  {{}

     # Get ready to push 2 zeros
     ((<

       # Move the next number to the other stack
       ({}<>)<>

     # Push those 2 zeros
     >))}

     # Pop 2 values.
     # This is either 2 zeros, or a 0 and a "last number" that shouldn't be printed
     {}{}

# End loop
}

# Switch to the stack where we stored the numbers to be printed
<>

3

Jelly , 10 byte

s3µṪWx>/µ€

Cobalah online!

atau

Verifikasi kasus uji

-3 byte terima kasih kepada @LeakyNun

Penjelasan

s3µṪWx>/µ€
s3         - split into groups of three
  µ     µ€ - on each group, do:
   ṪW      - return the third element as the only element of a list
     x     - repeat each element in that list the number of times
      >/   - corresponding to 1 if the second element of the group is greater than the first; 0 otherwise.



3

R, 37 byte

Versi scan()yang saya tidak suka, tetapi membuatnya lebih pendek.

x=scan();x[(i<--1:1)>0][x[!i]<x[i<0]]

Versi function()yang lebih mudah untuk diuji (41 byte)

f=function(x)x[(i<--1:1)>0][x[!i]<x[i<0]]

Berkat @Giuseppe! Ide bagus menggunakan daur ulang indeks.

Uji:

f(c())
f(c(1,2,3,4,5,6,7,8,9))
f(c(2,1,3,5,4,6,8,7,9))
f(c(3,1,4,1,5,9,2,6,5))
f(c(100,99,123))
f(c(123,123,456))
f(c(456,123,789))

Keluaran:

> f(c())
NULL
> f(c(1,2,3,4,5,6,7,8,9))
numeric(0)
> f(c(2,1,3,5,4,6,8,7,9))
[1] 3 6 9
> f(c(3,1,4,1,5,9,2,6,5))
[1] 4
> f(c(100,99,123))
[1] 123
> f(c(123,123,456))
numeric(0)
> f(c(456,123,789))
[1] 789

Anda membaca xdari stdin dengan menggunakan x=scan()di awal alih-alih mendefinisikan suatu fungsi, Anda juga dapat dengan mudah mengatur i=c(1,2,0)karena indeks logis didaur ulang yaitu,x=scan();i=c(1,2,0);x[!i][x[i>1]<x[i==1]]
Giuseppe


Terima kasih @Giuseppe! Saya tidak suka x=scan()pendekatan ini karena membuat input sangat rumit. Dan saya tidak bisa membuatnya berulang saat itu.
djhurio

2
Benar, tetapi tujuannya adalah untuk menghasilkan kode sesingkat mungkin. Sayangnya untuk kami berdua, orang lain menemukan solusi yang lebih baik!
Giuseppe

Heh, aku juga punya ide untuk menggunakannya, matrix()tetapi entah bagaimana aku tidak percaya itu akan menjadi singkat.
djhurio

3

JavaScript (ES6), 46 44 42 41 39 byte

a=>a.filter((_,y)=>y%3>1&a[y-1]<a[y-2])
  • Disimpan 2 byte berkat Neil .

Cobalah

Masukkan daftar angka yang dipisah koma, tanpa spasi.

f=
a=>a.filter((_,y)=>y%3>1&a[y-1]<a[y-2])
i.oninput=_=>o.innerText=JSON.stringify(f(i.value.split`,`.map(eval)))
console.log(JSON.stringify(f([])))                  // []
console.log(JSON.stringify(f([1,2,3,4,5,6,7,8,9]))) // []
console.log(JSON.stringify(f([2,1,3,5,4,6,8,7,9]))) // [3,6,9]
console.log(JSON.stringify(f([3,1,4,1,5,9,2,6,5]))) // [4]
console.log(JSON.stringify(f([100,99,123])))        // [123]
console.log(JSON.stringify(f([123,123,456])))       // []
console.log(JSON.stringify(f([456,123,789])))       // [789]
<input id=i><pre id=o>


Penjelasan

a=>              :Anonymous function taking the input array as an argument via parameter a
a.filter((_,y)=> :Filter the array by executing a callback function on each element,
                  with the index of the current element passed through parameter y.
                  If the function returns 0 for any element, remove it from the array.
y%3>1            :Check if the modulo of the current index is greater than 1.
                  (JS uses 0 indexing, therefore the index of the 3rd element is 2; 2%3=2)
&                :Bitwise AND.
a[y-1]<a[y-2]    :Check if the element at index y-1 in array a
                  is less than the element at index y-2
)                :End filtering method

1
Apakah y%3>1&a[y-1]<a[y-2]bekerja?
Neil

Dicoret 44 masih 44
Roman Gräf

Apa maksudmu, @ RomanGräf?
Shaggy


Seekor serangga di "Arial," Helvetica Neue ", Helvetica, sans-serif" - yang terlihat oleh @Roman
flurbius

3

Sekam , 8 byte

ṁΓȯΓ↑<C3

Cobalah online!

Penjelasan

Program ini sedikit terlibat, jadi ikut saya.

ṁΓȯΓ↑<C3  Implicit input (list of integers).
      C3  Split into slices of length 3.
ṁ         Map over slices and concatenate results
 ΓȯΓ↑<    of this function, explained below.

Fungsi ini ΓȯΓ↑<mengambil daftar panjang 3 x = [a,b,c],. Yang pertama Γterbagi xmenjadi adan [b,c], dan memberinya sebagai argumen untuk fungsi tersebut ȯΓ↑<. Ini harus sama dengan ((Γ↑)<), tetapi karena bug / fitur penerjemah, sebenarnya setara dengan (Γ(↑<)), ditafsirkan sebagai komposisi dari Γdan ↑<. Sekarang, adiumpankan ke fungsi terakhir menggunakan aplikasi parsial, fungsi yang dihasilkan ↑<adiberikan kepada Γ, yang mendekonstruksi [b,c]menjadi bdan [c]. Kemudian bdiumpankan ke ↑<a, menghasilkan fungsi yang mengambil b<aelemen pertama dari daftar. Fungsi ini akhirnya diterapkan pada [c]; hasilnya adalah [c]jika a>b, dan[]jika tidak. Daftar ini disatukan oleh untuk membentuk hasil akhir, yang dicetak secara implisit.

Tanpa "fitur", saya akan memiliki 9 byte:

ṁΓoΓo↑<C3


2

MATL , 10 byte

IeI&Y)d0<)

Hasilnya ditampilkan sebagai angka yang dipisahkan oleh spasi.

Cobalah online!

Atau verifikasi semua kasus uji . Ini menampilkan representasi string dari output, sehingga array kosong benar-benar terlihat []. Perhatikan bahwa dalam MATL angka sama dengan array tunggal, jadi [4]ditampilkan sebagai 4.

Penjelasan

Ie    % Implicit input. Reshape as a 3-row matrix (column-major order)
I&Y)  % Split into the third row and a submatrix with the other two rows
d     % Consecutive difference along each column of the submatrix
0<    % True for negative values
)     % Use as logical index into the original third row. Implicitly display

2

Röda , 15 byte

{[_3]if[_2<_1]}

Röda hampir sesingkat bahasa golf ...

Ini mengambil tiga nilai dari aliran, dan mendorong yang ketiga ( _3) kembali, jika yang kedua ( _2) kurang dari yang pertama ( _1).

Garis bawah adalah sintaksis gula untuk forloop, sehingga program dapat ditulis sebagai {{[a]if[b<c]}for a,b,c}atau bahkan {[a]for a,b,c if[b<c]}.

Tidak ada tautan TIO, karena itu tidak bekerja pada TIO karena alasan tertentu (walaupun bekerja dengan versi terbaru dari Röda yang ada sebelum tantangan).


2

Java 7, 86 85 byte

void c(int[]a){for(int i=-1;++i<a.length;)if(a[i++]>a[i++])System.out.println(a[i]);}

-1 byte terima kasih kepada @ PunPun1000

Penjelasan:

Coba di sini.

void c(int[]a){                  // Method with integer-array parameter and no return
  for(int i=-1;++i<a.length;)    //  Loop over the array in steps of three at a time
    if(a[i++]>a[i++])            //   If the value of the current index is larger than the next:
      System.out.println(a[i]);  //    Print the value on the third index
                                 //  End of loop (implicit / single-line body)
}                                // End of method

@ PunPun1000 Sekarang Anda hanya menambah iterasi sebanyak 2 alih-alih 3, dan karenanya memberikan hasil yang salah (seperti 3,9untuk kasus uji 1,2,3,4,5,6,7,8,9alih-alih 3,6,9).
Kevin Cruijssen

1
@Kevin_Cruijssen Ups Anda benar. Anda masih bisa menyimpan byte dengan menggunakan operator increment. Anda hanya harus mulai dari -1. Cobalah secara online!
PunPun1000

@ PunPun1000 Ah, Anda benar, tangkapan yang bagus. Terima kasih!
Kevin Cruijssen

2

C #, 126 Bytes

using System.Linq;i=>Enumerable.Range(0,i.Length/3).Select(u=>3*u).Where(u=>i[u]>i[u+1]).Select(u=>i[u+2]);

Jika Anda ingin seluruh program dengan metode ini akan menjadi 175 Bytes :

using System.Linq;namespace S{class P{static System.Collections.IEnumerable X(int[]i)=>Enumerable.Range(0,i.Length/3).Select(u=>3*u).Where(u=>i[u]>i[u+1]).Select(u=>i[u+2]);}}

Disimpan 7 Bytes dengan bantuan TheLethalCoder


Anda bisa mencetaknya ...
Leaky Nun

@ LeakyNun tentu saja saya bisa - tetapi mengapa saya harus? Saya bertanya apakah ini perlu, tidak, dan akan lebih banyak byte, saya kira.
MetaColon

(int[]i)bisa saja itidak perlu untuk jenisnya.
TheLethalCoder

@TheLethalCoder Diperbarui.
MetaColon

@MetaColon Anda tidak perlu kawat gigi di sekitar (i).
TheLethalCoder


1

CJam , 16 byte

q~3/{~@@>S{;}?}%

Output ditampilkan sebagai angka yang dipisahkan oleh spasi.

Cobalah online!

Penjelasan

q~               e# Read input list
  3/             e# List of sublists of length 3
   {         }%  e# Apply this to each sublist
    ~            e# Push sublist contents: 3 numbers
     @@          e# Rotate twice. This moves first two numbers to top
       >         e# Greater than?
        S{;}?    e# If so: push space (used as separator). Else: pop the third number
                 e# Implicitly display


1

JavaScript, 108 107 108 byte

Ini adalah fungsi JS anonim (lambda) yang valid. Tambahkan x=di awal dan aktifkan like x([5,4,9,10,5,13]). Output sebagai fungsi return.

a=>(y=[],a.map((c,i)=>(i+1)%3?0:y.push(a.slice(i-2,i+1))),y.map(v=>v[1]<v[0]?v[2]:null).filter(c=>c|c==0))

Cuplikan menerima input sebagai daftar bilangan bulat yang dipisahkan koma.

x=a=>(y=[],a.map((c,i)=>(i+1)%3?0:y.push(a.slice(i-2,i+1))),y.map(v=>v[1]<v[0]?v[2]:null).filter(c=>c|c==0))
martin.oninput = e => { dennis.innerHTML = x(martin.value.split`,`.map(c=>parseInt(c,10))) }
<input type=text id=martin><pre id=dennis>


Apa gunanya memposting solusi yang lebih lama, dan menggunakan martindan dennissebagai id?
Leaky Nun

@LeakyNun Shaggy memposting solusinya saat saya sedang mengerjakan milik saya. Tapi itu bukan alasan bagi saya untuk tidak mengirim solusi. Sedangkan untuk menggunakan nama sebagai id, saya pikir itu akan lucu.
Arjun

Ini tidak berhasil [5,4,9,10,5,13].
Shaggy

@Shaggy Itu adalah masalah dengan penerapan cuplikan uji; tidak ada yang salah dengan solusinya. Sebenarnya, nilai elemen input selalu berupa string. Jadi, memisahkan string menjadi string ,array daripada angka! Solusinya baik-baik saja. Hanya cuplikan test case yang salah. Saya sudah memperbaikinya, sekarang. Terima kasih telah menunjukkan itu! :)
Arjun

Oh, ya, itu menjelaskan masalahnya! Terima Anda , @Arjun.
Shaggy

1

Perl5.8.9, 73 60 byte

while(@F){@b=splice@F,0,3;$b[1]<$b[0]&&print$b[2]}print"-"

(58 + 2 untuk tanda 'n' untuk membaca seluruh file dan untuk autosplit). Mengasumsikan input adalah garis angka yang dipisahkan oleh spasi

Pengurangan berkat Dada. Termasuk cetakan di bagian akhir untuk visibilitas, itu akan menghemat 8 byte jika tidak.


Yang bagus! Buat +1 Anda layak!
Arjun

Format output menjadi cukup fleksibel, Anda tidak harus meletakkannya print"\n"di akhir. Juga, Anda bisa lakukan $b[1]<$b[0]&&print"$b[2] "while@b=splice@a,0,3untuk menghemat 7 byte. Akhirnya, Anda dapat menggunakan -aflag alih-alih melakukan @a=split(itu akan melakukan hal yang sama secara otomatis dan menyimpan hasilnya @Fsebagai gantinya @a); dengan Perl 5.8.9, Anda perlu -nasementara dengan Perls baru, -asudah cukup. Itu akan membuat Anda mencapai 47-48 byte.
Dada

oh, saya tidak tahu tentang -a. Saya masih berpikir saya harus melakukan satu jalur output per jalur input, outputnya cukup tidak bisa dipahami sebaliknya
Tom Tanner

1

Clojure, 43 byte

#(for[[a b c](partition 3 %):when(< b a)]c)

Membosankan: /


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.