m3ph1st0s programlama bulmaca 3 (C): “Kolay hata” [kapalı]


11

Bu benim C / C ++ bulmaca serisinin 3.; ilk 2 özledim durumunda onlar burada: (1) m3ph1st0s programlama bulmaca 1 (C ++) (2) m3ph1st0s programlama bulmaca 2 (C ++): "Sert ara!"

Bulmacalarımın% 100 orijinal olduğunu söylemeliyim. Değilse, metinde her zaman böyle söyleyeceğim. 3. bulmacamın 2 bölümü var:

Bulmaca 3.1

Bu bölüm (3.1) orijinal bir bulmaca değil, bir süre önce okuduğum bazı internet sayfalarından toplandı. Burada bir başlangıç ​​noktası ve sizin için bir ısınma olarak kullanıyorum. Bunu çözün ve sonra 2. bölüme geçin.

Bazıları "+" işaretini 20 kez yazdırmayı denedi ve aşağıdaki programı buldu:

#include <stdio.h>
int main() {
   int i;
   int n = 20;
   for( i = 0; i < n; i-- )
      printf("+");
   return 0;
}

Beklenen sonuca sahip olmadığı açıktır - program asla bitmez. Düzelt! Kolay? Şimdi programı SADECE BİR KARAKTER - tabii ki boşluk olmayan karakter değiştirerek düzeltin! Bu meydan okuma için 3 çözüm var. 3 tanesini bulun. Sadece açıklığa kavuşturmak için: program 20 "+" işareti çıkarmalı ve hızlı bitmelidir. Beni "hızlı" ne anlama geldiğini eleştirmeden önce, bunun en fazla birkaç saniye anlamına geldiğini söyleyeceğim (bu arada çok net ama sadece onu netleştirmek için).

Bulmaca 3.2

EDIT EDİLDİ Daha önce bana 3.2.2 bulmacasının çözümünün derleyiciye bağlı olabileceğine işaret etmiştim. Konuyla ilgili olası tartışmaları ortadan kaldırmak için, tartışmayı oluşturmamaya çok dikkat edeceğim zaman fikri değiştireceğim ve bir sonraki bulmacada geliştireceğim. Ancak, bu bulmacanın devam etmesini sağlamak için 3.2.2 için küçük bir değişiklik yapacağım (çözüm daha kolay ama daha temiz olacak).

Bulmacayı ilk gördüğümde oldukça harika buldum. Çözmeyi başardım ama biraz dikkat gerektirdiği için hemen değil. Eğer buradaysanız, çok çözdüğünüz anlamına gelir. Tüm olası karakterleri olası değerlerle değiştirmek ve her çözümü test etmek için bir program yazarak bunu yaparsanız, kaybolursunuz. Çalışkan adam olsa. Şimdi 20 "+" işareti yazan programı düzelttikten sonra:

3.2.1: Sonucu geçerli olacak ve düzeltilmiş 3 programın hepsinde aynı şeyi çıktı verecek şekilde koda tek bir harf ve başka bir şey eklemeyin. Söylemeye gerek yok, mektup ana eklenmesi} önce olmalıdır (çünkü ben programdan sonra sadece bir mektup koymak ve bir şekilde derleyici çok dostu olduğunu insanlar duymak istemiyorum çünkü).

DÜZENLENMİŞ (aşağıya bakınız) - Bu son sorular için i sayacının 0 yerine -1'den başladığını düşünün.

3.2.1.5: Çıktının en az 19 "+" işareti (ancak yine de sınırlı bir çıktı) olması koşuluyla önceki tüm sorunları tekrarlayın. Alanların değiştirilmesine izin verilir. Şimdi ilk durumdan daha fazla çözüm bulmuş olabilirsiniz. Bunlardan bazıları kesinlikle 3.2.2 sorusuna uyacaktır.

3.2.2: Sonuçta ortaya çıkan çıktının 3.2.1.5'teki en az bir düzeltilmiş program için aynı kalması için n değişkenini başlatmak üzere başka bir değer seçin (hepsi için değil).

SON DÜZENLEME1 : 21 "+" işareti çıkacak şekilde programın değiştirilmesi, orijinal metin "tam olarak" 20 işaretini söylemediği için hala iyi bir çözümdür. Ancak, sonsuz çıktı yasaktır. Açıkçası bu, yasak olmadığı için yüzlerce "+" işareti çıkarmaya başlayacağımız anlamına gelmez. Ancak güzel bir 21 çıktıyı ortadan kaldırmak bu yarışmanın ruhunda olmazdı.

SON DÜZENLEME2: SON DÜZENLEME1'i göz önünde bulundurarak ve yer değiştirmeyi kabul ettiğimizde, dört yanıtta zaten belirtilmiş olan 5 olası çözümümüz var gibi görünüyor. Ancak son zorluğa dokunulmadı ve bir kez daha açıklığa kavuşturmalıyım: n'ye başka bir değer atanmalıdır , bazı numaralarla n'i 20'ye atanan çözümler bunu yapmaz (n = 20L gibi). Ayrıca boşluk değiştirmeyen 3. çözümü görmeyi tercih ediyorum.

SON DÜZENLEME3 : Son soruları düzenledim, lütfen okuyun!

Zor, bulmacanın her iki parçasını da çözmek. Bunu ilk yapan kazanır.

Umarım her şey açıktır, eğer değilse lütfen herhangi bir soru gönderin ve mümkün olduğunca çabuk düzenleyeceğim. Şerefe. vurgulanan metin


Bir karakter değiştirme boşluk olmayan karakterler için herhangi bir boşluk değiştirme içerir varsayalım? Eğer öyleyse, bölüm 1 için 3 çözümün hepsini bulduğumu düşünüyorum
mellamokb

Ah ... üzgünüm ... Bunu açıkça inkar etmeyi düşündüm ama unuttum. Şimdi düzenleyeceğim. Sormak için teşekkürler.
Bogdan Alexandru

Oh iyi. Mevcut 3 çözümler için bölüm 3.2.2 için herhangi bir cevap bulamadım ... Sanırım bu bir tane daha aramak gerekir demek :)
mellamokb

evet :) bu konuda iyi şanslar
Bogdan Alexandru

1
@ardnew: OP'nin bir zamanlar sorunun orijinal amacını değiştirdiğine inanmıyorum. Soruyu düzeltmenin sonunda bir sürü Edit 'in dolmasından daha iyi yollar olduğuna katılıyorum ... ama hala aynı sorunun özünde, bazı şeyler açıklığa kavuştu.
mellamokb

Yanıtlar:


8

3.1

for( i = 0;-i < n; i-- )
for( i = 0; i < n; n-- )
for( i = 0; i + n; i-- )

Bu değişikliklerden herhangi biri program çıktısını 20 '+' işareti yapar. Bu yakın:

for( i = 0;~i < n; i-- )

21 '+' işareti çıkarır.

3.2.1

Bir harf ekleyerek bu sorunu çözmenin en az 112 yolunu buldum. Hepsi tüm derleyiciler üzerinde çalışmayabilir.

int n = 20L;
int n = 20f;
int n = 20d;
uint n = 20;

for( i = 0L; ... )
for( i = 0f; ... )
for( i = 0d; ... )

iprintf("+");
printf("+x");
printf("x+");

Son iki adımda, xsize 104 olası çözüm sunmak için herhangi bir harfi kullanın. Son iki satırdan herhangi birinin kullanılması çıktıyı değiştirir, ancak çıktı düzeltilen tüm 3 program için de aynı kalır.

3.2.2

Geldiğim tek şey, görevlendirildiğinde 20 numaraya geri dönen bazı şeyler int.

int n = 20L;
int n = 20.001;
int n = 20.999;
int n = 20 + 0x100000000L;

Evet, yaptığım cevapların aynısı sizde (daha önce yayınlamadım çünkü her şeyi yanıtlamadım). Bence 3.2.2'nin cevabı, ikimizden birinin bulamadığı üçüncü çözümde yatıyor (ve alanın değiştirilmesine izin vermeme kuralına uyuyor).
mellamokb

3.2.1, ben emin değilim fve diçin son ekler int(iyi türleri diçin herhangi bu konuda tipi), ancak kapalı bıraktım birkaç başkaları da vardır: int n = 20l, int n = 20U, ve int n = 20u. Ayrıca uintC veya C ++ standart tip tanımlayıcısı olduğuna inanmıyorum . Zaten bunlar için hangi derleyiciyi kullanıyorsunuz?
ardnew

Burada oldukça iyi bir iş yaptın, ama tamamlamadın! Her şeyden önce, ~ i çözümü hala iyi! Gereksinim, 20 "+" işaretinin çıktısını almaktı, böylece 21 hala iyi bir çözümdür (tek kötü çözüm sonsuz çıktıdır). Bu, şimdi 4 çözüm bulduğunuz anlamına gelir! Ve komik olan şey, hala bir tane daha var :) 3.2.2 hakkında, n değerini özellikle değiştirmek için gerekli olduğu için kötü, çünkü bunu yapmak için bazı hileler yapmak :) :)
Bogdan Alexandru

1
ve ayrıca, hem -i hem de ~ i çözümleri boşluk değiştiriyor, bu yüzden onları "kısmi" çözümler olarak değerlendireceğim. 3. tam çözüm, sınav metninde belirtildiği gibi boşluk olmayan bir karakteri değiştirmelidir
Bogdan Alexandru

1
sorunu anlamadın. Değişikliğin, karşılık gelen değiştirilmiş programla aynı çıktıyı üreteceğini söyledim. yani, düzeltilmiş C1, C2, C3 programlarına sahibim. karakter eklendikten sonra P1, P2, P3 var. gereklilik: P1, C1 ile aynı çıkışa sahiptir, P2, C2 ile aynı çıkışa sahiptir, P3, C3 ile aynı çıkışa sahiptir. Aynı çıktıya sahip P1, P2, P3 DEĞİLDİR
Bogdan Alexandru

2

3.1

Yine başka bir bulmaca. Ama normal çözümler sıkıcı, ya özel bir şey?

Birinci çözüm:

#include <stdio.h>
int main() {
   int i;
   int n = 20;
   for( i = 0; i < n; i++ )
      printf("+");
   return 0;
}

SADECE BİR KARAKTERİ değiştirmeye karar verdim, yani -. Başka karakter -değiştirilmedi.

İkinci çözüm:

#include <stdio.h>
int main() {
   int i=printf("++++++++++++++++++++");exit(0);
   int n = 20;
   for( i = 0; i < n; i-- )
      printf("+");
   return 0;
}

Bu tam olarak bir karakteri değiştirir - int iiçine noktalı virgül =printf("++++++++++++++++++++");exit(0);.

Üçüncü çözüm:

#include <stdix.h>
int main() {
   int i;
   int n = 20;
   for( i = 0; i < n; i-- )
      printf("+");
   return 0;
}

Bu stdix.hsistem başlığını yükler . Sistem ekleme yolunda, stdix.h adlı aşağıdaki dosyayı ekleyin. Aşağıdaki içeriği içermelidir.

static inline void printf(const char *string) {
    int i;
    for(i = 0; i < 20; i--)
        putchar('+');
    exit(0);
}

3.2

Şimdi bir harf ekleyin. Basit, yerine int main()koy int main(a). Bu standartlara göre geçerli değil ama kimin umurunda?



0

3.1

  1. Değişim i--içinn--
  2. i<n için -i<n
  3. (Diğer cevapları görmeden derleyici ile kontrol etmediğim için maalesef geçersiz cevap)

3.2.1

int n = 20 

için

uint n = 20

(Derleyiciye bağlı ...)

3.2.2

int n =-20L;

for(i = -1; i%n; i--)

olduğu gibi 19 + işaretlerini yazdırır int n = 20L;. Bununla birlikte, 3.2.1'e başka cevaplar görmeseydim bu soruya gelmezdim


0
#include <stdio.h>
int main() {
   int i;
   int n = 20;
   for( i = 0; i < n; i++  )
      printf("+");
        printf("\n");
   return 0;
}

1
Yanıtınıza program dilini ve karakter sayısını eklediğinizden emin olun.
Timtech

1
@Timtech neden karakter sayıyor? Bu kod golf değil
gurur haskeller

1
@Timtech ayrıca dili neden dahil etmeli? bu dile özgü bir zorluktur.
proud haskeller
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.