Rosetta Stone Challenge: Temukan aturan untuk seri

15

Tujuan dari Rosetta Stone Challenge adalah menulis solusi dalam bahasa sebanyak mungkin. Pamerkan multibahasa Anda dalam pemrograman!

Tantangan

Tantangan Anda adalah mengimplementasikan program yang akan memasukkan daftar angka dan menampilkan aturan yang digunakan untuk menghasilkan setiap angka berurutan dalam seri, sebanyak mungkin bahasa pemrograman . Anda diperbolehkan menggunakan segala jenis fungsi perpustakaan standar yang dimiliki bahasa Anda, karena ini sebagian besar adalah karya bahasa.

Apa itu "seri?"

Serangkaian adalah daftar bilangan bulat yang dipesan. Setiap angka berurutan dalam seri dapat dihasilkan dengan menerapkan aturan sederhana ke nomor sebelumnya dalam seri. Dalam tantangan ini, aturan terdiri dari mengalikan angka dengan konstanta, dan kemudian menambahkan konstanta kedua. Kedua konstanta dapat berupa bilangan bulat apa saja. Tujuan dari tantangan ini adalah untuk menghasilkan dua konstanta tersebut.

Untuk seri 2 5 11, aturannya dapat ditulis sebagai 2 1. Ini berarti bahwa setiap angka adalah angka sebelumnya, kali 2, ditambah 1. Fakta penting adalah bahwa sebagian besar seri memiliki tepat satu aturan. Beberapa seri memiliki jumlah tak terbatas atau tidak sama sekali, tetapi Anda tidak harus berurusan dengan ini.

Memasukkan

Input akan berupa daftar tiga bilangan bulat yang berbeda yang merupakan angka dalam urutan. Angka-angka dapat berupa spasi, koma, atau dibatasi baris baru, tetapi harap tentukan yang mana. Saya akan fleksibel pada batasan ini karena bahasa tertentu mungkin memiliki batasan input. Berikut adalah empat contoh input:

0 7 14
2 5 11
2 0 -4
5 -19  77

Keluaran

Output akan berupa dua bilangan bulat yang mewakili aturan yang digunakan untuk menghasilkan seri. Angka pertama akan menjadi konstanta multiplikatif, sedangkan angka kedua adalah konstanta aditif. Format output dapat berupa spasi, koma, atau dibatasi baris baru. Saya fleksibel pada batasan ini juga. Berikut adalah contoh output yang sesuai:

1 7
2 1
2 -4
-4 1

Kriteria Kemenangan yang Objektif

Adapun kriteria kemenangan yang objektif, ini dia: Setiap bahasa adalah kompetisi terpisah untuk siapa yang dapat menulis entri terpendek, tetapi pemenang keseluruhan adalah orang yang memenangkan sebagian besar sub-kompetisi ini. Ini berarti bahwa seseorang yang menjawab dalam banyak bahasa yang tidak biasa dapat memperoleh keuntungan. Code-golf sebagian besar tiebreak ketika ada lebih dari satu solusi dalam bahasa: orang dengan program terpendek mendapat pujian untuk bahasa itu.

Aturan, Batasan, dan Catatan

Program Anda dapat ditulis dalam bahasa apa pun yang ada sebelum 9 April 2012. Saya juga harus bergantung pada komunitas untuk memvalidasi beberapa tanggapan yang ditulis dalam beberapa bahasa yang lebih tidak umum / esoterik, karena saya tidak mungkin dapat menguji mereka.


Papan Peringkat Saat Ini

Bagian ini akan diperbarui secara berkala untuk menunjukkan jumlah bahasa dan siapa yang memimpin di setiap bahasa.

  • AWK (32) - mellamokb
  • bash (31) - Peter Taylor
  • Befunge (29) - Howard
  • bc (39) - kernigh
  • brainfuck (174) - CMP
  • C (78) - l0n3_shArk
  • C ++ (96) - leftaroundabout
  • Common Lisp (88) - kernigh
  • Kapel Cray (59) - Kyle Kanos
  • csh (86) - kernigh
  • Cuda (301) - leftaroundabout
  • dc (30) - kernigh
  • DOS BATCH (54) - mellamokb
  • Elemen (27) - Howard
  • es (95) - kernigh
  • Factor (138) - kernigh
  • Felix (86) - kirbyfan64sos
  • Fortran (44) - Kyle Kanos
  • Go (101) - Howard
  • GolfScript (16) - Howard
  • Golflua (44) - Kyle Kanos
  • Haskell (35) - leftaroundabout
  • J (23) - Gareth
  • Jawa (141) - Howard
  • JavaScript (47) - mellamokb
  • Julia (71) - ML
  • Lua (51) - Howard
  • Merkuri (319) - leftaroundabout
  • MoonScript (48) - kirbyfan64sos
  • Nimrod (146) - leftaroundabout
  • Burung Hantu (22) - res
  • Pascal (88) - leftaroundabout
  • Perl (57) - Gareth
  • PHP (61) - mellamokb
  • PicoLisp (72) - kernigh
  • Piet (56) - ML
  • PostScript (61) - Howard
  • Python (40) - Howard
  • Q (36) - tmartin
  • QBasic (34) - mellamokb
  • R (50) - res
  • Ruby (44) - Howard
  • Scala (102) - Gareth
  • SQL (57) - Aman ZeeK Verma
  • TI-83 BASIC (25) - mellamokb
  • Mesin Daftar Tidak Terbatas (285) - Paxinum
  • VBA (57) - Gaffi
  • Spasi (123) - res
  • zsh (62) - kernigh

Peringkat Pengguna Saat Ini

Peringkat yang sama diurutkan berdasarkan abjad.

  1. Howard (9): Befunge (29), Elemen (27), Go (101), GolfScript (16), Java (141), Lua (51), PostScript, (61) Python, (40) Ruby (44)

  2. kernigh (8): bc (39), Common Lisp (88), csh (86), dc (30), es (95), Factor (138), PicoLisp (72), zsh (62)

  3. leftroundabout (6): C ++ (96), Cuda (301), Haskell (35), Mercury (319), Nimrod (146), Pascal (88)

  4. mellamokb (6): AWK (32), DOS BATCH (54), JavaScript (47), PHP (61), QBasic (34), TI-83 BASIC (41)

  5. Gareth (3): J (23), Perl (57), Scala (102)

  6. Kyle Kanos (3): Cray Chapel (59), Fortran (44), Golflua (44)

  7. res (3): Owl (22), R (50), Whitespace (123)

  8. kirbyfan64sos (2): Felix (86), MoonScript (48)

  9. ML (2): Julia (71), Piet (56)

  10. Aman Zeek verma (1): SQL (57)

  11. CMP (1): brainfuck (174)

  12. Gaffi (1): VBA (57)

  13. l0n3_shArk (1): C (78)

  14. Paxinum (1): Mesin Daftar Tidak Terbatas (285)

  15. Peter Taylor (1): bash (31)

  16. tmartin (1): Q (36)

PhiNotPi
sumber
Itu tidak terlihat seperti orang yang benar-benar membaca tag, atau deskripsi lainnya ...
berhenti mengubah counterclockwis
@leftaroundabout: Mengapa Anda mengatakan itu? Saya sadar (misalnya) bahwa solusi saya tidak mengambil input array dan berencana memperbaikinya nanti. Dan saya terlalu malas untuk memposting lebih dari satu solusi saat ini :) Menurut Object Winning Criterio, kode-golf adalah tie-breaker untuk dua posting dengan bahasa yang sama, maka saya sudah memasukkan jumlah karakter dengan mudah referensi jika ada orang lain yang memposting solusi JavaScript. Ini sebenarnya bisa menjadi salah satu momen langka ketika sebuah pertanyaan layak code-golf dan code-challenge tag.
mellamokb
Ya, Anda benar: seseorang harus melakukan bahasa yang tidak biasa juga.
Berhenti menghidupkan counterclockwis
3
Selama Anda menyimpan Papan Peringkat Saat Ini dalam format standar yang sama seperti di atas, Anda dapat menggunakan ini untuk menghasilkan skor setiap pengguna: jsfiddle.net/bk2WM/2
mellamokb
1
Versi terbaru saya ( jsfiddle.net/bk2WM/4 ) memberikan output mentah (dalam textarea) Anda dapat menyalin / menempel ke posting, dan memformatnya seperti yang saya lakukan di posting saya. Merasa bebas untuk mengubah / bermain dengan tata letak.
mellamokb

Jawaban:

9

GolfScript, 16 karakter

~1$- 1$3$-/.p@*-

Input diberikan sebagai daftar yang dipisahkan oleh ruang.

JavaScript, 56 karakter

p=prompt;x=alert;a=p();b=p();x(m=(p()-b)/(b-a));x(b-a*m)

Input diberikan saat diminta.

Ruby, 44 karakter

a,b,c=eval("[#{gets}]");m=c-b;p m/=b-a,b-m*a

Input di sini diberikan sebagai daftar yang dipisahkan koma.

Python, 40 karakter

a,b,c=input();m=c-b;m/=b-a;print m,b-m*a

Input sekali lagi dipisahkan dengan koma.

Jawa, 141 karakter

enum E{E;static int s(){return new java.util.Scanner(System.in).nextInt();}{int a=s(),b=s(),m=s()-b;m/=b-a;System.out.print(m+" "+(b-a*m));}}

Input dipisahkan oleh baris baru.

Lua, 51 karakter

r=io.read
a,b=r(),r()
m=(r()-b)/(b-a)
print(m,b-m*a)

Input dipisahkan oleh baris baru.

Pergi, 101 karakter

package main
import"fmt"
var a,b,c int
func main(){fmt.Scan(&a,&b,&c)
c-=b
c/=b-a
fmt.Print(c,b-a*c)}

Input dipisahkan oleh baris baru.

Fortran, 90 karakter

      PROGRAM X
      READ(*,*)I,J,K
      K=(K-J)/(J-I)
      WRITE(*,*)K,J-I*K
      END

Input dipisahkan oleh baris baru.

Di luar, 29 karakter

&01p&:11p:&-01g11g-/:.01g*-.@

PostScript, 61 karakter

2 5 14
1 index sub 1 index 3 index sub idiv dup = 3 2 roll mul sub =

Burung hantu, 23 karakter

<%<%<$-1`4'-/%.32)2'*-.

Input dipisahkan oleh baris baru.

Elemen , 27 karakter

_-a;_3:'-_+"a~+/2:`a~*+\ ``

Input dipisahkan oleh baris baru.

Howard
sumber
Pencurian tanpa malu-malu dari solusi JavaScript saya;)
mellamokb
1
Nah dua bisa memainkan game ini ...: P
mellamokb
@ellamokb Bagus sekali. Tapi saya sudah membatalkan jawaban Anda ;-) Jadi apa yang tersisa bagi kami: kalahkan 48 karakter ...
Howard
2
Wow, kamu bermain golf dalam bahasa saya. Aku merasa terhormat. Saya juga merasa berkewajiban untuk mengalahkan Anda. :)
PhiNotPi
1
Tentang solusi Elemen Anda, tampaknya tanda `terakhir tidak diperlukan. Apakah ini kesalahan Anda atau kesalahan penerjemah yang saya posting di Pastebin? Oh, dan saya punya solusi 27 karakter.
PhiNotPi
8

Brainfuck - 174

,>,>,<[>->+>+<<<-]>>>[<<<+>>>-]<<<<[>>>->+<<<<-]>>>>[<<<<+>>>>-]<<[->-
[>+>>]>[+[-<+>]>+>>]<<<<<]>>>[<<<+>>>-]<[-]<[-]<.[>>+<<-]>>[<<<<[>>+>+
<<<-]>>>[<<<+>>>-]>-]<<[<->-]<.

Piet - 82?

Tidak yakin bagaimana mengukur golf kompetitif di sini. Aku akan pergi dengan ukuran gambar total (dalam codels) Tambang 41x2: masukkan deskripsi gambar di sini

Befunge - 34

&00p&10p&10g-10g00g-/:.00g*10g\-.@

Inggris - 278

The multiplier is the quotient of the difference of the second 
and third values and the second and first values. 
To generate a new term, multiply the current term by the multiplier
and add the difference of the first value and the product of the 
multiplier and the second value.

Tidak yakin apakah ini diperhitungkan, tetapi saya pikir saya akan mencobanya. Sangat sulit untuk menggambarkan bahkan suatu algoritma sederhana secara akurat. Agak berharap bahasa Inggris mendukung semacam simbol pengelompokan untuk menetapkan prioritas.

captncraig
sumber
Tautkan saya ke seorang juru bahasa (yang lengkap yang mengerti seluruh bahasa, dan tidak hanya diarahkan untuk memecahkan masalah ini) dan saya dapat menerimanya.
PhiNotPi
ummm, worldinterpreting.com ?
captncraig
1
Tidak apa-apa, orang lain telah menulis bukti matematika di LaTeX. Itu tidak masuk hitungan, tetapi menambah variasi.
PhiNotPi
Jika saya mencoba solusi Piet Anda dengan npiet, saya mendapatkan hasil ini: D:\Software\Programming\Piet\npiet-1.3a-win32>npiet series2.png ? 5 ? -19 ? 77 05 Solusinya harus-4 1
ML
Gambar yang Anda posting tidak berfungsi kecuali Anda menumbuhkannya dengan satu piksel (bukan codel!) Di sisi kanan. 461 piksel tidak dapat dibagi oleh 11, yang merupakan ukuran codel yang agak tidak biasa,);
ML
8

QBasic, 42

INPUT "",a,b,c
m=(c-b)/(b-a)
PRINT m;b-m*a

Membutuhkan input dengan koma, output dengan spasi (apakah ini oke?)


Merkuri, 319

:-module r.
:-interface.
:-import_module io,list,int,char,string.
:-pred main(io::di,io::uo)is det.
:-implementation.
main(!IO):-io.read_line_as_string(J,!IO),(if J=ok(I),[A,B,C]=list.map(string.det_to_int,string.words_separator(char.is_whitespace,I)),M=(C-B)/(B-A)then io.format("%d %d",[i(M),i(B-M*A)],!IO)else true).

Haskell, 85 81

f[a,b,c]|m<-(c-b)`div`(b-a)=[m,b-m*a]
main=getLine>>=mapM_ print.f.map read.words

Sekarang input dengan spasi, output dengan baris baru.


C, 80

main(a,b,c,m){scanf("%d %d %d",&a,&b,&c);m=(c-b)/(b-a);printf("%d %d",m,b-m*a);}

C ++, 96

#include<iostream>
main(){int a,b,c,m;std::cin>>a>>b>>c;m=(c-b)/(b-a);std::cout<<m<<' '<<b-m*a;}

Nimrod, 146

import strutils
var
 q:array[0..3,int]
 b,m:int
for i in 0..2:q[i]=ParseInt(readLine(stdin))
b=q[1]
m=(q[2]-b)div(b-q[0])
echo($m,",",$(b-m*q[0]))

Input dengan baris baru, koma output.


Yang ini tidak masuk hitungan, tapi saya rasa masih cocok:

Teorema matematika, 713 karakter LaTeX

\documentclass{article}\usepackage{amsmath}\usepackage{amsthm}\begin{document}Theorem: for a sequence $(a_i)_i$ of integers with $a_2\neq a_1$ where $a_3-a_2$ is divisible by $a_2-a_1$, $m:=\frac{a_3-a_2}{a_2-a_1},\ p:=a_2-m\cdot a_1$ give rise to a sequence\[b_i:=\begin{cases}a_1&\text{for }i=1\\b_{i-1}\cdot m+p&\text{else}\end{cases}\] such that $b_i=a_i\ \forall i\leq 3$.

Proof: $i=1$ is trivial,\[\begin{aligned}b_2=&b_1\cdot m+p=a_1\frac{a_3-a_2}{a_2-a_1}+a_2-\frac{a_1a_3-a_1a_2}{a_2-a_1}=a_2,\\b_3=&b_2\cdot m+p=\frac{a_2a_3-a_2^2}{a_2-a_1}+a_2-\frac{a_1a_3-a_2^2}{a_2-a_1}\\=&\frac{a_2a_3-a_1a_3+(a_2-a_1)a_2-a_2^2+a_1a_2}{a_2-a_1}\\=&\frac{a_2-a_1a_3+0}{a_2-a_1}=a_3.\end{aligned}\]\qed\end{document}

Output dari solusi LaTeX matematika-teorema


Sementara kita sedang menulis := definisi ...

Pascal, 90 88

program r;var a,b,c:integer;begin;read(a,b,c);c-=b;c:=c div(b-a);write(c,' ',b-c*a);end.

Cuda, 301

#include<stdio.h>
__global__ void r(int*q){if(!(blockIdx.x|threadIdx.x)){q[1]-=*q;q[1]/=(*q-q[2]);*q-=q[1]*q[2];}}
main(){int p[3],*q;scanf("%d%d%d",p+2,p,p+1);cudaMalloc(&q,24);cudaMemcpy(q,p,24,cudaMemcpyHostToDevice);r<<<1,1>>>(q);cudaMemcpy(p,q,24,cudaMemcpyDeviceToHost);printf("%d %d",p[1],*p);}
tidak lagi mengaktifkan counterclockwis
sumber
1
Anda dapat menyimpan dua karakter dalam solusi C dengan menghilangkan mdan menggunakan kembali c, dan dua lainnya dengan menggunakan c-=b;c/=b-a;alih-alih c=(c-b)/(b-a);.
Peter Taylor
Dalam solusi C, Anda tidak perlu spasi di scanf()string format.
Reto Koradi
7

AWK, 35 karakter

{m=($3-$2)/($2-$1);print m,$2-$1*m}
  • Masukkan format: 2 0 -4

bc, 39 karakter

define f(a,b,c){
m=(c-b)/(b-a)
m
b-a*m}
  • Masukkan format: z=f(2, 0, -4)
  • Inputnya adalah a bc ekspresi. Setelahbc membaca file sumber, ia membaca input standar. Inilah sebabnya mengapa input harus terlihat seperti pemanggilan fungsi.
  • Saya menggunakan OpenBSD bc, yang membutuhkan baris baru setelah {.

Gangguan Umum, 88 karakter

(let*((a(read))(b(read))(c(read))(m(/(- c b)(- b a))))(format
t "~A ~A" m (- b(* a m))))
  • Masukkan format: 2 0 -4

csh, 86 karakter

set i=(`cat`)
@ m=($i[3] - $i[2]) / ($i[2] - $i[1])
@ n=$i[2] - $i[1] * $m
echo $m $n
  • Masukkan format: 2 0 -4
  • Karakter ke-86 adalah baris baru di akhir file. cshadalah satu-satunya bahasa yang saya hitung baris baru di akhir file. Ini karena cshtidak pernah menjalankan perintah terakhir kecuali ada baris baru.
  • set i=($<)tidak berfungsi, karena $<tidak memiliki pemisahan kata.

dc, 30 karakter

?scsbsalclb-lbla-/psmlblalm*-p
  • Format input:, di 2 0 _4mana _garis bawah.

es, 95 karakter

i=(`cat)
b=$i(2)
m=`{expr \( $i(3) - $b \) / \( $b - $i(1) \)}
echo $m `{expr $b - $i(1) \* $m}
  • Masukkan format: 2 0 -4
  • esadalah cangkang yang bisa dikembangkan oleh Paul Haahr dan Byron Rakitzis.

Faktor, 138 karakter

USING: eval formatting io kernel locals math ;
contents eval( -- a b c ) [let :> ( a b c )
c b - b a - / dup a * b swap - "%d %d" printf ]
  • Masukkan format: 2 0 -4

PicoLisp, 74 72 karakter

(in()(let(r read a(r)b(r)c(r)m(/(- c b)(- b a)))(print
m (- b(* a m)))))
  • Masukkan format: 2 0 -4
  • EDIT: Kehilangan 2 karakter dengan mengubah a(read)b(read)c(read)ke r read a(r)b(r)c(r).

TI-83 BASIC, 63 61 karakter

:Input A
:Input B
:Input C
:(C-B)/(B-A)→M
:Disp M
:Disp B-A*M
  • Format input: 2ENTER 0ENTER ¯4ENTER, di mana¯ minus unary kalkulator.
  • Saya menghitung karakter Unicode; (panah kanan) dihitung sebagai U + 2192. Misalnya, kalkulator dihitung Input Asebagai 2 karakter, tetapi saya hitung Input Asebagai 7 karakter. Saya juga menghitung :1 karakter.
  • EDIT: Saya salah hitung: ada 61, bukan 63, karakter.

zsh, 62 karakter

i=(`cat`)
((b=i[2],m=(i[3]-b)/(b-i[1]),n=b-i[1]*m))
echo $m $n
  • Masukkan format: 2 0 -4
kernigh
sumber
7

AWK (32)

{m=$3-$2;print m/=$2-$1,$2-$1*m}

Demo: http://ideone.com/kp0Dj


bash (38)

awk '{m=$3-$2;print m/=$2-$1,$2-$1*m}'

Demo: http://ideone.com/tzFi8


DOS / BATCH (54 55 )

set/a m=(%3-%2)/(%2-%1)&set/a n=%2-%m%*%1&echo %m% %n%

Mengambil parameter sebagai daftar argumen yang dipisahkan oleh ruang.


Jawa (143 185 )

enum R{R;{int a=0,b=0,c,i=2;for(;(c=new java.util.Scanner(System.in).nextInt()+b*--i)+i>=c;b=c)a+=c*i;c/=b-a;System.out.print(c+" "+(b-a*c));}}


JavaScript (48 61 67 )

p=prompt;m=p(b=p(a=p()))-b;alert([m/=b-a,b-a*m])

Demo: http://jsfiddle.net/BT8bB/6/


PHP (61 77 )

<?list(,$a,$b,$c)=$argv;$c-=$b;echo($c/=$b-$a).' '.$b-=$c*$a;

Demo: http://ideone.com/CEgke


QBasic (34)

INPUT a,b,c
m=(c-b)/(b-a)
?m;b-m*a

TI-83 Basic (25 41 )

:Prompt A,B,C
:(C-B)/(B-A
:Disp Ans,B-AAns

Ya, tanda kurung yang tepat hilang dengan sengaja. Ini adalah teknik optimisasi terkenal yang menutup tanda kurung sebelum operasi STO tidak diperlukan dalam pemrograman Dasar TI-83.

mellamokb
sumber
1
JS yang tidak berfungsi untuk saya di Firefox - Saya mendapatkan kesalahan yang ptidak terdefinisi. Apakah spesifikasi JS mengatakan bahwa argumen fungsi harus dievaluasi sebelum fungsi diselesaikan?
Peter Taylor
Hmm. Ya kamu benar. Menurut spesifikasi, itu seharusnya tidak berfungsi, seperti yang dijelaskan dalam pertanyaan SO yang serupa ini: stackoverflow.com/questions/9941736/… . Fungsi seharusnya terikat sebelum argumen mereka dievaluasi, dan Chrome tampaknya melakukannya dalam urutan terbalik.
mellamokb
Saya telah berusaha keras dan lama untuk mengalahkan solusi Java tertinggi dengan pendekatan yang sama sekali berbeda yang dapat Anda lihat di atas. 143 adalah yang terdekat yang bisa saya dapatkan. Ada yang punya ide, silakan kirim cara saya!
mellamokb
6

Ruang kosong, 123

    





















I / O dipisahkan oleh baris baru. (Untuk mendapatkan kode sumber, masukkan mode edit dan salin spasi putih di antara tag preformat; atau, lihat online contoh di Ideone .)

Penjelasan, di mana S, T, L mewakili Space, Tab, Linefeed:

Pseudocode     Whitespace
----------     ----------
push 0         SS SSL
readn          TLTT
push 1         SS STL
readn          TLTT
push 2         SS STSL
dup            SLS
readn          TLTT
retr           TTT
push 1         SS STL
retr           TTT
-              TSST
push 1         SS STL
retr           TTT
push 0         SS SSL
retr           TTT
-              TSST
/              TSTS
dup            SLS
outn           TLST
push 10        SS STSTSL
outc           TLSS
push 0         SS SSL
retr           TTT
*              TSSL
push 1         SS STL
retr           TTT
swap           SLT
-              TSST
outn           TLST
exit           LLL

R, 50

x=scan(n=3);y=diff(x);z=y[2]/y[1];c(z,x[2]-x[1]*z)

I / O dipisahkan oleh ruang.


Burung hantu

--- 22 ---

< <%<-2`2`-/%.10)2'*-.

I / O dipisahkan oleh baris baru.

--- 19 --- (jika versi ini diperbolehkan; tapi saya rasa ini curang, karena \ adalah kode yang dapat dieksekusi):

1`-1`3`-/%.32)2'*-.

I / O dipisahkan oleh ruang. Penggunaan baris perintah: owl prog 5 19\ 77(\ bertindak sebagai minus unfix postfix dalam Owl).

res
sumber
Dengan entri Owl Anda, saya dapat menunda penilaian solusi 19 char Anda karena solusi 22 char Anda sudah memenangkan untuk bahasa.
PhiNotPi
5

J, 23 karakter

(],1{x-0{x*])%~/2-/\x=:

Pemakaian:

   (],1{x-0{x*])%~/2-/\x=: 5 _19 77
_4 1

Angka negatif diwakili oleh garis bawah pada J.

PHP, 88 karakter

<?php
list($x,$y,$z)=split(' ',fgets(STDIN));
$a=($z-$y)/($y-$x);
echo$a." ".($y-$a*$x);

Scala, 102 karakter

val x=readLine.split(" ").toList.map(_.toInt)
val a=(x(2)-x(1))/(x(1)-x(0))
print(a+" "+(x(1)-x(0)*a))

Perl, 57 karakter

s!(.+) (.+) (.+)!$a=($3-$2)/($2-$1);$a." ".($2-$1*$a)!e

Membutuhkan opsi '-p', yang telah saya tambahkan 2 karakter. Mengasumsikan bahwa input tersebut valid untuk menyimpan beberapa karakter.

Semua jawaban saya menggunakan angka yang dipisahkan oleh spasi.

Gareth
sumber
Tentang program J ... Apakah input diizinkan untuk dikodekan secara langsung dalam file sumber alih-alih meminta dari pengguna?
res
@res saya sudah memberikannya persis seperti yang saya lakukan pada baris perintah. Menambahkan 1!:1]3di sebelah kanan ekspresi akan membaca input dari STDIN. Saya pikir telah ada diskusi tentang meta atau dalam komentar untuk beberapa jawaban atas apakah ini harus diizinkan atau tidak. Saya agak ambivalen - Saya menikmati mencari tahu bagaimana mendapatkan J untuk melakukan apa yang saya inginkan di ruang terkecil, saya akan mengambil penalti 6 karakter untuk input dari STDIN jika itu yang semua orang inginkan.
Gareth
Saya berpikir bahwa jika diizinkan untuk J, maka beberapa entri lain mungkin dipersingkat dengan cara yang sama. (BTW, saya tidak bisa membuat ekspresi yang disarankan Anda berfungsi, tetapi (],1{x-0{x*])%~/2-/\x=:".1!:1]1tampaknya ok dalam mode konsol.)
res
@ res Oh yeah, saya lupa untuk mengubah dari string ke daftar nomor (meskipun 3 pada akhirnya biasanya ok untuk saya?)
Gareth
Jika Anda menjadikan Perl sebagai subroutine daripada program lengkap, Anda bisa menurunkannya menjadi 50 byte (dan tidak ada flag baris perintah yang diperlukan):($a=($_[1]-pop)/($_[0]-$_[1])).$/.($_[1]-$_[0]*$a)
msh210
4

PHP, 74,72 , 69

<?fscanf(STDIN,'%d%d%d',$a,$b,$c);echo($d=($c-$b)/($b-$a)).' '.($b-$d*$a);

Ketika input diteruskan sebagai argumen:

<?echo($d=($argv[3]-$argv[2])/($b=$argv[2]-$a=$argv[1])).' '.($b-$d*$a);

Sekarang, seperti yang disarankan @mellamokb, menggunakan $ n = $ argv:

<?$n=$argv;echo($d=($n[3]-$n[2])/($b=$n[2]-$a=$n[1])).' '.($b-$d*$a);

C, 77 , 78

main(a,b,c,d){printf("%d %d",d=(c-b)/(b-a),b-d*a,scanf("%d%d%d",&a,&b,&c));}

^ tidak berfungsi, inilah masalahnya: [terima kasih kepada @ugoren karena telah memberitahukannya]

main(a,b,c,d){printf("%d %d",d,b-a*(d=(c-b)/(b-a)),scanf("%d%d%d",&a,&b,&c));}
l0n3sh4rk
sumber
+1 Wow, tidak tahu Anda bisa fscanfdan scanftanpa spasi. Luar biasa!
mellamokb
1
Dalam solusi PHP kedua Anda, tidak bisakah Anda menyimpan beberapa karakter lagi dengan mengganti nama $argv, yaitu $n=$argvdi awal?
mellamokb
@ mellamokb- yeah! Saya tidak memikirkan itu! Terima kasih! :)
l0n3sh4rk
Kode C Anda tidak berfungsi (saya sudah mencoba Linux). Saya mengandalkan urutan evaluasi parameter yang sangat aneh - mengapa scanfharus dilakukan terlebih dahulu, d=..lalu b-d*a?
ugoren
1
Dari apa yang saya tahu, ini hanya "terjadi" secara sewenang-wenang untuk bekerja di sebagian besar lingkungan (mis: ideone.com/I2cPg ), tetapi urutan evaluasi parameter dalam C adalah perilaku yang tidak terdefinisi, dan secara teknis tidak dapat diandalkan: orangejuiceliberationfront .com / ...
mellamokb
3

VBA, 57 karakter

Sub x(a,b,c)
y=(c-b)/(b-a)
MsgBox y & " " & b-a*y
End Sub

( Ini pada dasarnya sama dengan fungsi 'BASIC' lainnya, tapi saya belum melihat kiriman VBA di sana. )

Gaffi
sumber
Anda dapat menjatuhkan 8 byte dengan mengubah baris 3 keDebug.?y;b-a*y
Taylor Scott
3

bash (42 karakter)

Pesta murni:

((m=($3-$2)/($2-$1),c=$2-m*$1));echo $m $c

bash (31 karakter)

Keluar ke sesuatu yang lain:

owl -p"<%<%<$-1`4'-/%.32)2'*-."

(Berdasarkan implementasi OWL Howard )

Peter Taylor
sumber
3

Ini adalah kode (tidak dioptimalkan) untuk mesin register yang belum di-unimited, dijelaskan di sini: http://www.proofwiki.org/wiki/Definition:Unlimited_Register_Machine

Input harus dalam register 1,2 dan 3, dan output akan di register 1, 2 setelah program selesai. Nomor non-negatif dan non-integer tidak ditangani, tetapi input 0,7,14 dan 2,5,11 ditangani dengan benar.

Zero[8] Trans[2,11] Jump[3,11,7] Succ[11] Succ[8] Jump[11,11,3] Zero[5] Trans[1,12] Jump[2,12,13] Succ[12] Succ[5] Jump[12,12,9] Zero[17] Trans[8,13] Jump[13,17,25] Zero[16] Trans[5,14] Jump[13,14,22] Succ[14] Succ[16] Jump[14,14,18] Succ[9] Trans[16,13] Jump[17,17,15] Zero[6] Zero[20] Jump[9,6,40] Zero[7] Trans[1,21] Jump[20,7,36] Succ[21] Trans[21,19] Trans[19,21] Succ[7] Jump[7,7,30] Trans[21,18] Trans[18,20] Succ[6] Jump[6,6,27] Trans[20,4] Zero[10] Trans[4,15] Jump[2,15,47] Succ[15] Succ[10] Jump[15,15,43] Trans[9,1] Trans[10,2]

Sunting: dengan menghapus tanda kurung, dan memperpendek nama instruksi:

URM 285

Z8 T2,11 J3,11,7 S11 S8 J11,11,3 Z5 T1,12 J2,12,13 S12 S5 J12,12,9 Z17 T8,13 J13,17,25 Z16 T5,14 J13,14,22 S14 S16 J14,14,18 S9 T16,13 J17,17,15 Z6 Z20 J9,6,40 Z7 T1,21 J20,7,36 S21 T21,19 T19,21 S7 J7,7,30 T21,18 T18,20 S6 J6,6,27 T20,4 Z10 T4,15 J2,15,47 S15 S10 J15,15,43 T9,1 T10,2

Per Alexandersson
sumber
(+1) Tapi ... "Nomor non-negatif dan non-integer tidak ditangani" ... Saya pikir Anda bermaksud mengatakan bahwa angka negatif tidak ditangani. (OP mengatakan semua input & output adalah bilangan bulat.)
res
Ah, tidak membaca bahwa output itu bilangan bulat ...
Per Alexandersson
Haruskah saya menghitung ini dengan jumlah karakter atau dengan jumlah instruksi?
PhiNotPi
Mungkin menghitung karakter dalam versi yang diedit ...
Per Alexandersson
3

DOS-BATCH, 98

@ECHO OFF&SET/P p=&SET/P q=&SET/P r=&SET/A m=(%r%-%q%)/(%q%-%p%)&SET/A n=%q%-%p%*%m%&ECHO %m% %n%

Input dalam baris terpisah

Bash, 51

m=$((($3 - $2)/($2 - $1)))
echo $m $(($2 - $m*$1))

Contoh: sh prog.sh 2 0 -4 (argumen yang dipisahkan spasi)

Perl, 84

@s=split(/ /,&lt;STDIN&gt;);$m=($s[2]-$s[1])/($s[1]-$s[0]);print $m." ".($s[1]-$s[0]*$m);

Jawa, 297

import java.util.*;public class A{public static void main(String a[]){StringTokenizer s=new StringTokenizer(new Scanner(System.in).nextLine());int i=4;int[] p=new int[i];while(i-->1)p[3-i]=Integer.parseInt(s.nextToken());p[3]=(p[2]-p[1])/(p[1]-p[0]);System.out.print(p[3]+" "+(p[1]-p[0]*p[3]));}}

Input yang dipisahkan ruang, output yang dipisahkan ruang.

SQL, 57

select (&3-&2)/(&2-&1),&2-((&3-&2)/(&2-&1)*&1) from dual

Ini adalah entri yang menyedihkan, tetapi 'hanya' menyelesaikan tujuannya. Permintaan mengikat input pada saat runtime 1,2,3 adalah variabel dalam urutan input.

Aman ZeeK Verma
sumber
Meskipun orang lain sudah mengalahkan bashsolusi Anda , saya hanya ingin menyarankan Anda bisa menghapus semua ruang ekstra dan menyimpan 6 karakter.
mellamokb
Terima kasih mellamokb, saya menyadari itu, saya hanya mengabaikannya nanti. Juga, saya membenci diri saya sendiri karena tidak memikirkan solusi dos / batch Anda, yang seharusnya diklik kepalaku..harg ahh!
Aman ZeeK Verma
2

T, 36

{a,x[2]-x[1]*a:%[x[2]-x 1;x[1]-x 0]}

pemakaian

q){a,x[2]-x[1]*a:%[x[2]-x 1;x[1]-x 0]}each(0 7 14;2 5 11;2 0 -4;5 -19 77)
1  7 
2  1 
2  -4
-4 1
tmartin
sumber
2

Fortran 44

read*,i,j,k;k=(k-j)/(j-i);print*,k,j-i*k;end

Input akan berada dalam satu baris (koma atau spasi terpisah)

Kapel Cray 59

var i,j,k:int;read(i,j,k);k=(k-j)/(j-i);write(k," ",j-i*k);

Input akan berada pada satu baris, tidak ada baris baru (tambahkan 2 karakter untuk itu dengan menggunakan writelnmenggantikanwrite ).

Golflua 44

r=I.r;a,b=r(),r();m=(r()-b)/(b-a);w(m,b-m*a)

Input batas baru, keluaran terbatas ruang

Kyle Kanos
sumber
2

Julia, 71 karakter

Input dan output yang dibatasi ruang.

i,j,k=int(split(readline(STDIN)));println("$(l=div(k-j,j-i)) $(j-i*l)")

Contoh input dan output:

julia> i,j,k=int(split(readline(STDIN)));println("$(l=div(k-j,j-i)) $(j-i*l)")
5 -19 77
-4 1

Piet, 86 60 56 codels (14x4), ukuran codel 10 untuk visibilitas yang lebih baik

Saya benar-benar bisa mengecilkan jumlah codels sebesar 35%. Saya tidak mengharapkan hasil yang baik. Mengkode program ini ke belakang, seperti yang saya harapkan, cukup berhasil. Saya ragu bisa lebih pendek dari ini, tetapi saya akan sangat tertarik jika ada yang bisa menemukan solusi yang lebih kecil.

Tantangannya tidak menyatakan apakah program harus berhenti setelah menunjukkan hasilnya, jadi program terkecil saya (56 codel) harus valid. Itu hanya loop kembali ke awal setelah menunjukkan hasilnya, meminta triplet bilangan bulat baru. Karena pengemasan yang ketat tidak ada tempat untuk output dari dua karakter baris baru, tetapi itu tidak masalah dengan npiet interpreter, karena selalu mencetak '?' jika menunggu input.

Ada dua ukuran yang mungkin untuk membangun versi berulang, tetapi versi yang berjalan hanya sekali hanya mungkin dalam program yang setidaknya 64 codels (16x4) besar. Versi di bawah ini menunjukkan alasannya. Mungkin juga menarik bagi mereka yang akrab dengan Piet.

Versi 56 codel terakhir, yang paling padat, dengan loop :

Temukan Aturan Untuk Kode Seri 56

Versi kedua (60 codel), dengan satu lingkaran

Temukan Aturan Untuk Kode Seri 60

Jika versi 56 codel melanggar aturan, di sini adalah versi 64 codel final, hanya berjalan sekali :

Temukan Aturan Untuk Seri 64, jalankan sekali

Versi pertama saya (86 codels)

Temukan Aturan Untuk Kode Seri 86

Input dan output dibatasi baris baru.

Contoh input dan output:

D:\codegolf\npiet-1.3a-win32>npiet ml_series.png
? 5
? -19
? 77
-4
1

Untuk versi yang diulang, tampak sedikit lebih buruk:

D:\codegolf\npiet-1.3a-win32>npiet ml_series_56_codels.png"
? 5
? -19
? 77
-4
1? 5
? -19
? 77
-4
1? 5
? -19
? 77
-4
1?

Saya memilih baris baru sebagai pembatas karena pengkodean ASCII 10 (\ n) jelas hanya membutuhkan 7 codels, dibandingkan dengan ASCII 32 () yang membutuhkan 8 codel atau bahkan ASCII 40 (,) yang membutuhkan 9 codel.

Pengodean mundur dari hasil ke input pertama adalah cara yang bagus untuk mengurangi penggunaan codel untuk operasi ROL. Urutan tumpukan di awal dan di akhir diketahui, sisanya mudah dilakukan dengan tangan.

Ini adalah versi teks dari program 64 codel (dengan stack), dalam tulisan singkat saya. Program yang lebih pendek tidak berhenti tetapi kembali ke awal.

NOP ADD DIV GRT DUP INC END
 0   +   /   >   =   c   ~
PSH SUB MOD PTR ROL OUN
 X   -   %   #   @   N
POP MUL NOT SWI INN OUC
 ?   *   !   $   n   C

                   1
        1    1   2 2     1                   a,b,c: input for series
      5 5  3 3 c c cb  3 3                       D: c-b
    b b bb b bbb b bcD D Da                      E: b-a
   bb b bb b baa a aaa a abE F                   F: D/E, (c-b)/(b-a), mul. const.
  bbb b ba a abb b bbb b bDDFFF    5             G: a*F, a(c-b)/(b-a)
 aaaa a aa a aaa a aaa a aaaaaaG  55 10          H: b-G, b-a*F, add. const.
aaaaa a ab b bbb b bbb b bbbbbbbH HH  H H
n=n==5X1X@3X1X@n2X1X@-3X1X@-/=N*-5X=  + CN~
| |            |     |     || |||\____/ ||
| |            |     |     || |||  |    |+———— output add. const.
| |            |     |     || |||  |    +————— output newline character
| |            |     |     || |||  +—————————— 5 DUP + =10, ASCII for \n
| |            |     |     || ||+————————————— H, add. const.
| |            |     |     || |+—————————————— G
| |            |     |     || +——————————————— output mul. const.
| |            |     |     |+————————————————— F, mul. const.
| |            |     |     +—————————————————— E
| |            |     +———————————————————————— D
| |            +—————————————————————————————— input c
| +——————————————————————————————————————————— input b
+————————————————————————————————————————————— input a
ML
sumber
1

MoonScript (48 karakter, input batas baru, keluaran terbatas ruang)

r=io.read
a,b=r!,r!
m=(r!-b)/(b-a)
print m,b-m*a

Felix (86 karakter, input terbatas baru, keluaran terbatas koma)

gen r()=>int $ readln stdin;
var a,b=r(),r();
var m=(r()-b)/(b- a);
println(m,b- m*a);

Julia (84 karakter, input batas ruang, keluaran batas ruang)

a,b,c=tuple(map(int,split(readline(STDIN)))...)
m=(c-b)/(b-a)
println("$m $(b-m*a)")
kirbyfan64sos
sumber
Solusi Julia Anda membuat kesalahan. GALAT: BoundsError () dalam indexed_next di tuple.jl: 19 (berulang 2 kali) saat memuat d: \ codegolf \ series.jl, dalam ekspresi yang dimulai pada baris 1
ML
@ ML Itu aneh. Mungkin ada sesuatu yang berubah di Julia versi terbaru. Saya akan mencobanya.
kirbyfan64sos
Jika saya mencobanya di konsol saya mendapatkan kesalahan segera setelah baris pertama. Entah bagaimana, baris membuat tuple, itu selalu (a, b, 0) Jika saya memasukkannya melalui file .jl maka ia menciptakan output, tetapi melempar kesalahan jika saya menekan enter untuk mendapatkan kembali Julia REPL. julia> include ("happy_birthday_codegolf.jl") 5 -19 77 -4 1 ERROR: BoundsError () dalam indexed_next di tuple.jl: 19 (berulang 2 kali) saat memuat d: \ codegolf \ series.jl, dalam ekspresi yang dimulai pada baris 1 Apakah ada cara untuk memasukkan jeda baris dalam komentar? Maaf atas kekacauan ini.
ML
@ ML Apakah memasukkannya ke dalam file dan menjalankannya julia file.jlmemberikan kesalahan yang sama?
kirbyfan64sos
Saya kira itu tidak dapat dibaca dalam kekacauan jawaban saya di atas. Ya, saya mencoba konsol dan memasukkannya melalui file .jl. "Jika saya memasukkannya melalui file .jl maka ia menciptakan output, tetapi melemparkan kesalahan jika saya menekan enter untuk mendapatkan kembali Julia REPL." Jika saya menjalankan contoh Anda melalui file .jl, maka program menunggu beberapa input sebelum julia> REPL / prompt kembali.
ML